Python 如何在scrapy spider中更改用户\代理?

Python 如何在scrapy spider中更改用户\代理?,python,scrapy,tor,Python,Scrapy,Tor,我编写了一个spider,通过代理获取我的IP。这是我的第一个spider。 我想更改用户\u代理。 我从本教程中获得了信息 我完成了本教程中的所有步骤,这是我的代码 设置.py 中间件.py checkip.py 这是为用户\u代理返回的信息 2015-10-30 22:24:20+0200 [scrapy] DEBUG: Web service listening on 127.0.0.1:6080 2015-10-30 22:24:20+0200 [checkip] DEBUG: User

我编写了一个spider,通过
代理获取我的IP。
这是我的第一个spider。 我想更改用户\u代理。 我从本教程中获得了信息

我完成了本教程中的所有步骤,这是我的代码

设置.py 中间件.py checkip.py 这是为用户\u代理返回的信息

2015-10-30 22:24:20+0200 [scrapy] DEBUG: Web service listening on 127.0.0.1:6080
2015-10-30 22:24:20+0200 [checkip] DEBUG: User-Agent: Scrapy/0.24.4 (+http://scrapy.org) <GET http://ip.42.pl/raw>
这是在控制台中返回的结果

2015-10-30 22:50:32+0200 [checkip] DEBUG: User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3 <GET http://ip.42.pl/raw>
2015-10-30 22:50:32+0200[checkip]调试:用户代理:Mozilla/5.0(iPhone;CPU iPhone OS 5_1,类似Mac OS X)AppleWebKit/534.46(KHTML,类似Gecko)Version/5.1 Mobile/9B179 Safari/7534.48.3

如何在我的spider中使用用户代理列表?

如果您不需要随机用户代理,您可以将
用户代理
放在设置文件中,如:

设置.py

...
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:39.0) Gecko/20100101 Firefox/39.0'
...
不需要中间件。但如果您真的想随机选择一个用户代理,首先要确保在scrapy日志中使用了
RandomUserAgentMiddleware
,您应该在日志中检查类似的内容:

Enabled downloader middlewares:
[
    ...
    'CheckIP.middlewares.RandomUserAgentMiddleware',
    ...
]
检查
CheckIP.middleware
是否为该中间件的路径

现在,可能中间件上的设置加载不正确,我建议使用
from_crawler
方法加载:

Class RandomUserAgentMiddleware(object):
    def __init__(self, settings):
        self.settings = settings

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        o = cls(settings, crawler.stats)
        return o
现在使用
self.settings.get('USER\u AGENT\u LIST')
process\u request
方法中获取所需内容


另外,请更新您的scrapy版本,看起来您正在使用
0.24
,而在scrapy 1.0.5中,它已经通过
1.0
,您可以通过在spider中定义属性“user\u agent”来设置每个spider的用户代理,或者通过设置user\u agent在所有spider中共享用户代理。UserAgentMiddleware从user_agent设置获取user agent,如果Spider中有user_agent属性,则在请求头中重写它


您还可以编写自己的UserAgentMiddleware,在响应头中随机分配一个用户代理,并将优先级设置为小于400。

找到解决方案了吗?我不确定。我找到了一些解决方案,并尝试将这一行“'CheckIP.middleware.RandomUserAgentMiddleware':400”改为“'CheckIP.middleware.RandomUserAgentMiddleware':5”,然后开始工作。所有的请求都使用不同的用户代理。数字表示应该首先应用哪个中间件,默认的UserAgent中间件也是400,所以可能他们没有一起工作,如果您将其更改为5就可以了。两天之后,我抓取了该站点。每天刮板都有约8000个链接。一天前,我收到了这样一封信:“对方拒绝了连接:111:连接被拒绝。”。我尝试再次更改用户\代理列表,但响应相同。我改变了机器人的名称,增加了延迟和响应是一样的。可能是什么问题?有没有可能IP在banlist或其他感谢!尝试使用代理,禁止是可能的。
2015-10-30 22:50:32+0200 [checkip] DEBUG: User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3 <GET http://ip.42.pl/raw>
...
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:39.0) Gecko/20100101 Firefox/39.0'
...
Enabled downloader middlewares:
[
    ...
    'CheckIP.middlewares.RandomUserAgentMiddleware',
    ...
]
Class RandomUserAgentMiddleware(object):
    def __init__(self, settings):
        self.settings = settings

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        o = cls(settings, crawler.stats)
        return o