【问题标题】:How can I change User_AGENT in scrapy spider?如何在 scrapy 蜘蛛中更改 User_AGENT?
【发布时间】:2016-11-02 14:14:51
【问题描述】:

我写了一个蜘蛛来从http://ip.42.pl/raw通过PROXY.获取我的IP这是我的第一个蜘蛛。 我想更改 user_agent。 我从本教程中得到了信息http://blog.privatenode.in/torifying-scrapy-project-on-ubuntu

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

settings.py

BOT_NAME = 'CheckIP'

SPIDER_MODULES = ['CheckIP.spiders']
NEWSPIDER_MODULE = 'CheckIP.spiders'

USER_AGENT_LIST = ['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',
'Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
'Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
'Mozilla/5.0 (Linux; U; Android 2.3; en-us) AppleWebKit/999+ (KHTML, like Gecko) Safari/999.9',
'Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; HTC_IncredibleS_S710e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
    ]

HTTP_PROXY = 'http://127.0.0.1:8123'

DOWNLOADER_MIDDLEWARES = {
    'CheckIP.middlewares.RandomUserAgentMiddleware': 400,
    'CheckIP.middlewares.ProxyMiddleware': 410,
    'CheckIP.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
}

中间件.py

import random
from scrapy.conf import settings
from scrapy import log


class RandomUserAgentMiddleware(object):
    def process_request(self, request, spider):
        ua = random.choice(settings.get('USER_AGENT_LIST'))
        if ua:
            request.headers.setdefault('User-Agent', ua)
            #this is just to check which user agent is being used for request
            spider.log(
                u'User-Agent: {} {}'.format(request.headers.get('User-Agent'), request),
                level=log.DEBUG
            )


class ProxyMiddleware(object):
    def process_request(self, request, spider):
        request.meta['proxy'] = settings.get('HTTP_PROXY')

checkip.py

import time
from scrapy.spider import Spider
from scrapy.http import Request

class CheckIpSpider(Spider):
    name = 'checkip'
    allowed_domains = ["ip.42.pl"]
    url = "http://ip.42.pl/raw"

    def start_requests(self):
            yield Request(self.url, callback=self.parse)

    def parse(self, response):
        now = time.strftime("%c")
        ip = now+"-"+response.body+"\n"
        with open('ips.txt', 'a') as f:
             f.write(ip)

这是为 USER_AGENT 返回的信息

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>

用户代理:Scrapy/0.24.4 (+http://scrapy.org)

当我在请求中手动添加标头时,一切正常。

   def start_requests(self):
        yield Request(self.url, callback=self.parse, headers={"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"})

这是在控制台中返回的结果

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_LIST?

【问题讨论】:

  • 你找到解决办法了吗?
  • 我不确定。我找到了一些解决方案,并尝试使用“'CheckIP.middlewares.RandomUserAgentMiddleware': 5”更改此行“'CheckIP.middlewares.RandomUserAgentMiddleware': 400”,并且可以正常工作。所有请求都来自不同的用户代理。
  • 数字表示应该先应用哪个中间件,默认的UserAgent中间件也是400,所以可能它们没有一起工作,如果你把它改成5就可以了。
  • 两天后,我抓取了该网站。每天,刮板都会获得约 8000 个链接。一天前我收到“连接被对方​​拒绝:111:连接被拒绝。”。我尝试再次更改 user_agent 列表,但响应相同。我更改了 Bot 名称,增加了延迟并且响应相同。可能是什么问题?是否有可能 IP 在禁止列表中或其他谢谢!
  • 尝试使用代理,封禁是可能的。

标签: python scrapy tor


【解决方案1】:

如果您不需要随机的 user_agent,您可以将 USER_AGENT 放在您的设置文件中,例如:

settings.py

...
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:39.0) Gecko/20100101 Firefox/39.0'
...

不需要中间件。但是,如果你想真正随机选择一个 user_agent,首先要确保在scrapy 日志中使用了RandomUserAgentMiddleware,你应该在你的日志中检查类似这样的内容:

Enabled downloader middlewares:
[
    ...
    'CheckIP.middlewares.RandomUserAgentMiddleware',
    ...
]

检查CheckIP.middlewares 是该中间件的路径。

现在可能是中间件上的设置加载不正确,我建议使用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_AGENT_LIST')process_request 方法中获取您想要的内容。

另外请更新你的scrapy版本,看起来你正在使用0.24,而它已经通过1.0

【讨论】:

    【解决方案2】:

    在scrapy 1.0.5中,你可以通过在Spider中定义一个属性'user_agent'来设置每个蜘蛛的用户代理,或者通过设置USER_AGENT在所有蜘蛛之间共享用户代理。 UserAgentMiddleware 从 USER_AGENT 设置中获取用户代理,如果 Spider 中有 user_agent 属性,则在请求头中覆盖它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多