Scrapy - Shell
Descrizione
Scrapy shell può essere utilizzato per scartare i dati con codice privo di errori, senza l'uso di spider. Lo scopo principale della shell Scrapy è testare il codice estratto, XPath o le espressioni CSS. Aiuta anche a specificare le pagine web da cui stai raschiando i dati.
Configurazione della shell
La shell può essere configurata installando la console IPython (utilizzata per il calcolo interattivo), che è una potente shell interattiva che fornisce il completamento automatico, l'output colorato, ecc.
Se stai lavorando sulla piattaforma Unix, è meglio installare IPython. Puoi anche usare bpython , se IPython è inaccessibile.
È possibile configurare la shell impostando la variabile d'ambiente chiamata SCRAPY_PYTHON_SHELL o definendo il file scrapy.cfg come segue:
[settings]
shell = bpython
Avvio della shell
Scrapy Shell può essere lanciato utilizzando il seguente comando:
scrapy shell <url>
L' URL specifica l'URL per il quale i dati devono essere raschiati.
Utilizzando la Shell
La shell fornisce alcune scorciatoie aggiuntive e oggetti Scrapy come descritto nella tabella seguente:
Scorciatoie disponibili
Shell fornisce le seguenti scorciatoie disponibili nel progetto:
Suor n | Collegamento e descrizione |
---|---|
1 | shelp() Fornisce gli oggetti e le scorciatoie disponibili con l'opzione di aiuto. |
2 | fetch(request_or_url) Raccoglie la risposta dalla richiesta o dall'URL e gli oggetti associati verranno aggiornati correttamente. |
3 | view(response) È possibile visualizzare la risposta per la richiesta data nel browser locale per l'osservazione e per visualizzare correttamente il collegamento esterno, aggiunge un tag di base al corpo della risposta. |
Oggetti Scrapy disponibili
Shell fornisce i seguenti oggetti Scrapy disponibili nel progetto:
Suor n | Oggetto e descrizione |
---|---|
1 | crawler Specifica l'oggetto crawler corrente. |
2 | spider Se non è presente uno spider per l'URL attuale, gestirà l'URL o l'oggetto spider definendo il nuovo spider. |
3 | request Specifica l'oggetto richiesta per l'ultima pagina raccolta. |
4 | response Specifica l'oggetto risposta per l'ultima pagina raccolta. |
5 | settings Fornisce le impostazioni Scrapy correnti. |
Esempio di sessione di shell
Proviamo a eseguire lo scrapy del sito scrapy.org e quindi iniziamo a eliminare i dati da reddit.com come descritto.
Prima di andare avanti, per prima cosa avvieremo la shell come mostrato nel seguente comando:
scrapy shell 'http://scrapy.org' --nolog
Scrapy mostrerà gli oggetti disponibili durante l'utilizzo dell'URL sopra -
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x1e16b50>
[s] item {}
[s] request <GET http://scrapy.org >
[s] response <200 http://scrapy.org >
[s] settings <scrapy.settings.Settings object at 0x2bfd650>
[s] spider <Spider 'default' at 0x20c6f50>
[s] Useful shortcuts:
[s] shelp() Provides available objects and shortcuts with help option
[s] fetch(req_or_url) Collects the response from the request or URL and associated
objects will get update
[s] view(response) View the response for the given request
Quindi, inizia con il lavoro degli oggetti, mostrato come segue:
>> response.xpath('//title/text()').extract_first()
u'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework'
>> fetch("http://reddit.com")
[s] Available Scrapy objects:
[s] crawler
[s] item {}
[s] request
[s] response <200 https://www.reddit.com/>
[s] settings
[s] spider
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
>> response.xpath('//title/text()').extract()
[u'reddit: the front page of the internet']
>> request = request.replace(method="POST")
>> fetch(request)
[s] Available Scrapy objects:
[s] crawler
...
Invocare la shell dagli spider per esaminare le risposte
Puoi esaminare le risposte che vengono elaborate dallo spider, solo se ti aspetti di ottenere quella risposta.
Ad esempio:
import scrapy
class SpiderDemo(scrapy.Spider):
name = "spiderdemo"
start_urls = [
"http://mysite.com",
"http://mysite1.org",
"http://mysite2.net",
]
def parse(self, response):
# You can inspect one specific response
if ".net" in response.url:
from scrapy.shell import inspect_response
inspect_response(response, self)
Come mostrato nel codice sopra, puoi invocare la shell dagli spider per ispezionare le risposte usando la seguente funzione:
scrapy.shell.inspect_response
Ora esegui il ragno e otterrai la seguente schermata:
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None)
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None)
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None)
[s] Available Scrapy objects:
[s] crawler
...
>> response.url
'http://mysite2.org'
È possibile verificare se il codice estratto funziona utilizzando il codice seguente:
>> response.xpath('//div[@class = "val"]')
Visualizza l'output come
[]
La riga sopra ha visualizzato solo un output vuoto. Ora puoi invocare la shell per ispezionare la risposta come segue:
>> view(response)
Visualizza la risposta come
True