学 Java 网络爬虫,须要哪些基础知识?

提及网络爬虫,你们想起的估计都是 Python ,诚然爬虫已是 Python 的代名词之一,相比 Java 来讲就要逊色很多。有很多人都不知道 Java 能够作网络爬虫,其实 Java 也能作网络爬虫并且还能作的很是好,在开源社区中有很多优秀的 Java 网络爬虫框架,例如 webmagic 。个人第一份正式工做就是使用 webmagic 编写数据采集程序,当时参与了一个舆情分析系统的开发,这里面涉及到了大量网站的新闻采集,咱们就使用了 webmagic 进行采集程序的编写,因为当时不知道其设计原理,使用起来仍是走了很多弯路,其实 webmagic 的设计借鉴了 Scrapy ,因此它也能像 Scrapy 同样强大,关于 webmagic 框架咱们将在后续展开详细的讨论。css

在后面的几年工做中,也参与了好几个爬虫项目,可是大多数都是使用 Python ,抛开语言不谈,爬虫也是有一套思想的。这些年写爬虫程序,对我我的的技术成长帮助很是大,由于在爬虫的过程当中,会遇到各类各样的问题,其实作网络爬虫仍是很是考验技术的,除了保证本身的采集程序可用以外,还会遇到被爬网站各类奇奇怪怪的问题,好比整个 HTML 页面有没一个 class 或者 id 属性,你要在这种页面提取表格数据,而且作到优雅的提取,这就是很是考验你的想象力以及技术啦。很是有幸在刚入行的时候就接触到了网络爬虫这一块,它加快了我对互联网的理解和认知,扩宽了个人视野。html

这几年来网络爬虫比较火,若是你想学习 Java 网络爬虫,我根据我本身的经验总结了一下,想入门学习 Java 网络爬虫须要知道的四点基础知识。java

一、有 “道德” 的爬虫

我为何会把这一点放在最前面呢?由于我以为这一点比较重要,什么叫有 “道德” 的爬虫呢?就是遵循被爬服务器的规则,不去影响被爬服务器的正常运行,不把被爬服务搞垮,这就是有 “道德” 的爬虫。web

常常有人讨论的一个问题就是爬虫合法吗?知乎一下你看到的将是这样的ajax


答案千千万,在这众多答案中,我我的比较赞同下面的这个回答chrome

爬虫做为一种计算机技术就决定了它的中立性,所以爬虫自己在法律上并不被禁止,可是利用爬虫技术获取数据这一行为是具备违法甚至是犯罪的风险的。所谓具体问题具体分析,正如水果刀自己在法律上并不被禁止使用,可是用来捅人,就不被法律所容忍了。浏览器

爬虫为不违法?取决于你作的事情为不违法,网络爬虫的本质是什么?网络爬虫的本质是用机器代替人工去访问页面。我查看公开的新闻确定不犯法,因此我去采集公开在互联网上的新闻也不犯法,就像各大搜索引擎网站同样,别的网站恨不得别搜索引擎的蜘蛛抓取到。另外一种偏偏相反的状况是去采集别人隐私的数据,你本身去查看别人的隐私信息这就是一种违法的行为,因此用程序去采集也是违法的,这就像答案中所说的水果刀自己不违法,可是用来捅人就违法啦。安全

要作到有 “道德” 的爬虫,Robots 协议是你必须须要了解的,下面是Robots 协议的百度百科服务器


在不少网站中会申明 Robots 协议告诉你哪些页面是能够抓取的,哪些页面是不能抓取的,固然 Robots 协议只是一种约定,就像公交车上的座位同样标明着老弱病残专座,你去坐了也不违法。微信

除了协议以外,咱们的采集行为上也须要克制,在 『数据安全管理办法(征求意见稿)』的第二章第十六条指出:

网络运营者采起自动化手段访问收集网站数据,不得妨碍网站正常运行;此类行为严重影响网站运行,如自动化访问收集流量超过网站日均流量三分之一,网站要求中止自动化访问收集时,应当中止。

这条规定指出了爬虫程序不得妨碍网站正常运行,若是你使用爬虫程序把网站搞垮了,真正的访问者就不能访问该网站了,这是一种很是不道德的行为。应该杜绝这种行为。

除了数据的采集,在数据的使用上一样须要注意,咱们即便在获得受权的状况下采集了我的信息数据,也千万不要去出卖我的数据,这个是法律特别指出禁止的,参见:

