
如果是让我写,我优先选用selenium(chromedriver),模拟正常浏览。效率低很多,但是数据靠谱。
爬虫与反爬,就像生存与死亡,是一个值得考虑到问题。
写爬虫,目的是获得数据。如果是简单、无争议公开的数据,只要不对服务器造成压力,方法都不重要。但往往要获取的数据,很多情况下对方都不希望通过爬虫自动化轻易得到。这时候,双方工程师、甚至是律师就要博奕了。
红方:基于数据统计、机器学习的方法,判断区别与常人浏览的途径很多。
蓝方:针对红方的可能手段,也有很多途径。所谓上有政策,下有对策。比如维护一个IP池自动切换。博奕,说白了就是斗争。没有永远胜利的一方。花费精力写一个专业爬虫,但这个爬虫可能也需要维护的。个人觉得不值得,应该想想其他方式。
专业爬虫,核心不会用python写的
大前端的语言,js+抓包分析是更加胜任爬虫的语言。一是爬取的数据,大部份都是来自网站或APP。用原汁原味的js,再对口不过。同时,效率会更高。据我所知,很多竞争对手爬取对方的价格,基本都绕不开js。用python会适得其反。
说个反爬的损招
通过nginx配置,能实现简单的反爬,这里说一个损招。
一般对方爬取我方数据时,我们都会设置路障,比如要求对方输入手机验证码、识别、或者告知,请24小时候再来访问。
不妨反其道而行之,如果能确认对方是爬虫,不要阻止对方来爬取,二是造随机数据给对方爬。数据伪装成什么样,可以灵活控制。可以80%假,20%真。或者比例反过来。甚至比例可以随机。这种方法可以捉弄对方的工程师。
最后友情提醒,爬虫有风险,码农要谨慎。
总的来讲,网站的反爬虫的策略有:检测爬取频率、并发连接数目、>
其中最常见的就是判断你的请求频率和并发数量,如果你在短时间内发送了大量的请求,也就是你的爬取速度很快的话,那么他就直接判断你是爬虫,这时候先把你IP封了再说,免得给自己的网站带来负担。
那么这些策略我们都如何应对呢?这几个方法都不同,
1、爬虫伪装浏览器点击
我们先理解一下网站的代码执行,首先我们向服务器发送请求,这时服务器的后台php、java都会执行,然后网站代码被发送到本地,在本地时js、ajax会在浏览器内核中执行。所以这时候我们就知道,爬虫不仅要欺骗phpjava代码、还要欺骗js和ajax代码。
2、使用代理
爬的太快会被封,是一定的。爬的太慢又非常耗时间。所以很多人都会说可以使用代理,所谓代理就是介于用户与网站之间的第三者:用户先将请求发到代理,然后代理再发到服务器,这样看起来就像是代理在访问那个网站了,实现一个不断的切换IP的假象。网上免费代理很多,但是能用的没几个,如果不想购买付费的代理,大家可以学习一下
3、降低访问频率
如果一直找不到好用的免费代理,又不想付费,最好的办法就是降低访问频率了。这样做可以达到与用代理一样的效果——防止被对方从访问量上看出来。比如:每抓取一个页面就休息随机几秒、限制每天抓取的页面数量。当然,在抓取效率上会差很多,因为数据量大的话,时间就会很长。
首先明白,webmagic中是存在一个待爬取得队列的,所有将要爬取得links都存放在这个队列里面,每次爬虫取一个link爬取,下载页面后分析出页面的内容产生新的link,新的link又推入队列,如此工作这里不讨论去重了。webmagic依靠继承schedler类来维护待爬取得links,如果对页的爬虫的效率有要求,那就不能通过设定访问时间间隔的方法来绕过频率检查了。
代理IP访问可以解决这个问题,如果用100个代理IP访问100个页面,可以给网站造成一种有100个人,每个人访问了1页的错觉,这样自然而然就不会限制你的访问了。
代理IP经常会出现不稳定的情况。你随便搜一个免费代理,会出现很多网站,每个网站也会给你很多的代理IP,但实际上,真正可用的代理IP并不多。
这需要维护一个可用的代理IP池,但是一个免费的代理IP,也许在你测试的时候是可以使用的,但是几分钟以后就失效了,使用免费代理IP是已经费时费力,而且很考验你运气的事情。
可以使用分布式爬虫,分布式爬虫会部署在多台服务器上,每个服务器上的爬虫统一从一个地方拿网址。这样平均下来每个服务器访问网站的频率也就降低了。
由于服务器是掌握在我们手上的,因此实现的爬虫会更加的稳定和高效,这样就可以控制访问层数的控制与查看了。
以访问网页为例,我们在B站首页输入“夏目友人帐”点击搜索来到下方页面,我们可以在 "Chrome" 的 Network 视图点击某一资源查看该资源对应请求的 Headers 头信息。编写网络爬虫需要模拟浏览器向服务器发起请求,比如我们设置了头信息中的Cookie等头信息,这样服务器就会以为我们是通过浏览器登录账户进行访问的,不会把我们列入机器人爬虫,一定程度上可以反爬虫。
需要关注 Request Headers 主要有下图中红色框选中的部分。
同理,我们可以查看到服务器响应返回的头信息知道响应结果的编码是utf-8,有的还可以看到服务器所用是apache或是其他web服务器。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)