对爬虫的认识
网页的三大特性:
1.每个网页都有自己的网页来进行定位。
2.网页使用HTML来描述页面。
3.网页都使用HTTP/HTTPS协议来传输HTML数据。
爬虫的设计思路:
1.首先确定爬去网页url地址。
2.通过HTTP/HTTPS协议来获取对应的HTML页面。
3.提取HTML页面里用的数据。
a.如果是需要的数据就保存起来。
b.如果页面里有其他的url,那就继续执行第二步。
为什么选择python做爬虫?
PHP对多线程,异步支持不够好,并发能力差。
Java网络爬虫生态圈也很完善,是python爬虫最大的对手,但是Java语言本身很笨重,代码量大,
重构比较高,牵一发而动全身。
C/C++ 运行效率和性能很强,但是学习成本很高,代码成型慢。
python 语法优美,开发效率高,支持的模块多,相关的HTTP请求模块和HTML解析模块丰富,还有
强大的Scrapy-redis分布式策略,而且调用其他接口方便(胶水语言)。
HTTP请求的处理:
爬虫模块urllib,urllib2,requests
,获取服务器响应的文件。
解析服务器响应的内容
re,xpath,BeautifulSoup4(bs4),jsonpath,pyquery等。
使用某种描述性一样来给我们需要提取的数据定义一个匹配规则,符合这个规则的数据就会被匹配。
如何采集动态HTML,验证码的处理:
通用的动态页面采集:Selenium+PhantomJs(无界面模拟浏览器):模拟真实浏览器加载。
Tesseract:机器学习库,机器图像识别系统,可以处理简单的验证码,复杂的可以通过手动输入。
Scrapy框架:(Scrapy,Pyspider)
高定制性高性能(异步网络框架twisted),所以数据下载速度非常快,提供了数据存储,数据下载,
提取规则等组件。
分布式策略:依赖于scrapy-redis的存在
scrapy-redis, 在Scrapy基础上添加了一套以Redis数据库为核心的一套组件。
让Scrapy框架支持分布式功能,主要在Redis里请求指纹去重,请求分配,数据临时存储。
爬虫---反爬虫---反反爬虫:
其实爬虫做到最后,最头疼的不是复杂的页面,也不是晦涩的数据,而是网站另一边的反爬虫人员。
User-Agent,代理,验证码,动态数据加载,加密数据。
数据的价值是否值得去费劲做反爬虫。
机器成本+人力成本 > 数据价值,就不反了,一般做到封IP就结束了。
爬虫和反爬虫,最后一定是爬虫获胜。
因为只要真实用户可以浏览的网页数据,爬虫一定能爬下来。
通用爬虫 聚焦爬虫
通用爬虫:搜索引擎用的爬虫。
目标:就是尽可能的把互联网上所有的网页下载下来,放在本地服务器里形成备份,再对这些网页做相关
处理(提取关键字,去掉广告),最后提供一个用
抓取流程:
a.首先选取一部分url,把这些url放在待爬取的队列。
b.取出待爬取得url,然后解析DNS得到主机IP,再取IP对应服务器里下载HTML页面,保存到搜索服务器,
之后把这个爬过的url放入以爬取得队列。
c.分析这些网页内容,找出网页里其他得url连接,继续执行第二部,直到爬取结束。
搜索引擎如何获取一个新网站的url:
1.主动向搜索引擎提交网址:http://zhanzhang.baidu.com/
2.在其他网站里设置网站得链接。
3.搜索引擎会和DNS服务商进行合作,可以快速收录新得网站。
通用爬虫并不是万物皆可爬,需要遵守规则:遵守Robots协议,协议指明了通用爬虫可以爬取得权限。
robots.txt只是一个建以,并不是所有得爬虫都遵守,一般只有大型得搜索引擎爬虫遵守,个人就不管了。
在搜索引擎得排名:
1.PageRank值:根据网站得流量统计,流量越高,排名越靠前,越值钱。
2.竞价排名:谁给钱多,谁排名高。
缺点:只能提供和文本相关得内容(HTML,word,PDF)但是不能提供多媒体(图片,视频)和二进制文
件(程序,脚本)
搜索结果千篇一律,不能针对向得提供不同的搜索结果。
不能理解人类语义上的检索
DNS:就是把域名解析成IP的一种技术。
聚焦爬虫:爬虫程序员写的针对某内容爬虫。
解决了通用爬虫的缺点
面向主题爬虫,面向需求爬虫。
HTTP和HTTPS
HTTP协议:是一种发布和接收HTML页面的方法。
HTTPS简单的讲是HTTP的安全版,在HTTP下加入SSL层。
SSL(安全套接层)主要用于web的安全传输协议,在传输层对网络进行加密,保障Internet上传数据的安全。
HTTP: 的端口 80
HTTPS:的端口 443
HTTP工作原理:
网络爬取过程可以理解为,模拟浏览器操作的过程
浏览器的主要功能是向服务器发起请求,在浏览器窗口展示您选择的网络资源,HTTP是一套计算机网络进行
通信的规则
urllib2在python3中被改为urllib.request