python - Scrapy - 在请求中更改用户代理的正确方法

标签 python scrapy screen-scraping user-agent

我通过重写 RetryMiddleware 在 Scrapy 中创建了一个自定义中间件,它在重试之前更改了 Proxy 和 User-Agent。看起来像这样

class CustomRetryMiddleware(RetryMiddleware):
    def _retry(self, request, reason, spider):
        retries = request.meta.get('retry_times', 0) + 1

        if retries <= self.max_retry_times:
            Proxy_UA_Middleware.switch_proxy()
            Proxy_UA_Middleware.switch_ua()
            logger.debug("Retrying %(request)s (failed %(retries)d times): %(reason)s",
                         {'request': request, 'retries': retries, 'reason': reason},
                         extra={'spider': spider})
            retryreq = request.copy()
            retryreq.meta['retry_times'] = retries
            retryreq.dont_filter = True
            retryreq.priority = request.priority + self.priority_adjust
            return retryreq
        else:
            logger.debug("Gave up retrying %(request)s (failed %(retries)d times): %(reason)s",
                         {'request': request, 'retries': retries, 'reason': reason},
                         extra={'spider': spider})

Proxy_UA_Middlware 类很长。基本上它包含更改代理和用户代理的方法。我在我的 settings.py 文件中正确配置了这两个中间件。代理部分工作正常,但用户代理没有改变。我用来更改用户代理的代码如下所示

request.headers.setdefault('User-Agent', self.user_agent)

其中 self.user_agent 是从用户代理数组中获取的随机值。这是行不通的。但是,如果我这样做

request.headers['User-Agent'] = self.user_agent

然后它就可以正常工作,并且每次重试时用户代理都会成功更改。但是我没有看到有人用这种方法来改变User Agent。我的问题是,以这种方式更改用户代理是否可以,如果不行,我做错了什么?

最佳答案

如果你总是想控制在那个中间件上使用哪个用户代理,那没关系,setdefault 做的是检查是否没有User-Agent 之前分配,这是可能的,因为其他中间件可能正在这样做,甚至从蜘蛛分配它。

此外,我认为您还应该禁用默认的 UserAgentMiddleware 或什至为您的中间件设置更高的优先级,检查 UserAgentMiddleware priority is 400 ,因此将您的设置为之前(400 之前的某个数字)。

关于python - Scrapy - 在请求中更改用户代理的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34400307/

相关文章:

python - 在 "Mr."或 "Mrs."之前分割字符串

javascript - 可以使用 scrapy 从使用 AJAX 的网站中抓取动态内容吗?

python - 从 DM.de 抓取客户评论

perl - 如何下载雅虎网上论坛?

PHP/AJAX 图像抓取脚本类似于 Facebook 消息传递功能

python - 为什么 Python 3.6.4 从 to_bytes() 方法返回意外字符?

python - Python中更有效的加权基尼系数

python - 如何解决ajax代码中FLASK的404错误?

python-2.7 - Scrapy Crawl Spider 不跟踪链接

r - r 中的网络抓取(带循环)