说起网络爬虫,想必大家都会想到Python。诚然,爬虫已经是Python的代名词之一,比Java差很多。很多人不知道Java可以作为网络爬虫。其实Java也可以用来做网络爬虫,而且可以做得很好。开源社区中有很多优秀的Java网络爬虫框架,比如webmagic。我的第一份正式工作是使用webmagic编写一个数据采集程序。当时参与了一个舆情分析系统的开发,涉及到大量的网站新闻采集。我们使用webmagic来编写采集程序。它的设计原理在使用中还是走了很多弯路。其实webmagic的设计是借鉴了Scrapy,所以可以和Scrapy一样强大。稍后我们将详细讨论webmagic框架。在之后几年的工作中,我也参与了几个爬虫项目,但大多使用的是Python。不管是什么语言,爬虫也有一套思路。这些年写爬虫程序对我个人的技术成长很有帮助,因为在爬虫的过程中,会遇到各种各样的问题。其实做网络爬虫还是比较考验技术的。除了保证我的采集程序可用之外,你还会在爬取的网站上遇到各种奇怪的问题,比如整个HTML页面是否有class或者id属性。您需要提取此页面上的表单数据并优雅地进行。这是非常考验你的想象力和技巧的。很幸运在刚入行的时候接触过网络爬虫。它加速了我对互联网的了解和认识,开阔了我的视野。在过去的几年里,网络爬虫变得相当流行。如果你想学习Java网络爬虫,我根据自己的经验总结了下。如果你想入门学习Java网络爬虫,你需要了解四个基础知识。1.为什么我把这个放在“道德”爬虫的顶部?因为我觉得这个更重要。什么是“道德”爬虫?意思是遵循被爬取服务器的规则,不影响被爬取的服务器。爬取服务器的正常运行,又不让被爬取的服务宕机,这才是有“德”的爬虫。经常讨论的问题之一是爬虫是否合法?要知道您会看到成千上万个这样的答案。在这么多回答中,我个人比较认同下面的回答。爬虫作为一种计算机技术,其确定性是中立的,因此爬虫本身并不受法律禁止,但利用爬虫技术获取数据的行为存在违法甚至犯罪的风险。所谓具体问题具体分析,就像水果刀的使用本身不为法律所禁止,但如果用于刺人,则为法律所不容。爬行违法吗?这取决于你的行为是否违法。网络爬虫的本质是什么?网络爬虫的本质是用机器代替人来访问页面。我查看公共新闻绝对不违法,所以我收集互联网上公开的新闻也不违法。就像各大搜索引擎网站一样,其他网站也渴望被搜索引擎蜘蛛抓取。另一种情况正好相反,就是收集别人的隐私数据。自己查别人的隐私信息是违法的,所以用程序收集也是违法的。这就像答案中提到的水果刀。它本身不违法,但用它来刺人是违法的。要成为一个“有道德”的爬虫,你必须了解Robots协议。以下是Robots协议的百度百科。许多网站会声明Robots协议会告诉您哪些页面可以被抓取,哪些页面不能被抓取。是的,当然,Robots协议只是一种协议,就像公交车上的座位上标明了老弱病残专用座位,你坐在那里不违法。除了约定之外,我们还需要对采集行为进行克制。《数据安全管理办法(征求意见稿)》第二章第十六条规定:网络运营者采用自动化手段访问、收集网站数据,不得妨碍网站正常运行;此类行为严重影响网站的运行。自动访问采集流量超过网站日均流量三分之一的,网站要求停止采集自动访问时,应当停止。该规则规定爬虫不得妨碍网站的正常运行。如果您使用爬虫来降低网站,真正的访问者将无法访问该网站。这是一种非常不道德的行为。应该避免这种行为。除了数据收集,我们还需要关注数据的使用。即使我们在获得授权的情况下收集个人信息和数据,也不得出售个人数据。这是法律明确禁止的。参见:根据《最高人民法院 最高人民检察院关于办理侵犯公民个人信息刑事案件适用法律若干问题的解释》第五条规定,对“情节严重”的解释:(一)非法获取、出售或者提供行踪信息、通讯内容、信用信息、财产信息50项以上的;(二)非法获取、出售或者提供公民的住宿信息、通讯记录、健康生理信息、交易信息等可能影响人身和财产安全的个人信息;5000多条公民个人信息构成“侵犯公民个人信息罪”所要求的“情节严重”。此外,未经被收集人同意,即使将依法收集的公民个人信息提供给他人,也属于刑法第253条之一规定的“提供公民个人信息”,可能构成犯罪。2.学会分析Http请求。与服务器的每次交互都是通过Http协议进行的。当然也有非Http协议的。不知道这个能不能收藏。没有收集到,所以只说Http协议。国内的Http协议分析起来还是比较简单的。我们以百度的一条新闻为例。我们打开F12调试工具,点击NetWork查看版本查看所有的请求,在我们的地址栏找到链接。主链接一般存在于NetWork的顶级链接中。在右侧的headers查看栏中,我们可以看到本次请求需要的参数。这里需要特别注意RequestHeaders和QueryStringParameters这两个选项列。RequestHeaders表示Http请求所需要的请求头参数。有些网站会根据请求头来屏蔽爬虫,所以里面的参数需要了解一下。请求标头中的大部分参数都是公开的。User-Agent和Cookie这两个参数是经常用到的。User-Agent标识浏览器请求头,Cookie存储用户登录凭据。QueryStringParameters表示本次Http请求的请求参数。这一点对于post请求非常重要,因为这里可以查看请求参数,这对于我们模拟登录等post请求非常有用。以上是网页版HTTP请求的链接分析。如果需要采集APP中的数据,则需要使用模拟器。因为APP里面没有调试工具,所以只能用模拟器。使用较多的模拟器工具有:,有兴趣的可以研究一下。fiddlerwireshark3,学习HTML页面分析我们收集的页面都是HTML页面,我们需要在HTML页面中获取我们需要的信息,这就涉及到HTML页面分析,也就是DOM节点分析,这是最重要的,如果你不知道这个,就像没有道具的魔术师,只能发呆。例如,在下面的HTML页面中,我们需要获取标题“javauser-agent判断是否被计算机访问”。我们先通过F12查看元素title所在的span标签。我已经在图中框起来了。我们如何分析这个节点信息呢?Method有好几万种,常用的选择器应该是CSS选择器和XPath。如果你不知道这两个选择器,可以点击下面的链接了解一下:CSS选择器参考手册:https://www.w3school.com.cn/cssref/css_selectors.aspXPath教程:https://www.w3school.com.cn/xpath/xpath_syntax.asp使用CSS选择器解析写法:#wgt-ask>h1>span使用XPath解析写法方法是://span[@class="wgt-ask"]这样得到span的节点,需要从text中取出值。对于CSS选择器和XPaths,我们也可以用浏览器来写比如chrome浏览器只需要选择对应的节点,右键找到Copy,它提供了几种获取节点的解析方式,如图上面Copy选择器对应的是Css选择器,CopyXPath对应的是XPath,这个功能还是很好用的。4、了解反爬虫策略因为现在爬虫非常猖獗,所以很多网站都会有反爬虫机制来过滤掉爬虫程序,从而保证网站可以正常使用。这也是一个非常必要的手段。毕竟,如果网站不能使用,就没有利益可以谈。反爬虫的方法有很多种,我们来看看几种常见的反爬虫方法。基于头部的反爬虫机制这是一种比较常见的反爬虫机制。网站通过检查RequestHeaders中的User-Agent和Referer参数来判断程序是否为爬虫程序。绕过这个机制比较简单。我们只需要在网页中查看网站需要的User-Agent和Referer参数的值,然后在爬虫程序的RequestHeaders中设置这些参数即可。基于用户行为的反爬虫机制这也是一种常见的反爬虫机制。最常用的是IP访问限制。一个IP在一段时间内只允许访问多少次。如果超过这个频率,就会被认为是爬虫程序,比如豆瓣电影会被IP限制。对于这种机制,我们可以通过设置代理IP来解决这个问题。我们只需要从代理ip网站获取一批代理IP,在请求的时候设置代理IP即可。除了IP限制,还会根据你的访问有时间间隔。如果你访问的时间间隔是固定的,它也可以被认为是一个爬虫。为了绕过这个限制,在请求时设置不同的时间间隔。比例是这次睡1分钟,下次睡30秒。基于动态页面反爬虫机制的网站有很多。我们需要收集的数据是通过Ajax请求或者通过JavaScript生成的。对于这种网站,就比较麻烦了。要绕过这个机制,我们有两种方法,一种是使用辅助工具,比如Selenium,来获取渲染后的页面。第二种方式是逆向思维法。我们获取请求数据的AJAX链接,直接访问链接获取数据。以上就是爬虫的一些基础知识。主要介绍网络爬虫的工具和反爬虫策略。早期也是爬虫,后期用的是Python。最近突然对Java爬虫产生了兴趣,准备写一个关于爬虫的系列博文,重新整理一下Java网络爬虫。算是对Java爬虫的一个总结。用Java做网络爬虫的会更厉害。Java网络爬虫预计篇幅六篇,从简单到复杂,循序渐进,内容涉及我这些年爬虫遇到的所有问题。以下是模拟的六篇文章介绍。一、网络爬虫,就这么简单本文是对网络爬虫的介绍。它会使用Jsoup和HttpClient获取页面,然后使用选择器解析获取数据。最后你会发现爬虫就是一个http请求,就这么简单。2、网页收藏遇到登录问题怎么办?本章简单说一下获取需要登录的数据。以豆瓣的个人信息为例,两种简单的方法是手动设置cookie和模拟登录。谈谈这些问题。3、网页采集遇到数据Ajax异步加载怎么办?本章简单说一下异步数据的问题。以网易新闻为例,直接使用htmlunit工具获取渲染页面,逆向思维Ajax请求连接获取数据有两种方式,简单说一下如何处理此类问题。4、网页获取IP被封怎么办?IP访问受限应该是常有的事。以豆瓣电影为例,主要针对代理IP的设置,简单说一下IP受限的解决方法。它还将简要介绍如何构建自己的ip代理服务。5、网络采集性能太差,怎么办?有时候对爬虫程序的性能有要求,这种单线程的方式可能行不通,我们可能需要一个多线程甚至分布式的爬虫程序,所以本文主要讲多线程爬虫和分布式爬虫架构方案。6、开源爬虫框架webmagic用例分析之前用webmagic做爬虫,但是当时对webmagic框架不是很了解。经过几年的体验,我现在对这个框架有了新的认识。因此,我想按照webmagic规范搭建一个简单的demo,感受一下webmagic的强大。以上就是我的爬虫系列博文,用文字记录点点滴滴,记录下我这个非专业爬虫玩家这些年遇到的坑。如果你准备学习Java网络爬虫,不妨关注一波,相信你会有所收获,因为我会用心去写每一篇文章。
