书海网短评:
适读人群:本书适用于对开发信息采集软件感兴趣的自学者。也可以供有Java或程序设计基础的开发人员参考。★相比用Python写网络爬虫,Java更有后发优势★运行在服务器端的网络爬虫,更应该用Java开发
★相比用Python写网络爬虫,Java更有后发优势
★运行在服务器端的网络爬虫,更应该用Java开发
★《网络爬虫全解析――技术、原理与实践》结合作者多年网络爬虫开发经验
★全面系统讲解了网络爬虫相关技术并以Java实现
★通俗易懂、代码清晰、案例丰富实用
★一《网络爬虫全解析――技术、原理与实践》全面掌握网络爬虫开发
《网络爬虫全解析――技术、原理与实践》介绍了如何开发网络爬虫。内容主要包括开发网络爬虫所需要的Java语法基础和网络爬虫的工作原理,如何使用开源组件HttpClient和爬虫框架Crawler4j抓取网页信息,以及针对抓取到的文本进行有效信息的提取。为了扩展抓取能力,《网络爬虫全解析――技术、原理与实践》介绍了实现分布式网络爬虫的关键技术。
《网络爬虫全解析――技术、原理与实践》介绍了如何开发网络爬虫。内容主要包括开发网络爬虫所需要的Java语法基础和网络爬虫的工作原理,如何使用开源组件HttpClient和爬虫框架Crawler4j抓取网页信息,以及针对抓另外,《网络爬虫全解析――技术、原理与实践》介绍了从图像和语音等多媒体格式文件中提取文本信息,以及如何使用大数据技术存储抓取到的信息。
最后,以实战为例,介绍了如何抓取微信和微博,以及在电商、医药、金融等领域的案例应用。其中,电商领域的应用介绍了使用网络爬虫抓取商品信息入库到网上商店的数据库表。医药领域的案例介绍了抓取PubMed医药论文库。金融领域的案例介绍了抓取股票信息,以及从年报PDF文档中提取表格等。《网络爬虫全解析――技术、原理与实践》适用于对开发信息采集软件感兴趣的自学者。也可以供有Java或程序设计基础的开发人员参考。
★罗刚,猎兔搜索创始人,带领猎兔搜索技术开发团队先后开发出猎兔中文分词系统、猎兔信息提取系统、猎兔智能垂直搜索系统以及网络信息监测系统等,实现互联网信息的采集、过滤、搜索和实时监测。曾编写出版《自己动手写搜索引擎》、《自己动手写网络爬虫》、《使用C#开发搜索引擎》,获得广泛好评。在北京和上海等地均有猎兔培训的学员。
第1章技术基础1
1.1第一个程序1
1.2准备开发环境2
1.2.1JDK2
1.2.2Eclipse3
1.3类和对象4
1.4常量5
1.5命名规范6
1.6基本语法6
1.7条件判断7
1.8循环8
1.9数组9
1.10位运算11
1.11枚举类型13
1.12比较器14
1.13方法14
1.14集合类15
1.14.1动态数组15
1.14.2散列表15
1.15文件19
1.15.1文本文件19
1.15.2二进制文件23
1.16多线程27
1.16.1基本的多线程28
1.16.2线程池30
1.17折半查找31
1.18处理图片34
1.19本章小结35
第2章网络爬虫入门36
2.1获取信息36
2.1.1提取链接37
2.1.2采集新闻37
2.2各种网络爬虫38
2.2.1信息采集器40
2.2.2广度优先遍历41
2.2.3分布式爬虫42
2.3爬虫相关协议43
2.3.1网站地图44
2.3.2Robots协议45
2.4爬虫架构48
2.4.1基本架构48
2.4.2分布式爬虫架构51
2.4.3垂直爬虫架构54
2.5自己写网络爬虫55
2.6URL地址查新57
2.6.1嵌入式数据库58
2.6.2布隆过滤器60
2.6.3实现布隆过滤器61
2.7部署爬虫63
2.7.1部署到Windows64
2.7.2部署到Linux64
2.8本章小结65
第3章定向采集69
3.1下载网页的基本方法69
3.1.1网卡70
3.1.2下载网页70
3.2HTTP基础75
3.2.1协议75
3.2.2URI77
3.2.3DNS84
3.3使用HttpClient下载网页84
3.3.1HttpCore94
3.3.2状态码98
3.3.3创建99
3.3.4模拟浏览器99
3.3.5重试100
3.3.6抓取压缩的网页102
3.3.7HttpContext104
3.3.8下载中文网站105
3.3.9抓取需要登录的网页106
3.3.10代理111
3.3.11DNS缓存112
3.3.12并行下载113
3.4下载网络资源115
3.4.1重定向115
3.4.2解决套接字连接限制118
3.4.3下载图片119
3.4.4抓取视频122
3.4.5抓取FTP122
3.4.6网页更新122
3.4.7抓取限制应对方法126
3.4.8URL地址提取131
3.4.9解析URL地址134
3.4.10归一化135
3.4.11增量采集135
3.4.12iframe136
3.4.13抓取JavaScript动态页面137
3.4.14抓取即时信息141
3.4.15抓取暗网141
3.5PhantomJS144
3.6Selenium145
3.7信息过滤146
3.7.1匹配算法147
3.7.2分布式过滤153
3.8采集新闻153
3.8.1网页过滤器154
3.8.2列表页159
3.8.3用机器学习的方法抓取新闻160
3.8.4自动查找目录页161
3.8.5详细页162
3.8.6增量采集164
3.8.7处理图片164
3.9遍历信息164
3.10并行抓取165
3.10.1多线程爬虫165
3.10.2垂直搜索的多线程爬虫168
3.10.3异步IO172
3.11分布式爬虫176
3.11.1JGroups176
3.11.2监控179
3.12增量抓取180
3.13管理界面180
3.14本章小结181
第4章数据存储182
4.1存储提取内容182
4.1.1SQLite183
4.1.2Access数据库185
4.1.3MySQL186
4.1.4写入维基187
4.2HBase187
4.3Web图189
4.4本章小结193
第5章信息提取194
5.1从文本提取信息194
5.2从HTML文件中提取文本195
5.2.1字符集编码195
5.2.2识别网页的编码198
5.2.3网页编码转换为字符串编码201
5.2.4使用正则表达式提取数据202
5.2.5结构化信息提取206
5.2.6表格209
5.2.7网页的DOM结构210
5.2.8使用Jsoup提取信息211
5.2.9使用XPath提取信息217
5.2.10HTMLUnit提取数据219
5.2.11网页结构相似度计算220
5.2.12提取标题222
5.2.13提取日期224
5.2.14提取模板225
5.2.15提取RDF信息227
5.2.16网页解析器原理227
5.3RSS229
5.3.1Jsoup解析RSS230
5.3.2ROME231
5.3.3抓取流程231
5.4网页去噪233
5.4.1NekoHTML234
5.4.2Jsoup238
5.4.3提取正文240
5.5从非HTML文件中提取文本241
5.5.1PDF文件242
5.5.2Word文件245
5.5.3Rtf文件247
5.5.4Excel文件253
5.5.5PowerPoint文件254
5.6提取标题254
5.6.1提取标题的一般方法255
5.6.2从PDF文件中提取标题259
5.6.3从Word文件中提取标题261
5.6.4从Rtf文件中提取标题261
5.6.5从Excel文件中提取标题267
5.6.6从PowerPoint文件中提取标题270
5.7图像的OCR识别270
5.7.1读入图像271
5.7.2准备训练集272
5.7.3图像二值化274
5.7.4切分图像279
5.7.5SVM分类283
5.7.6识别汉字287
5.7.7训练OCR289
5.7.8检测行290
5.7.9识别验证码291
5.7.10JavaOCR292
5.8提取地域信息292
5.8.1IP地址293
5.8.2手机315
5.9提取新闻316
5.10流媒体内容提取317
5.10.1音频流内容提取317
5.10.2视频流内容提取321
5.11内容纠错322
5.11.1模糊匹配问题325
5.11.2英文拼写检查331
5.11.3中文拼写检查333
5.12术语336
5.13本章小结336
第6章Crawler4j338
6.1使用Crawler4j338
6.1.1大众点评339
6.1.2日志342
6.2crawler4j原理342
6.2.1代码分析343
6.2.2使用BerkeleyDB344
6.2.3缩短URL地址347
6.2.4网页编码349
6.2.5并发349
6.3本章小结352
第7章网页排重353
7.1语义指纹354
7.2SimHash357
7.3分布式文档排重367
7.4本章小结369
第8章网页分类370
8.1关键词加权法371
8.2机器学习的分类方法378
8.2.1特征提取380
8.2.2朴素贝叶斯384
8.2.3支持向量机393
8.2.4多级分类401
8.2.5网页分类403
8.3本章小结403
第9章案例分析404
9.1金融爬虫404
9.1.1中国能源政策数据404
9.1.2世界原油现货交易和期货交易数据405
9.1.3股票数据405
9.1.4从PDF文件中提取表格408
9.2商品搜索408
9.2.1遍历商品410
9.2.2使用HttpClient415
9.2.3提取价格416
9.2.4水印419
9.2.5数据导入ECShop420
9.2.6采集淘宝423
9.3自动化行业采集424
9.4社会化信息采集424
9.5微博爬虫424
9.6微信爬虫426
9.7海关数据426
9.8医药数据427
9.9本章小结429
后记430
2.3爬虫相关协议
相比于人,爬虫有更快的检索速度和更深的层次,所以爬虫可能使一个站点瘫痪。
抓取网站时,为了不影响用户正常访问该网站。爬虫需要有礼貌。例如,它不会不告而访,它会在自己的“useragent”中声称:“我是某某搜索引擎的爬虫。”
有些网站希望爬虫避免在白天对其网页进行抓取,从而不影响白天正常的对外公众服务,DNS服务提供商也不希望大量的域名解析工作量被搜索爬虫的域名请求所占用。为了避免抓取的网站响应请求的负担过重,爬虫需要遵循礼貌性原则,不要同时发起过多的下载网页请求,这样才可能有更多的网站对爬虫友好。为了减少网站对爬虫的抱怨,建议每秒只抓取几次,把抓取任务尽量平均分配到每个时间段,并且避免高峰时段对访问的网站负担过重。
2.3.1网站地图
为了方便爬虫遍历和更新网站内容,网站可以设置Sitemap.xml。Sitemap.xml也就是网站地图,不过这个网站地图是用XML写的。例如,http://www.10010.com/Sitemap.xml。
在网站地图中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度等),以便搜索引擎抓取网站。
完整格式如下所示。
XML标签的含义说明如下。
lLoc:页面永久链接地址。
lLastmod:页面最后修改时间。
lChangefreq:页面内容更新频率。
lPriority:相对于其他页面的优先权。
2.3.2Robots协议
作为一个爬虫程序,在网上应该遵守爬虫的“道德”。何谓爬虫的“道德”?因为爬虫会访问网站,并下载其中的资源。尤其是多线程爬虫,可能会在访问一个网站的时候开启多个线程,然后使用很多Session进行连接,爬取网页,很容易造成网站瘫痪、不能访问等后果。还有一种情况是网站有很多东西属于自己的“秘密”,本身就不想让爬虫抓取,如果爬虫随意抓取,就相当于侵犯网站的“隐私”。
为了避免这种情况的发生,互联网行业采用了两种办法,第一种是在网站的根目录下放置一个文件,起名为robots.txt,其中规定了哪些内容不想被抓取;另一种是设置RobotsMeta标签。
robots.txt文件必须放置在站点的根目录下,而且文件名必须小写。该文件包含一条或更多的记录,这些记录用空行分开(以CR、CR/NL或者NL作为结束符),在该文件中可以用#进行注解,具体使用方法和UNIX中的惯例一样。该文件中的记录通常以一行或多行User-agent开始,后面加上若干Disallow行,详细情况如下。
lUser-agent:该项的值用于描述搜索引擎robots的名字。在robots.txt文件中,如果有多条User-agent记录,说明有多个robots会受到该协议的限制,对该文件来说,至少要有一条User-agent记录。如果User-agent的值设为*,则该协议对任何机器人均有效,在robots.txt文件中,“User-agent:*”这样的记录只能有一条。
lDisallow:该项的值用于描述不希望被访问到的URL,这个URL可以是一条完整的路径,也可以是部分路径,任何以Disallow开头的URL均不会被robots访问到。
任何一条Disallow记录为空,说明该网站的所有部分都允许被访问,在robots.txt文件中,至少要有一条Disallow记录。如果robots.txt是一个空文件,则该网站对于所有的搜索引擎Robots,都是开放的。一个robots.txt的例子如下所示。
以上例子表明这个网站的Robots协议对每个爬虫都适用,并且不允许爬取/cgi-bin/、/tmp/和/private/下的文件。
当一个爬虫访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,爬虫就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的爬虫将能够访问网站上所有没有被口令保护的页面。
在HttpClient包中,当执行get或者post方法时,会默认提供对robots.txt的支持,不抓取Disallow规定的目录下的网页。当然,HttpClient也设置了默认选项,可以让编写的爬虫不受robots.txt协议的限制,但是,作为一个网络爬虫作者,我们还是提倡有“道德”的抓取,以保障互联网行业健康发展。
现在我们讨论第二种方法,即通过设置RobotsMeta的值来限制爬虫的访问。这种方法是一种细粒度的方法,能够把限制细化到每个网页。和其他的Meta标签(如使用的语言、页面的描述、关键词等)一样,RobotsMeta标签也放在页面的<head></head>中,专门用来告诉搜索引擎Robots如何抓取该页的内容。
RobotsMeta标签中没有大小写之分,name=“Robots”表示所有的搜索引擎,可以针对某个具体搜索引擎写为name=“BaiduSpider”。Content部分有4个指令选项:INDEX、NOINDEX、FOLLOW和NOFOLLOW,指令间以“,”分隔。
前 言
现代社会,有效信息对人来说就像氧气一样不可或缺。互联网让有效信息的收集工作变得更容易。当你在网上冲浪时,网络爬虫也在网络中穿梭,自动收集互联网上有用的信息。
自动收集和筛选信息的网络爬虫让有效信息的流动性增强,让我们更加高效地获取信息。随着越来越多的信息显现于网络,网络爬虫也越来越有用。
各行业都离不开对信息的采集和加工处理。例如,农业需要抓取气象数据、农产品行情数据等实现精准农业。机械行业需要抓取零件、图纸信息作为设计参考。医药行业需要抓取一些疾病的治疗方法信息。金融行业需要抓取上市公司基本面和技术面等相关信息作为股市涨跌的参考,例如,太钢生产出圆珠笔头,导致它的股票“太钢不锈”上涨。此外,金融行业也需要抓取股民对市场的参与度,作为市场大势判断的依据。
每个人都可以用网络爬虫技术获得更好的生存策略,避免一些糟糕的情况出现,让自己生活得更加幸福和快乐。例如,网络爬虫可以收集到二甲双胍等可能抗衰老的药物,从而让人生活得更加健康。
《网络爬虫全解析――技术、原理与实践》的很多内容来源于搜索引擎、自然语言处理、金融等领域的项目开发和教学实践。感谢开源软件的开发者们,他们无私的工作丰富了《网络爬虫全解析――技术、原理与实践》的内容。
《网络爬虫全解析――技术、原理与实践》从开发网络爬虫所需要的Java语法开始讲解,然后介绍基本的爬虫原理。通过介绍优先级队列、宽度优先搜索等内容,引领读者入门,之后根据当前风起云涌的云计算热潮,重点讲述了云计算的相关内容及其在爬虫中的应用,以及信息抽取、链接分析等内容。接下来介绍了有关爬虫的Web数据挖掘等内容。为了让读者更深入地了解爬虫的实际应用,最后一章是案例分析。《网络爬虫全解析――技术、原理与实践》相关的代码在读者QQ群(294737705)的共享文件中可以找到。
《网络爬虫全解析――技术、原理与实践》适合需要具体实现网络爬虫的程序员使用,对于信息检索等相关领域的研究人员也有一定的参考价值,同时猎兔搜索技术团队已经开发出以《网络爬虫全解析――技术、原理与实践》为基础的专门培训课程和商业软件。目前的一些网络爬虫软件仍有很多功能有待完善,作者真诚地希望通过《网络爬虫全解析――技术、原理与实践》把读者带入网络爬虫开发的大门并认识更多的朋友。
感谢早期合著者、合作伙伴、员工、学员、家人的支持,他们给我们提供了良好的工作基础,这是一个持久可用的工作基础。在将来,希望我们的网络爬虫代码和技术能够像植物一样快速生长。
参与《网络爬虫全解析――技术、原理与实践》编写的还有崔智杰、石天盈、张继红、张进威、刘宇、何淑琴、任通通、高丹丹、徐友峰、孙宽,在此一并表示感谢。
罗刚
2017年2月









