【scrapy】爬虫,从429状态码说起

许久未爬,发现爬不动了,哈哈哈,记录下这次失败的爬取经历

问题描述

针对这样的一个网站:

https://www.farfetch.cn/cn/shopping/women/dresses-1/items.aspx?page=1&view=96&sort=3

需求:

1.需要爬取列表页的主图

请添加图片描述

2.爬取详情页的商品信息

请添加图片描述

这个网站看起来吧好像挺容易的,去爬就知道厉害了:

当多次爬取之后(比如7、8次),就会遇到遇到429的问题。如它所提示,这个使访问太频繁导致,其实也就是网站识别出了这个ip,触发了反爬机制。
请添加图片描述

429的含义

HTTP状态码429表示客户端发送的请求过多,超出了服务器的处理能力或限制。它是一种反应速率限制的状态码,用于告知客户端暂时无法处理请求。服务器通过返回状态码429,希望客户端减少请求频率或采取其他措施来降低服务器的负载。
一句话:单个ip频繁访问达到服务器限制就会触发429
参考:https://blog.csdn.net/q7w8e9r4/article/details/133639163

如何解决

下面是我总结的网上提及的几种思路,难度从低到高:

(1) 添加header信息,使其看起来更像浏览器访问。

- 固定user-Agent:如下面是google浏览器的请求信息,当固定使用一个时,被识别为爬虫的风险很高

USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36’

- 轮换User-Agent:每次请求时就随机切换一个,模仿不同浏览器和设备访问

(2)两个请求之间增加延时:
- 有些服务器会在返回的头部中添加"Retry-After",告诉你多久之后重试。获取这个值,然后sleep就可以了。

- 在setting.py中增加请求延长时间,可以固定或者随机选择一个时间进行动态延时

- 在爬虫代码中增加延时,如在解析时添加time.sleep(2)

(3)使用AutoThrottle中间件或者setting.py中添加AUTOTHROTTLE_ENABLED = True,根据服务器API的响应情况自动调整请求速率,从而避免触发API的限制。

(4)使用代理ip池,每次请求随机选择一个代理IP

- 免费代理:如站大爷,试了几个,效果很差,不能代理

- 收费代理:没试过,不知道哪个网站收费便宜好用。

(5)分布式爬虫:将请求分散给多个爬虫示例,每个示例使用不同的ip地址

没试过。

(1)-(3)我都试过了,都无效,因为这个网站哪怕是在浏览器中手动连续刷新它多次,也会报429,说明这个与header无关,应该就是单纯的限制单个ip频繁访问(很简单粗暴)。

因此要真正避免触发反爬机制,只有从单个ip和频繁访问这两个因素入手。

针对单个ip的问题:

一是可以使用代理ip池,换句话说,对于现在的网站,不使用代理ip池是容易就被识别为爬虫,导致禁止访问的。

二是可以使用分布式爬虫,这块当前没用过,不多说。

针对频繁访问的问题:

一是可以使用一个较多数量的代理池,比如2000个,那么你这边有2万次请求,分散到每个代理IP,那么每个ip也只会请求10次(且每次之间的间隔时间是比较长的,),此时对于每个代理IP访问网站,都是一个低频的状态,基本不会触发429。

当有代理池存在时,就可以充分利用scrapy的异步和并发机制。

二是可以设置动态延时,爬虫的每个请求发给代理时,也设置一个延迟(用动态的是为了模拟人的行为),但因为分散给多个代理进行爬取(对服务器而言还是存在着一个短时间高访问的异常现象,但因为是多个ip,每个ip都不会触发反爬机制),这个延迟时间可以设置不那么大(比如2秒),此时对爬取的服务器的压力会减小,属于一个友好操作。

小结

现在的网站基本上都会有反爬措施存在,不上一些复杂的手段,如代理ip池+模仿浏览器行为(添加header并轮换)+模仿用户访问行为(动态延时+不规律的点击访问等),大一些或者专业一些的网站基本上就爬不动了。

下期预告:
这个网站除了上面的限流访问机制,还存在着网页动态加载的问题(如此时scrapy直接解析列表页的图片地址,则只能获取到前面11个预加载的信息,剩下的信息都是需要在页面滚动过程中才实时加载),针对这个问题,后面再单独开一篇文章进行总结。

参考资料

https://blog.51cto.com/u_16175513/10325418【Python 爬虫状态码 429解决方法】

https://www.cnblogs.com/yoyo1216/p/12794365.html【SCRAPY 429 处理】

https://www.yisu.com/jc/449564.html【python爬虫中怎么处理429错误】

https://blog.csdn.net/Z_suger7/article/details/134929657【解决HTTP 429错误的Scrapy中间件配置】

https://blog.csdn.net/lionking1990/article/details/113244448【python 爬虫 处理429错误】

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值