Scrapy - Richieste e risposte

Descrizione

Scrapy può eseguire la scansione di siti Web utilizzando il Request e Responseoggetti. Gli oggetti di richiesta passano sul sistema, utilizzano gli spider per eseguire la richiesta e tornare alla richiesta quando restituisce un oggetto di risposta.

Richiedi oggetti

L'oggetto richiesta è una richiesta HTTP che genera una risposta. Ha la seguente classe:

class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta,
   encoding = 'utf-8', priority = 0, dont_filter = False, errback])

La tabella seguente mostra i parametri degli oggetti Request -

Suor n Parametro e descrizione
1

url

È una stringa che specifica la richiesta dell'URL.

2

callback

È una funzione richiamabile che utilizza la risposta della richiesta come primo parametro.

3

method

È una stringa che specifica la richiesta del metodo HTTP.

4

headers

È un dizionario con intestazioni di richiesta.

5

body

È una stringa o un unicode che ha un corpo della richiesta.

6

cookies

È un elenco contenente i cookie di richiesta.

7

meta

È un dizionario che contiene i valori per i metadati della richiesta.

8

encoding

È una stringa contenente la codifica utf-8 utilizzata per codificare l'URL.

9

priority

È un numero intero in cui lo scheduler utilizza la priorità per definire l'ordine di elaborazione delle richieste.

10

dont_filter

È un valore booleano che specifica che lo scheduler non deve filtrare la richiesta.

11

errback

È una funzione richiamabile da chiamare quando viene sollevata un'eccezione durante l'elaborazione di una richiesta.

Passaggio di dati aggiuntivi alle funzioni di richiamata

La funzione di callback di una richiesta viene chiamata quando la risposta viene scaricata come primo parametro.

Ad esempio:

def parse_page1(self, response): 
   return scrapy.Request("http://www.something.com/some_page.html", 
      callback = self.parse_page2)  

def parse_page2(self, response): 
   self.logger.info("%s page visited", response.url)

Puoi usare Request.meta attributo, se si desidera passare argomenti a funzioni richiamabili e ricevere tali argomenti nel secondo callback come mostrato nell'esempio seguente:

def parse_page1(self, response): 
   item = DemoItem() 
   item['foremost_link'] = response.url 
   request = scrapy.Request("http://www.something.com/some_page.html", 
      callback = self.parse_page2) 
   request.meta['item'] = item 
   return request  

def parse_page2(self, response): 
   item = response.meta['item'] 
   item['other_link'] = response.url 
   return item

Utilizzo di errback per rilevare le eccezioni nell'elaborazione delle richieste

L'errback è una funzione richiamabile da chiamare quando viene sollevata un'eccezione durante l'elaborazione di una richiesta.

Il seguente esempio lo dimostra:

import scrapy  

from scrapy.spidermiddlewares.httperror import HttpError 
from twisted.internet.error import DNSLookupError 
from twisted.internet.error import TimeoutError, TCPTimedOutError  

class DemoSpider(scrapy.Spider): 
   name = "demo" 
   start_urls = [ 
      "http://www.httpbin.org/",              # HTTP 200 expected 
      "http://www.httpbin.org/status/404",    # Webpage not found  
      "http://www.httpbin.org/status/500",    # Internal server error 
      "http://www.httpbin.org:12345/",        # timeout expected 
      "http://www.httphttpbinbin.org/",       # DNS error expected 
   ]  
   
   def start_requests(self): 
      for u in self.start_urls: 
         yield scrapy.Request(u, callback = self.parse_httpbin, 
         errback = self.errback_httpbin, 
         dont_filter=True)  
   
   def parse_httpbin(self, response): 
      self.logger.info('Recieved response from {}'.format(response.url)) 
      # ...  
   
   def errback_httpbin(self, failure): 
      # logs failures 
      self.logger.error(repr(failure))  
      
      if failure.check(HttpError): 
         response = failure.value.response 
         self.logger.error("HttpError occurred on %s", response.url)  
      
      elif failure.check(DNSLookupError): 
         request = failure.request 
         self.logger.error("DNSLookupError occurred on %s", request.url) 

      elif failure.check(TimeoutError, TCPTimedOutError): 
         request = failure.request 
         self.logger.error("TimeoutError occurred on %s", request.url)

