Как заставить Scrapy отображать пользовательский агент для каждого запроса на загрузку в журнале?
Я изучаю Scrapy, веб-систему сканирования.
Я знаю, что могу установить USER_AGENT
в settings.py
файл проекта Scrapy. Когда я запускаю Scrapy, я могу увидеть значение USER_AGENT
в журналах INFO
.
Этот USER_AGENT
устанавливается в каждый запрос на загрузку на сервер, который я хочу выполнить.
Но я использую несколько USER_AGENT
случайно с помощью это решение. Я предполагаю, что этот случайный выбор USER_AGENT
будет работать. Я хочу это подтвердить. Итак, как я могу сделать Scrapy показывать USER_AGENT
для каждого запроса на загрузку, чтобы я мог видеть значение USER_AGENT
в журналах?
Ответы
Ответ 1
Просто FYI.
Я реализовал простую RandomUserAgentMiddleware
промежуточное программное обеспечение на основе fake-useragent
.
Благодаря fake-useragent
вам не нужно настраивать список User-Agents - он выбирает их на основе статистики использования браузера из реальной базы данных.
Ответ 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).