根据《最高人民法院 最高人民检察院关于办理侵犯公民我的信息刑事案件适用法律若干问题的解释》第五条规定,对“情节严重”的解释:

  • (1)非法获取、出售或者提供行踪轨迹信息、通讯内容、征信信息、财产信息五十条以上的;
  • (2)非法获取、出售或者提供住宿信息、通讯记录、健康生理信息、交易信息等其余可能影响人身、财产安全的公民我的信息五百条以上的;
  • (3)非法获取、出售或者提供第三项、第四项规定之外的公民我的信息五千条以上的便构成“侵犯公民我的信息罪”所要求的“情节严重”。
  • 此外,未经被收集者赞成,即便是将合法收集的公民我的信息向他人提供的,也属于刑法第二百五十三条之一规定的“提供公民我的信息”,可能构成犯罪。

二、学会分析 Http 请求

咱们每一次与服务端的交互都是经过 Http 协议,固然也有不是 Http 协议的,这个能不能采集我就不知道啦,没有采集过,因此咱们只谈论 Http 协议,在 Web 网页中分析 Http 协议仍是比较简单,咱们以百度检索一条新闻为例

咱们打开 F12 调试工具,点击 NetWork 查看版能查看到全部的请求,找到咱们地址栏中的连接,主连接通常存在 NetWork 最上面一条连接


在右边headers查看栏中,咱们可以看到此次请求所须要的参数,在这里咱们须要特别注意 Request Headers 和 Query String Parameters 这两个选项栏。

Request Headers 表示的是该次 Http 请求所须要的请求头的参数,有一些网站会根据请求头来屏蔽爬虫,因此里面的参数仍是须要了解一下的,请求头参数中大部分参数都是公用的, User-Agent 和 Cookie 这两个参数使用比较频繁, User-Agent 标识浏览器请求头,Cookie 存放的是用户登陆凭证。

Query String Parameters 表示该次 Http 请求的请求参数,对于post 请求来讲这个仍是很是重要的,由于在这里能够查看到请求参数,对咱们模拟登录等 Post 请求很是有用。

上面是网页版的 HTTP 请求的连接分析,若是须要采集 APP 里面的数据就须要借助模拟器了,由于 APP 里没有调试工具,因此只能借助模拟器,使用较多的模拟器工具备以下两种,有兴趣的能够执行研究。

  • fiddler
  • wireshark

三、学会 HTML 页面解析

咱们采集的页面都是 HTML 页面,咱们须要在 HTML 页面中获取咱们须要的信息,这里面就涉及到了 HTML 页面解析,也就是 DOM 节点解析,这一点是重中之重,若是你不会这一点就像魔术师没有道具同样,只能干瞪眼啦。例以下面这个 HTML 页面


咱们须要获取标题 “java user-agent 判断是否电脑访问” ,咱们先经过 F12 检查元素


标题所在的 span 标签我已经在图中框出来啦,咱们该如何解析这个节点信息呢?方法有千千万万,常用的选择器应该是 CSS 选择器 和 XPath ,若是你还不知道这两种选择器,能够点击下方连接学习了解一下:

CSS 选择器参考手册:https://www.w3school.com.cn/cssref/css_selectors.asp

XPath 教程:https://www.w3school.com.cn/xpath/xpath_syntax.asp

使用 CSS 选择器解析的写法为:#wgt-ask > h1 > span

使用 XPath 解析的写法为://span[@class="wgt-ask"]

这样就获取到了 span 的节点,值须要取出 text 就行了,对于 CSS 选择器 和 XPath 除了本身编写以外,咱们还能够借助浏览器来帮咱们完成,例如 chrome 浏览器


只须要选中对应的节点,右键找到 Copy ,它提供了几种获取该节点的解析方式,具体的入上图所示,Copy selector 对应的就是 Css 选择器,Copy XPath 对应的是 XPath,这个功能仍是很是有用的。

四、了解反爬虫策略

由于如今爬虫很是泛滥,不少网站都会有反爬虫机制,来过滤掉爬虫程序,以便保证网站的能够用,这也是很是有必要的手段,毕竟若是网站不能使用了,就没有利益可谈啦。反爬虫的手段很是多,咱们来看看几种常见的反爬虫手段。

基于 Headers 的反爬虫机制