Request.meta Special Keys

Le chiavi speciali request.meta sono un elenco di meta chiavi speciali identificate da Scrapy.

La tabella seguente mostra alcune delle chiavi di Request.meta -

Suor n Chiave e descrizione
1

dont_redirect

È una chiave quando impostata su true, non reindirizza la richiesta in base allo stato della risposta.

2

dont_retry

È una chiave quando impostata su true, non ritenta le richieste non riuscite e verrà ignorata dal middleware.

3

handle_httpstatus_list

È una chiave che definisce quali codici di risposta per richiesta possono essere consentiti.

4

handle_httpstatus_all

È una chiave utilizzata per consentire qualsiasi codice di risposta a una richiesta impostandolo su true .

5

dont_merge_cookies

È una chiave utilizzata per evitare la fusione con i cookie esistenti impostandola su true .

6

cookiejar

È una chiave utilizzata per mantenere più sessioni di cookie per spider.

7

dont_cache

È una chiave utilizzata per evitare di memorizzare nella cache richieste e risposte HTTP su ogni criterio.

8

redirect_urls

È una chiave che contiene gli URL attraverso i quali passano le richieste.

9

bindaddress

È l'IP dell'indirizzo IP in uscita che può essere utilizzato per eseguire la richiesta.

10

dont_obey_robotstxt

È una chiave quando impostata su true, non filtra le richieste vietate dallo standard di esclusione robots.txt, anche se ROBOTSTXT_OBEY è abilitato.

11

download_timeout

Viene utilizzato per impostare il timeout (in secondi) per spider per il quale il downloader attenderà prima che scada.

12

download_maxsize

Viene utilizzato per impostare la dimensione massima (in byte) per spider, che il downloader scaricherà.

13

proxy

È possibile impostare il proxy per gli oggetti Request per impostare il proxy HTTP per l'utilizzo delle richieste.

Richiedi sottoclassi

È possibile implementare la propria funzionalità personalizzata creando una sottoclasse della classe di richiesta. Le sottoclassi di richiesta integrate sono le seguenti:

Oggetti FormRequest

La classe FormRequest si occupa dei moduli HTML estendendo la richiesta di base. Ha la seguente classe:

class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body, 
   cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])

Di seguito è riportato il parametro:

formdata - È un dizionario con i dati del modulo HTML assegnati al corpo della richiesta.

Note - I parametri rimanenti sono gli stessi della classe di richiesta ed è spiegato in Request Objects sezione.

I seguenti metodi di classe sono supportati da FormRequest oggetti oltre ai metodi di richiesta -

classmethod from_response(response[, formname = None, formnumber = 0, formdata = None, 
   formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])

La tabella seguente mostra i parametri della classe di cui sopra -

Suor n Parametro e descrizione
1

response

È un oggetto utilizzato per precompilare i campi del modulo utilizzando il modulo di risposta HTML.

2

formname

È una stringa in cui verrà utilizzato il modulo avente l'attributo name, se specificato.

3

formnumber

È un numero intero di moduli da utilizzare quando sono presenti più moduli nella risposta.

4

formdata

È un dizionario di campi nei dati del modulo utilizzati per sovrascrivere.

5

formxpath

È una stringa quando specificato, viene utilizzata la forma che corrisponde a xpath.

6

formcss

È una stringa quando specificata, viene utilizzata la forma che corrisponde al selettore css.

7

clickdata

È un dizionario di attributi utilizzato per osservare il controllo cliccato.

8

dont_click

