现在从网络爬虫的五个方面开始讲起,即定义,背景,原理,工具,实战。
一:网络爬虫定义
参考:百度百科网络爬虫定义网络爬虫(又被称为网页蜘蛛,网络机器人,网页追逐者等),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,跟浏览器一样,是一个web客户端程序,如下图:
网络爬虫二:网络爬虫背景
计算机网络本质上是一种传播工具,方便人们更好的相互交流。计算机网络将原本世界上各个孤立的网络连接起来,由很多子网络进而形成一个非常大的网络,即万维网。在这个大的网络里,网页也将是成千上万,数不甚数(截止到 2007 年底,Internet 上网页数量超出 160 亿个),导致人们很难去找到所需要的信息,如何有效地提取并利用这些信息成为一个巨大的挑战。此时,搜索引擎也就出现了, 比如AltaVista,Yahoo!和Google,搜索引擎原理技术如下:
搜索引擎技术原理架构从上图可以看出,数据的源头是万维网,而采集器是spider,也就是我们今天讲的网络爬虫。
三:网络爬虫原理
由于网络爬虫是数据采集存储器,我们先来介绍网站的数据流向,这样让我们知道网络爬虫处于哪一个流程,如下图:
1.让我们先看数据和信息的定义(引用《白话大数据与机器学习》):
数据:承载了"信息"的符号(数字,字符,字母,图片,音频,视频等),才能被称为数据。
信息:是用来消除随机不确定性的证据或者凭证。至于信息的如何度量,可以参看信息论和概率统计相关学科。
2.完整的数据流图:
网路爬虫主要包含:媒体网络分析,网络采集,数据存储,其中媒体网络分析主要指人工对web站点或者app的网络协议进行定量分析,人工确定采集策略和步骤,这一步是网络爬虫最重要的,也是最难的;网络采集步骤主要是采集策略和步骤的算法代码实现,然后提取特征字段和一定程度的清洗转换,存入到相关库里(比如mysql,mongdb,redis,elasticsearch等);
数据建模与分析主要指机器学习算法模型,为了更好的建模,在这里一般会对原始数据根据模型的相关规则进行清洗转换;
数据可视化和决策,就是数据BI, 根据模型进行预测分析之后,产生相关领域的报表,发现一定的规律,从而接着为客户提供垂直领域的数据服务能力,最后客户觉得该数据服务有很大的指导价值,比如定向精准投放广告,为此客户付出一定量的金钱到达数据变现。这也是为什么有价值的数据就像石油一样,采集数据和石油开采本质是一样,谁掌握了价值大的数据,谁就是行业老大,否则巧妇难为无米之炊,云计算和AI都就像断了源头的水一样,没有活力!
三: 网路爬虫原理
网络爬虫的原理就是:
(1)我们开发的网络爬虫程序跟浏览器,app等一样,本质上都是一个web客户端;
(2)其中web客户端通过发送request的方式经过web网络中转到达web服务端,web把response通过web网络中转给web客户端,其中request是通过一定的协议格式封装成的数据包,其中常见的应用层协议有:http(s)/ftp等。
(3)我们开发的网络爬虫,本质就是模拟浏览器或者客户端,让程序的行为在服务器看起来更像人一样操作,就成功了;
(4)为了获取服务器的数据,我们的程序也要发送请求,这时候需要抓包程序(其实就是一个代理服务器),常见的http/https抓包程序:浏览器开发者工具(这里推荐chrome开发者工具);charles/fiddler/mitmproxy(命令行抓包工具,对接python脚本)等,我们要找到我们需要的网页数据对应哪个具体的请求。【注意】:如果客户端不是通过http(s)协议的话,而是ftp,或者更加底层协议的话,如tcp/udp等,我们就需要其他的抓包工具,比如wireshark其他工具进行抓包分析;
(5)我们开发的网络爬虫程序,可以从两个部分着手: 一般从图中的【2】着手,通过抓包构造Request的方式,这是最常见的,也是效率最快的一种方式,常常会辅助反编译app的手段; 另一种方式就是模拟,也是第一种方法解决不了的时候,即Request不容易构造,不容易还原,此时从第一步着手:比如,人操作浏览器/app的时候,进行各种点击下拉等操作,我们也可以通过相关库,进行动作流程制定,写出相关脚本,定时驱动浏览器或者app去跑,然后捕获特定请求的请求,通过插入的解析脚本解析得到数据即可,这种方式一般比较慢,采集的数据也会慢很多。
4.网络爬虫系统一般设计图:
简易爬虫系统单机网络爬虫系统详细设计图分布式网路爬虫系统scrapy框架组件设计核心组件:
1.调度组件:比如select模块或者Scheduler模块,组要是队列的设置,优先级如何考虑,谁先抓,谁后抓,以及url去重的考虑;
2.下载组件:比如上面的crawl模块或者downloader模块,此处关键是构造requests,设置请求头部,设置代理ip,设置cookie,构造好参数之间的关系,设置下载频率,控制并发数等;
3.解析组件:上面的Extract模块或者spider模块,主要首先定义好要提取的字段特征,根据相应结果的字段位置提取,常见方法是css选择器,xpath, jmepath, 正则表达式等;
4.存储组件:如上面的cache模块,pages模块等,将第3步提取的item或者特征,进行一定的转换存储到相关库中。
5.engine组件或者distribute组件,主要是协调上面各个组件相互协作,统一安排,分布式的核心是,把带抓取的url库存放到一个统一的库进行维护,或者放到消息队里,这样是为了去重和优先级调度。
四:网络爬虫工具
这里主要针对python相关开发,其他语言不是太熟悉,所以不作介绍,理论上每种语言都可以用来开发网络爬虫程序,只不过是每种语言的开发效率和性能不一样而已:
1.抓包工具[大多是一个代理web服务,监听相应端口,截取相关协议请求]: pc端:chrome开发者工具,charles工具,wiresharks,其他浏览器开发者工具等;
移动端:charles, fiddler, mitmproxy, anyproxy等,后面两个是命令行工具,方便对接程序脚本;
2.网络请求库:
同步请求库:requests, urllib等;
异步请求库:aiohttp, asyncio等;
3. 自动化测试工具,主要用来模拟,一般需要搭配特定的驱动库:
pc端:selenium, chromedriver, chrome-headless, phantomjs, casperjs等;
移动端:appnium等
4.解析库:
lxml; Beatifulsoup; pquery; jmepath; Selector等
5.数据存储库:
mysql/pymysql; mongodb/pymongo; redis/redis-py; elasticsearch等
6.爬虫框架库:
pyspider/scrapy(twisted)/scrapy-splash/scrapy-redis等
7.javascript代码执行库:
selenium, splash, js2py, jsbeautifier,nodejs等
8.爬虫部署库:
scrapyd/scrapyd-client/scrapyrt/docker/shell等
9.多进程与线程:
multiprocessing /threading等
五:网络爬虫实战:
一般要了解网络爬虫建议从头写起,不要一开始使用框架,这样可以熟悉整个具体流程:从网络请求,网络下载,内容解析,内容清洗和内容存储,网络教程很多,这里就不介绍很多了。
PS:网络爬虫系统往往最难的几点,在于性能优化和实时抓取以及覆盖率,其次还有调度设计,爬取效率,去重,入库效率,以及代理池和cookie池等的设计,而爬虫系统抓取的数据往往也是互联网数据的一滴水,微弱的忽略不计,本质就是一个采样的思想,也就是互联网数据的一个样本,只有数据量达到一定的时候,才具有一定的可信度,否则得出的结论就是井底之蛙一样以偏概全。最后提醒一点的是,你的爬虫请求会占用网络服务提供方服务器的资源,尽量控制好你的频率和请求并发连接数,尽量根据对方的Robot.txt和sitemap文件,进行文明道德抓取,否则有可能引起对方的诉讼!