分析scrapy爬虫抓取instagram请求过快导致网站429的解决办法

scrapy爬虫抓取instagram请求过快导致网站429

    • 问题描述
    • 问题分析
    • 尝试修改
    • 解决办法

问题描述

  • 在HTTP协议中,响应状态码 429 Too Many Requests 表示在一定的时间内用户发送了太多的请求,即超出了“频次限制”。

  • 在响应中,可以提供一个 Retry-After 首部来提示用户需要等待多长时间之后再发送新的请求。

HTTP/1.1 429 Too Many Requests
Content-Type: text/html
Retry-After: 3600


  
    Too Many Requests
  
  
    

Too Many Requests

I only allow 50 requests per hour to this Web site per logged in user. Try again soon.

问题分析

  • 服务器不主动拒绝请求,不封ip,但是会限制请求频率,所有我们要尊重服务器的设置,适当降低请求频率,不要试图解决它。

但是,有些人就是不信邪(比如我),所以在请求大量数据的时候,还是可以做一些措施,在边缘疯狂试探。
分析scrapy爬虫抓取instagram请求过快导致网站429的解决办法_第1张图片

尝试修改

  • 我们可以修改scrapy的中间件,以便收到错误时暂停。等待一会儿后再继续执行爬虫。
from scrapy.downloadermiddlewares.retry import RetryMiddleware
from scrapy.utils.response import response_status_message

import time

class TooManyRequestsRetryMiddleware(RetryMiddleware):

    def __init__(self, crawler):
        super(TooManyRequestsRetryMiddleware, self).__init__(crawler.settings)
        self.crawler = crawler

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_response(self, request, response, spider):
        if request.meta.get('dont_retry', False):
            return response
        elif response.status == 429:
            self.crawler.engine.pause()
            time.sleep(60) # If the rate limit is renewed in a minute, put 60 seconds, and so on.
            self.crawler.engine.unpause()
            reason = response_status_message(response.status)
            return self._retry(request, reason, spider) or response
        elif response.status in self.retry_http_codes:
            reason = response_status_message(response.status)
            return self._retry(request, reason, spider) or response
        return response 
  • 在请求出现429的时候,我们的程序将会停止运行,根据设置的等待时间开始等待,我这里设置的时60s,当然你也可以设置得更久。(对于程序员来说,这不是好办法)

    分析scrapy爬虫抓取instagram请求过快导致网站429的解决办法_第2张图片

  • 添加429以重试代码 settings.py
    RETRY_HTTP_CODES = [429]

  • 然后激活它settings.py。

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
    'flat.middlewares.TooManyRequestsRetryMiddleware': 543,
}

既然有限制,那我们就降低一点速度,给人家一点面子。
分析scrapy爬虫抓取instagram请求过快导致网站429的解决办法_第3张图片

分析scrapy爬虫抓取instagram请求过快导致网站429的解决办法_第4张图片

解决办法

无限创建gmail邮箱账号
根据我的这篇文章,我们可以利用邮箱创建大量gmail账号,用来登录instagram,从而获取Cookie池,

那么以上的限速请求,可忽略,根据实际抓取测试,大概在10个Cookie的时候,可以做到无限制抓取。

对于请求频率限制反爬虫,大家可以参考我的这篇文章,作为学习参考
请求频率限制反爬虫

分析scrapy爬虫抓取instagram请求过快导致网站429的解决办法_第5张图片
以上,加油吧

你可能感兴趣的:(爬虫,python爬虫技术专栏)