这是一种比较常见的反爬虫机制,网站经过检查 Request Headers 中的 User-Agent 、Referer 参数,来判断该程序是否是爬虫程序。要绕过这种机制就比较简单,咱们只须要在网页中先查看该网站所须要的 User-Agent 、Referer 参数的值,而后在爬虫程序的 Request Headers 设置好这些参数就好啦。

基于用户行为的反爬虫机制

这也是一种常见的反爬虫机制,最经常使用的就是 IP 访问限制,一个 IP 在一段时间内只被容许访问多少次,若是超过这个频次的话就会被认为是爬虫程序,好比豆瓣电影就会经过 IP 限制。

对于这种机制的话,咱们能够经过设置代理 IP 来解决这个问题,咱们只须要从代理ip网站上获取一批代理ip,在请求的时候经过设置代理 IP 便可。

除了 IP 限制以外,还会有基于你每次的访问时间间隔,若是你每次访问的时间间隔都是固定的,也可能会被认为是爬虫程序。要绕过这个限制就是在请求的时候,时间间隔设置不同,比例此次休眠 1 分钟,下次 30 秒。

基于动态页面的反爬虫机制

有不少网站,咱们须要采集的数据是经过 Ajax 请求的或者经过 JavaScript生成的,对于这种网站是比较蛋疼的,绕过这种机制,咱们有两种办法,一种是借助辅助工具,例如 Selenium 等工具获取渲染完成的页面。第二种方式就是反向思惟法,咱们经过获取到请求数据的 AJAX 连接,直接访问该连接获取数据。

以上就是爬虫的一些基本知识,主要介绍了网络爬虫的使用工具和反爬虫策略,这些东西在后续对咱们的爬虫学习会有所帮助,因为这几年断断续续的写过几个爬虫项目,使用 Java 爬虫也是在前期,后期都是用 Python,最近忽然间对 Java 爬虫又感兴趣了,因此准备写一个爬虫系列博文,从新梳理一下 Java 网络爬虫,算是对 Java 爬虫的一个总结,若是能帮助到想利用 Java 作网络爬虫的小伙伴,那就更棒啦。Java 网络爬虫预计会有六篇文章的篇幅,从简单到复杂,一步一步深刻,内容涉及到了我这些年爬虫所遇到的全部问题。下面是模拟的六篇文章介绍。

一、网络爬虫,原来这么简单

这一篇是网络爬虫的入门,会使用 Jsoup 和 HttpClient 两种方式获取到页面,而后利用选择器解析获得数据。最后你会收获到爬虫就是一条 http 请求,就是这么简单。

二、网页采集遇到登陆问题,我该怎么办?

这一章节简单的聊一聊获取须要登陆的数据,以获取豆瓣我的信息为例,从手动设置 cookies 和模拟登录这两种方式简单的聊一聊这类问题。

三、网页采集遇到数据 Ajax 异步加载,我该怎么办?

这一章节简单的聊一聊异步数据的问题,以网易新闻为例,从利用 htmlunit 工具获取渲染完页面和反向思惟直接获取到 Ajax 请求链接获取数据两种方式,简单的聊一下这类问题的处理方式。

四、网页采集 IP 被封,我该怎么办?

IP 访问被限制这应该是常见的事情,以豆瓣电影为例,主要以设置代理IP为中心,简单的聊一聊 IP 被限制的解决办法,还会简单的聊一下如何搭建本身的ip代理服务。

五、网络采集性能太差,我该怎么办?

有时候对爬虫程序的性能有要求,这种单线程的方式可能就行不通了,咱们可能就须要多线程甚至是分布式的爬虫程序啦,因此这一篇主要聊一聊多线程爬虫以及分布式爬虫架构方案。

六、开源爬虫框架 webmagic 使用案例解析

之前用 webmagic 作过一次爬虫,可是那个时候我似懂非懂的,没有很好的理解 webmagic 框架,通过这几年的经历,我如今对这个框架有了全新的认识,因此想按照 webmagic 的规范搭建一个简单的 demo来体验 webmagic 的强大之处。

以上就是个人爬虫系列博文,用文字记录点点滴滴,记录我这个非专业的爬虫玩家那些年遇到的坑,若是你准备学习 Java 网络爬虫,不妨关注一波,我相信你会获得必定的收获,由于我会用心的写好每一篇文章。

最后

打个小广告,欢迎扫码关注微信公众号:「平头哥的技术博文」,一块儿进步吧。
平头哥的技术博文

相关文章
相关标签/搜索