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])