如何让 Scrapy 在日志中根据下载请求显示用户代理?

Posted

技术标签:

【中文标题】如何让 Scrapy 在日志中根据下载请求显示用户代理?【英文标题】:How to make Scrapy show user agent per download request in log? 【发布时间】:2014-06-02 21:09:37 【问题描述】:

我正在学习Scrapy,一个网络爬虫框架。

我知道我可以在 Scrapy 项目的settings.py 文件中设置USER_AGENT。当我运行 Scrapy 时,我可以在 INFO 日志中看到 USER_AGENT 的值。 这个USER_AGENT 会在我要抓取的服务器的每个下载请求中设置。

但我在this solution 的帮助下随机使用了多个USER_AGENT。我猜这个随机选择的USER_AGENT 会起作用。我想确认一下。那么,如何让 Scrapy shows USER_AGENT 每个下载请求,以便我可以在日志中看到 USER_AGENT 的值?

【问题讨论】:

【参考方案1】:

仅供参考。

我已经基于fake-useragent 实现了一个简单的RandomUserAgentMiddleware middleware。

感谢fake-useragent,您无需配置用户代理列表 - 它会从real-world database 中选择based on browser usage statistics。

【讨论】:

但是为什么不把它添加到 PyPI 中呢? @theotheo 完成,请参阅pypi.python.org/pypi/scrapy-fake-useragent。感谢您的想法。 @alecxe 我在我的项目中使用 fake-useragent,但它正在抛出“raise FakeUserAgentError('Error occurred during getting browser') # noqa FakeUserAgentError: Error occurred during getting browser”错误。 @daved 你还有这个问题吗?有时,与连接到真实世界用户代理的源相关的临时问题.. @alecxe 我稍微改变了你的 scrapy_fake_agent 中间件来处理这个异常。我所做的是,每当发生异常时,我都会调用获取随机浏览器以递归方式下载,直到不发生异常 - 直到没有调用 Internet Explorer。这样它就跳过了抛出异常的 Internet Explorer 浏览器。感谢您的回复和您的软件模块。【参考方案2】:

你可以用这个看到它:

def parse(self, response):
    print response.request.headers['User-Agent']

您可以使用scrapy-fake-useragent python 库。它工作得很好,它根据世界使用统计数据选择用户代理。但是请注意,使用上面的代码检查它是否已经完美运行,因为在应用它时可能会犯一些错误。仔细阅读说明。

【讨论】:

【参考方案3】:

您可以将日志记录添加到您正在使用的solution:

#!/usr/bin/python
#-*-coding:utf-8-*-
import random

from scrapy import log
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware

class RotateUserAgentMiddleware(UserAgentMiddleware):
    def __init__(self, user_agent=''):
        self.user_agent = user_agent

    def process_request(self, request, spider):
        ua = random.choice(self.user_agent_list)
        if ua:
            request.headers.setdefault('User-Agent', ua)

            # Add desired logging message here.
            spider.log(
                u'User-Agent:  '.format(request.headers.get('User-Agent'), request),
                level=log.DEBUG
            )


    #the default user_agent_list composes chrome,IE,firefox,Mozilla,opera,netscape
    #for more user agent strings,you can find it in http://www.useragentstring.com/pages/useragentstring.php
    user_agent_list = [
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (Khtml, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
    ]

【讨论】:

对不起,我怎样才能在蜘蛛内部使用这个类来有效地旋转ua?【参考方案4】:

编辑:我来到这里是因为我正在寻找更改用户代理的功能。

基于 alecxe 的 RandomUserAgent,这是我用来在每次抓取时仅设置一次用户代理并且仅来自预定义列表(适用于 scrapy v. 0.24 和 0.25)的用户代理:

    """
    Choose a user agent from the settings but do it only once per crawl.
    """
    import random
    import scrapy

    SETTINGS = scrapy.utils.project.get_project_settings()


    class RandomUserAgentMiddleware(object):
        def __init__(self):
            super(RandomUserAgentMiddleware, self).__init__()
            self.fixedUserAgent = random.choice(SETTINGS.get('USER_AGENTS'))
            scrapy.log.msg('User Agent for this crawl is: '.
                           format(self.fixedUserAgent))

        def process_start_requests(self, start_requests, spider):
            for r in start_requests:
                r.headers.setdefault('User-Agent', self.fixedUserAgent)
                yield r

您的问题的实际答案是:使用本地网络服务器检查 UA 并查看日志(例如 *NIX 上的 /var/log/apache2/access.log)。

【讨论】:

以上是关于如何让 Scrapy 在日志中根据下载请求显示用户代理?的主要内容,如果未能解决你的问题,请参考以下文章

scrapy:日志和post请求

scrapy框架之日志等级和请求传参

如何在scrapy中根据url过滤重复请求

scrapy框架的日志等级和请求传参, 优化效率

13.scrapy框架的日志等级和请求传参

Scrapy爬虫框架