2014-04-18 12 views
11

Ich lerne Scrapy, ein Web-Crawling-Framework.Wie Scrapy zeigen Benutzer Agent pro Download-Anfrage im Protokoll?

Ich weiß, ich kann USER_AGENT in Datei des Scrapy-Projekts festlegen. Wenn ich den Scrapy starte, kann ich den USER_AGENT Wert in INFO Protokollen sehen.
Diese USER_AGENT wird in jeder Download-Anfrage auf den Server gesetzt, den ich crawlen möchte.

Aber ich benutze mehrere USER_AGENTzufällig mit Hilfe von this solution. Ich denke, dass diese zufällig gewählte USER_AGENT funktionieren würde. Ich möchte es bestätigen. Also, wie kann ich machen Scrapy zeigtUSER_AGENT pro Download-Anfrage, damit ich den Wert von USER_AGENT in den Protokollen sehen kann?

Antwort

11

können Sie die Protokollierung in den solution Sie verwenden:

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

Gerade FYI.

Ich habe eine einfache RandomUserAgentMiddleware middleware basierend auf fake-useragent implementiert.

Dank fake-useragent müssen Sie die Liste der User-Agents nicht konfigurieren - sie werden von einer abgerufen.

+1

Aber warum hat es PyPI nicht hinzugefügt? – theotheo

+0

@theotheo getan, siehe https://pypi.python.org/pypi/scrapypy-fake-useragent. Danke für die Idee. – alecxe

+0

@alecxe Ich benutze Fake-useragent in meinem Projekt, aber es wirft "Raise FakeUserAgentError ('Fehler beim Browser") # noqa FakeUserAgentError: Fehler beim Browser "Fehler aufgetreten. – javed

2

EDIT: Ich kam hierher, weil ich nach der Funktionalität suchte, um den User Agent zu ändern.

Basierend auf alecxe des RandomUserAgent, das ist, was ich nur einmal die User-Agenten setzen pro Crawl und nur aus einer vordefinierten Liste (funktioniert bei mir mit 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 

Die eigentliche Antwort auf Ihre Frage ist: Überprüfen Sie die UA auf einem lokalen Webserver und überprüfen Sie die Protokolle (zB /var/log/apache2/access.log auf * NIX).

6

Sie können es sehen dies durch den Einsatz:

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

Sie scrapy-fake-useragent Python-Bibliothek verwenden können. Es funktioniert perfekt und es wählt User-Agent basierend auf der Welt Nutzungsstatistik. Aber seien Sie vorsichtig, überprüfen Sie, ob es mit dem obigen Code bereits perfekt funktioniert, da Sie bei der Anwendung möglicherweise einen Fehler machen. Lesen Sie die Anweisungen sorgfältig durch.