我知道如何在 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中我是这样写的。可以用吗??
如果您在
USER_AGENT
中设置 settings.py
就像您的问题一样,那么您将只为整个爬网获得一个(随机)用户代理。
如果您想为每个请求设置一个假用户代理,您有几个选择。
此方法涉及直接在
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()})
我不会讨论这个,因为你不妨使用已经存在的一个
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'
您可以使用
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!
通过使用上述策略,您可以在日志中看到使用过的用户代理 如下图所示。 享受它!