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

问题描述 投票:0回答:2

我知道如何在 scrapy 中使用随机(假)用户代理。但在我运行 scrapy 之后。我在终端上只能看到一个随机用户代理。所以我猜想当我运行 scrapy 时,“settings.py”可能只运行一次。如果 scrapy 真的像这样工作并向某个网页发送 1000 个请求来收集 1000 个数据,则 scrapy 将只发送相同的用户代理。我认为肯定很容易被禁止。

你能告诉我当 scrapy 向某个网站发送请求时如何发送随机用户代理吗?

我在我的 scrapy 项目中使用了这个库(?)。 当我将

faker
设置为
user-agent
中的
settings.py

https://pypi.org/project/Faker/
from faker import Faker 

fake = Faker() 
Faker.seed(fake.random_number()) 
fake_user_agent = fake.chrome() 

USER_AGENT = fake_user_agent 

在settings.py中我是这样写的。可以用吗??

scrapy
2个回答
2
投票

如果您在

USER_AGENT
中设置
settings.py
就像您的问题一样,那么您将只为整个爬网获得一个(随机)用户代理。

如果您想为每个请求设置一个假用户代理,您有几个选择。

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

此方法涉及直接在

user-agent
 的标题中设置 
Request
。在您的蜘蛛代码中,您可以像上面那样导入
Faker
但然后调用例如每个
fake.chrome()
都有
Request
。例如

# 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',
]

使用此功能,您将获得每个

user-agent
的新
Request
,如果
Request
失败,您还将获得新的随机
user-agent
。设置此功能的关键部分之一是
FAKEUSERAGENT_PROVIDERS
。这告诉我们从哪里获取
User-Agent
。它们按照定义的顺序进行尝试,因此如果第一个由于某种原因失败(如果获取用户代理失败,而不是
Request
失败),则将尝试第二个。请注意,如果您想使用
Faker
作为主要提供商,那么您应该将其放在列表中的第一个

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

还有其他配置选项(例如使用类似 chrome 的随机用户代理,在

scrapy-fake-useragent
文档中列出。

蜘蛛示例

这是一个蜘蛛示例。为了方便起见,我在蜘蛛内部设置了设置,但您可以将这些设置放入您的

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'

0
投票

您可以使用

scrapy-user-agents
。该中间件有超过 2200 个用户代理。 为了使用这个安装库:

pip install scrapy-user-agents

然后在您的

settings.py
文件中添加以下行:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 200,
}

以上

scrapy_user_agents.middlewares.RandomUserAgentMiddleware
是一个数字,您可以将最大值设置为 2200!

通过使用上述策略,您可以在日志中看到使用过的用户代理 如下图所示。 享受它!

© www.soinside.com 2019 - 2024. All rights reserved.