Как заставить Scrapy отображать пользовательский агент для каждого запроса на загрузку в журнале?

Я изучаю Scrapy, веб-систему сканирования.

Я знаю, что могу установить USER_AGENT в settings.py файл проекта Scrapy. Когда я запускаю Scrapy, я могу увидеть значение USER_AGENT в журналах INFO.
Этот USER_AGENT устанавливается в каждый запрос на загрузку на сервер, который я хочу выполнить.

Но я использую несколько USER_AGENT случайно с помощью это решение. Я предполагаю, что этот случайный выбор USER_AGENT будет работать. Я хочу это подтвердить. Итак, как я могу сделать Scrapy показывать USER_AGENT для каждого запроса на загрузку, чтобы я мог видеть значение USER_AGENT в журналах?

Ответ 2

Вы можете добавить регистрацию в решение, которое вы используете:

#!/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",
    ]

Ответ 3

Вы можете увидеть это, используя это:

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

Вы можете использовать библиотеку python scrapy-fake-useragent. Он отлично работает и выбирает пользовательский агент, основанный на мировой статистике использования. Но будьте осторожны, проверьте, работает ли он уже отлично с использованием вышеуказанного кода, так как вы можете ошибиться при его применении. Внимательно прочитайте инструкцию.

Ответ 4

EDIT: Я пришел сюда, потому что искал функциональность для изменения пользовательского агента.

Основываясь на alecx 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 с помощью локального веб-сервера и посмотрите, проверяете ли журналы (например,/var/log/apache2/access.log на * NIX).