I dati del modulo verranno inviati senza fare clic su alcun elemento, se impostato su true.

Esempi

Di seguito sono riportati alcuni esempi di utilizzo della richiesta:

Using FormRequest to send data via HTTP POST

Il codice seguente mostra come restituire FormRequest oggetto quando vuoi duplicare il modulo HTML POST nel tuo spider -

return [FormRequest(url = "http://www.something.com/post/action", 
   formdata = {'firstname': 'John', 'lastname': 'dave'}, 
   callback = self.after_post)]

Using FormRequest.from_response() to simulate a user login

Normalmente, i siti Web utilizzano elementi attraverso i quali fornisce campi modulo precompilati.

Il FormRequest.form_response() può essere utilizzato quando si desidera che questi campi vengano popolati automaticamente durante lo scraping.

Il seguente esempio lo dimostra.

import scrapy  
class DemoSpider(scrapy.Spider): 
   name = 'demo' 
   start_urls = ['http://www.something.com/users/login.php']  
   def parse(self, response): 
      return scrapy.FormRequest.from_response( 
         response, 
         formdata = {'username': 'admin', 'password': 'confidential'}, 
         callback = self.after_login 
      )  
   
   def after_login(self, response): 
      if "authentication failed" in response.body: 
         self.logger.error("Login failed") 
         return  
      # You can continue scraping here

Oggetti risposta

È un oggetto che indica la risposta HTTP che viene fornita agli spider per l'elaborazione. Ha la seguente classe:

class scrapy.http.Response(url[, status = 200, headers, body, flags])

La tabella seguente mostra i parametri degli oggetti Response:

Suor n Parametro e descrizione
1

url

È una stringa che specifica la risposta dell'URL.

2

status

È un numero intero che contiene la risposta di stato HTTP.

3

headers

È un dizionario contenente le intestazioni delle risposte.

4

body

È una stringa con corpo di risposta.

5

flags

È un elenco contenente flag di risposta.

Sottoclassi di risposta

È possibile implementare la propria funzionalità personalizzata creando una sottoclasse della classe di risposta. Le sottoclassi di risposta integrate sono le seguenti:

TextResponse objects

Gli oggetti TextResponse vengono utilizzati per dati binari come immagini, suoni, ecc. Che hanno la capacità di codificare la classe Response di base. Ha la seguente classe:

class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])

Di seguito è riportato il parametro:

encoding - È una stringa con codifica utilizzata per codificare una risposta.

Note - I parametri rimanenti sono gli stessi della classe di risposta ed è spiegato in Response Objects sezione.

La tabella seguente mostra gli attributi supportati dall'oggetto TextResponse oltre ai metodi di risposta:

Suor n Attributo e descrizione
1

text

È un corpo di risposta, in cui è possibile accedere più volte a response.text.

2

encoding

È una stringa contenente la codifica per la risposta.

3

selector

È un attributo istanziato al primo accesso e utilizza la risposta come destinazione.

La tabella seguente mostra i metodi supportati dagli oggetti TextResponse oltre ai metodi di risposta :

Suor n Metodo e descrizione
1

xpath (query)

È un collegamento a TextResponse.selector.xpath (query).

2

css (query)

È un collegamento a TextResponse.selector.css (query).

3

body_as_unicode()

È un corpo di risposta disponibile come metodo, in cui è possibile accedere più volte a response.text.

Oggetti HtmlResponse

È un oggetto che supporta la codifica e l'auto-discovery osservando l' attributo metatpequiv di HTML. I suoi parametri sono gli stessi della classe di risposta ed è spiegato nella sezione Oggetti risposta. Ha la seguente classe:

class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])

Oggetti XmlResponse

È un oggetto che supporta la codifica e l'auto-discovery guardando la riga XML. I suoi parametri sono gli stessi della classe di risposta ed è spiegato nella sezione Oggetti risposta. Ha la seguente classe:

class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])