2014-04-18 14 views
11

Sto imparando Scrapy, una struttura di scansione del web.Come rendere Scrapy show user agent per richiesta di download nel log?

So che posso impostare USER_AGENT nel file settings.py del progetto Scrapy. Quando eseguo Scrapy, posso vedere il valore di USER_AGENT nei registri INFO.
Questo USER_AGENT viene impostato in ogni richiesta di download sul server che si desidera sottoporre a scansione.

Ma sto usando più USER_AGENTin modo casuale con l'aiuto di this solution. Immagino che questo USER_AGENT scelto a caso funzionerebbe. Voglio confermarlo. Quindi, come posso fare Scrapy mostraUSER_AGENT per richiesta di download in modo da poter vedere il valore di USER_AGENT nei registri?

risposta

11

È possibile aggiungere la registrazione a solution si sta utilizzando:

#!/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

Cordiali saluti.

Ho implementato un semplice RandomUserAgentMiddleware middleware basato su fake-useragent.

Grazie a fake-useragent, non è necessario configurare l'elenco di agenti utente, ma viene prelevato da da un real-world database.

+1

Ma perché non l'ha aggiunto a PyPI? – theotheo

+0

@theotheo done, consultare https://pypi.python.org/pypi/scrapy-fake-useragent. Grazie per l'idea. – alecxe

+0

@alecxe Sto usando fake-useragent nel mio progetto ma sta lanciando "raise FakeUserAgentError ('Errore durante il recupero del browser') # noqa FakeUserAgentError: Errore durante il recupero del browser" Errore. – javed

2

MODIFICA: Sono venuto qui perché stavo cercando la funzionalità per cambiare il programma utente.

In base alla RandomUserAgent di alecxe, questo è quello che uso per impostare il programma utente solo una volta per strisciare e solo da un elenco predefinito (funziona per me con 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 

La risposta effettiva alla tua domanda è: Controlla l'UA usando un server web locale e vedi controlla i log (es. /var/log/apache2/access.log su * NIX).

6

Lo si può vedere utilizzando questo:

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

È possibile utilizzare scrapy-fake-useragent libreria Python. Funziona perfettamente e sceglie l'agente utente in base alle statistiche di utilizzo del mondo. Ma fai attenzione, controlla se funziona già perfettamente usando il codice precedente poiché potresti fare qualche errore quando lo applichi. Leggi attentamente le istruzioni.