scrapy 如何在发送请求时使用随机用户代理?

b4qexyjb  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(135)

我知道如何使用随机(假)用户代理在scrapy。但在我运行scrapy。我可以看到只有一个随机用户代理在终端上。所以我猜可能'settings.py'只运行一次,当我运行scrapy。如果scrapy的工作真的像这样,并发送1000个请求到一些网页收集1000数据,scrapy将只是发送相同的用户代理。当然,它可以很容易得到禁令,我想。
你能告诉我,我如何发送随机用户代理,当scrappy发送请求到一些网站?
我在我的scrapy项目中使用了这个库(?)。在我在settings.py中设置faker之后
第一个
在settings.py我这样写的。它能很好地工作吗?

1bqhqjot

1bqhqjot1#

如果你在你的settings.py中设置USER_AGENT,就像你的问题一样,那么你将只得到一个(随机)用户代理,用于你的整个爬行。
如果您想为每个请求设置一个假用户代理,您有几个选择。

选项1:按请求显式设置User-Agent

这种方法涉及到直接在Request的头文件中设置user-agent。在spider代码中,你可以像上面一样导入Faker,但是在每个Request上调用fake.chrome()。例如


# At the top of your file

from faker import Faker 

# This can be a global or class variable

fake = Faker() 

...

# When you make a Request

yield Request(url, headers={"User-Agent": fake.chrome()})

选项2:编写一个中间件来自动执行此操作

我不想深入讨论这个问题,因为您还可以使用已经存在的方法

选项3:使用现有的中间件自动执行此操作(如scrapy-fake-useragent

如果你的代码中有很多请求,选项1就不太好了,所以你可以使用Middleware来完成。一旦你安装了scrapy-fake-useragent,你就可以按照网页上的描述在你的设置文件中设置它

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
    'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
    'scrapy_fake_useragent.middleware.RetryUserAgentMiddleware': 401,
}

FAKEUSERAGENT_PROVIDERS = [
    'scrapy_fake_useragent.providers.FakeUserAgentProvider',
    'scrapy_fake_useragent.providers.FakerProvider',  
    'scrapy_fake_useragent.providers.FixedUserAgentProvider',
]

使用这个函数,你将得到每个Request的一个新的user-agent,如果Request失败了,你也将得到一个新的随机的user-agent。设置这个函数的关键部分之一是FAKEUSERAGENT_PROVIDERS。它告诉我们从哪里得到User-Agent。它们按照定义的顺序被尝试。因此,如果第一个提供程序由于某种原因失败(如果获取用户代理失败,而不是Request失败),则将尝试第二个提供程序。

FAKEUSERAGENT_PROVIDERS = [
    'scrapy_fake_useragent.providers.FakerProvider',
    'scrapy_fake_useragent.providers.FakeUserAgentProvider',     
    'scrapy_fake_useragent.providers.FixedUserAgentProvider',
]

还有其他的配置选项(比如使用随机的chrome类用户代理,在scrapy-fake-useragent文档中列出)。

蜘蛛示例

下面是一个spider示例。为了方便起见,我在spider内部设置了这些设置,但您可以将这些设置放入您的settings.py文件中。


# fake_user_agents.py

from scrapy import Spider

class FakesSpider(Spider):
    name = "fakes"
    start_urls = ["http://quotes.toscrape.com/"]
    custom_settings = dict(
        DOWNLOADER_MIDDLEWARES={
            "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,
            "scrapy.downloadermiddlewares.retry.RetryMiddleware": None,
            "scrapy_fake_useragent.middleware.RandomUserAgentMiddleware": 400,
            "scrapy_fake_useragent.middleware.RetryUserAgentMiddleware": 401,
        },
        FAKEUSERAGENT_PROVIDERS=[
            "scrapy_fake_useragent.providers.FakerProvider",
            "scrapy_fake_useragent.providers.FakeUserAgentProvider",
            "scrapy_fake_useragent.providers.FixedUserAgentProvider",
        ],
    )

    def parse(self, response):
        # Print out the user-agent of the request to check they are random
        print(response.request.headers.get("User-Agent"))

        next_page = response.css("li.next a::attr(href)").get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

如果我用scrapy runspider fake_user_agents.py --nolog运行这个函数,输出为

b'Mozilla/5.0 (Macintosh; PPC Mac OS X 10 11_0) AppleWebKit/533.1 (KHTML, like Gecko) Chrome/59.0.811.0 Safari/533.1'
b'Opera/8.18.(Windows NT 6.2; tt-RU) Presto/2.9.169 Version/11.00'
b'Opera/8.40.(X11; Linux i686; ka-GE) Presto/2.9.176 Version/11.00'
b'Opera/9.42.(X11; Linux x86_64; sw-KE) Presto/2.9.180 Version/12.00'
b'Mozilla/5.0 (Macintosh; PPC Mac OS X 10 5_1 rv:6.0; cy-GB) AppleWebKit/533.45.2 (KHTML, like Gecko) Version/5.0.3 Safari/533.45.2'
b'Opera/8.17.(X11; Linux x86_64; crh-UA) Presto/2.9.161 Version/11.00'
b'Mozilla/5.0 (compatible; MSIE 5.0; Windows NT 5.1; Trident/3.1)'
b'Mozilla/5.0 (Android 3.1; Mobile; rv:55.0) Gecko/55.0 Firefox/55.0'
b'Mozilla/5.0 (compatible; MSIE 9.0; Windows CE; Trident/5.0)'
b'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10 11_9; rv:1.9.4.20) Gecko/2019-07-26 10:00:35 Firefox/9.0'

相关问题