利用爬虫抓取数据避免被封的几个小技巧

2021-06-25

现在利用爬虫抓取数据越来越困难,各类网站都加上了各种反爬手段来侦测封杀爬虫。有几个小技巧可以帮助你不被反爬机制干扰。

爬虫抓取数据变得越来越困难,越热门的网站一般发爬虫的手段就越多越高级。比如检测IP地址,HTTP请求头检测,验证码,Cookie检测等等各种手段,一旦检测到异常,就可能被网站临时封锁,甚至永久封锁。不过我们也有对应的技巧帮助你不那么容易被反爬机制检测到,避免被封。

动态切换IP

目前大多数网站基础反爬策略都是根据IP地址检测流量请求,一旦检测到异常的流量,都会很直接的封锁对应的IP或者IP段。然后过一段时间解封。所以如果在抓取数据的过程能动态切换IP地址,比如每个请求或者隔一段时间切换IP的话,可以很有效地避开反爬的检测。可以直接使用智能代理服务比如五号代理接口或者其他代理服务。五号代理的接口会自动切换IP地址,这种机制能保护你能持续抓取大部分的网站数据。

如果一些网站使用了更高级的检测手段,你可能需要使用住宅代理或者其他更高级的代理,这些代理普遍来说价格不菲。但是如果你能做到每次请求都切换IP,一般来说绝大多数的网站的反爬机制都很难识别出来。

设置合适的UA

User Agent是特殊的HTTP请求头,网站会根据你的UA来判断用户是用何种浏览器来访问的。有些网站会分析请求的UA,只允许主流的浏览器访问,而把不符合的UA挡住。不少爬虫开发者不想花时间设置合适的UA,这种请求很容易被网站侦测出来。所以设置合适的UA是一种有效防止被封的技巧(你可以在这个链接找到现在主流的UA)。或者你还可以把你的UA设置成GoogleBot,绝大多数的网站都不会封住谷歌的爬虫,不然网站不会被谷歌收录。整体的原则是要设置比较主流也比较新的UA参数,如果可能,最好也是动态切换主流的UA设置,这样网站会更难检测出来。

另外,也建议设置更接近真实浏览器的HTTP请求头,可以用浏览器访问这里查看主流的浏览器的设置。一般来说动态设置合适的UA配合动态切换IP地址发送请求,基本上能绕过99%的网站的反爬检测。

请求间加上随机间隔

对于正常的用户来说访问网站的时候,切换页面的时间都是随机的,所以如果你请求一个网站的时间间隔差不多是一致的情况下,也是一种很容易被检测出来的特征。在请求见加上随机的间隔(比如2-10秒的随机间隔)能避免被反爬机制侦测数来。这里还有一点要注意,设计爬虫的总的原则是不要粗暴的疯狂请求网站抓取数据,这会影响网站的正常使用,甚至形成违法。

可以参考scrapy框架内置的autothrottle做法。

设置请求的Referrer

Referrer是HTTP请求头,代表请求是从哪里跳转过来的,经常被网站用于统计引流的效果。一般来说设置成谷歌或者百度是安全的,或者你可以去https://www.similarweb.com查找目标网站的最常见的来源网站。但是有些网站会限制某些页面的Referrer。这时候你应该模拟用户是如何到达这个页面的,把请求来源设置成该页面的上一层页面。

使用Headless浏览器

现在越来越多的网站的关键数据依赖JS的动态渲染,甚至是JS动态请求得到数据后才渲染关键的数据。Headless浏览器(比如Selenium或者Puppeteer)能让你通过API控制真实的浏览器访问网站模拟用户行为。如果设置得当,Headless浏览器的行为跟真实浏览器的行为是一模一样的。所以基本上是不可能被反爬机制检测到的。请注意,除非真的有必要,不推荐使用Headless浏览器,因为稳定运行这些工具都会消耗很大的CPU和内容资源,爬虫的效率会受到很大的影响。当然你可以直接使用五号代理的接口,只需要一个参数就能直接使用调校好的Headless浏览器。

希望以上的一些方法能帮助你更有效的绕开网站的反爬机制,更有效的抓取数据。一般来说动态切换IP,动态设置UA就能应付绝大多数的情况了。但是在此强调一下,在编写爬虫抓取网站数据的时候,请考虑网站的维护者和正常的用户的使用感受,不要过频繁的请求网站数据造成正常用户的使用障碍。己所不欲,勿施于人。