Scrapy - Estrazione di oggetti

Descrizione

Per estrarre i dati dalle pagine web, Scrapy utilizza una tecnica chiamata selettori basata su espressioni XPath e CSS . Di seguito sono riportati alcuni esempi di espressioni XPath:

  • /html/head/title - Questo selezionerà l'elemento <title>, all'interno dell'elemento <head> di un documento HTML.

  • /html/head/title/text() - Questo selezionerà il testo all'interno dello stesso elemento <title>.

  • //td - Questo selezionerà tutti gli elementi da <td>.

  • //div[@class = "slice"]- Questo selezionerà tutti gli elementi da div che contengono un attributo class = "slice"

I selettori hanno quattro metodi di base come mostrato nella tabella seguente:

Suor n Metodo e descrizione
1

extract()

Restituisce una stringa Unicode insieme ai dati selezionati.

2

re()

Restituisce un elenco di stringhe Unicode, estratte quando l'espressione regolare è stata data come argomento.

3

xpath()

Restituisce un elenco di selettori, che rappresenta i nodi selezionati dall'espressione xpath data come argomento.

4

css()

Restituisce un elenco di selettori, che rappresenta i nodi selezionati dall'espressione CSS fornita come argomento.

Utilizzo dei selettori nella shell

Per dimostrare i selettori con la shell Scrapy incorporata, è necessario che IPython sia installato nel sistema. La cosa importante qui è che gli URL dovrebbero essere inclusi tra virgolette durante l'esecuzione di Scrapy; altrimenti gli URL con i caratteri "&" non funzioneranno. È possibile avviare una shell utilizzando il seguente comando nella directory di livello superiore del progetto:

scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"

Una shell sarà simile alla seguente:

[ ... Scrapy log here ... ]

2014-01-23 17:11:42-0400 [scrapy] DEBUG: Crawled (200) 
<GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>(referer: None)
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x3636b50>
[s]   item       {}
[s]   request    <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   response   <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   settings   <scrapy.settings.Settings object at 0x3fadc50>
[s]   spider     <Spider 'default' at 0x3cebf50>
[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

In [1]:

Quando viene caricata la shell, è possibile accedere al corpo o all'intestazione utilizzando rispettivamente response.body e response.header . Allo stesso modo, è possibile eseguire query sulla risposta utilizzando response.selector.xpath () o response.selector.css () .

Ad esempio:

In [1]: response.xpath('//title')
Out[1]: [<Selector xpath = '//title' data = u'<title>My Book - Scrapy'>]

In [2]: response.xpath('//title').extract()
Out[2]: [u'<title>My Book - Scrapy: Index: Chapters</title>']

In [3]: response.xpath('//title/text()')
Out[3]: [<Selector xpath = '//title/text()' data = u'My Book - Scrapy: Index:'>]

In [4]: response.xpath('//title/text()').extract()
Out[4]: [u'My Book - Scrapy: Index: Chapters']

In [5]: response.xpath('//title/text()').re('(\w+):')
Out[5]: [u'Scrapy', u'Index', u'Chapters']

Estrazione dei dati

Per estrarre i dati da un normale sito HTML, dobbiamo ispezionare il codice sorgente del sito per ottenere XPath. Dopo l'ispezione, puoi vedere che i dati saranno nel fileuletichetta. Seleziona gli elementi all'internoli etichetta.

Le seguenti righe di codice mostrano l'estrazione di diversi tipi di dati:

Per selezionare i dati all'interno del tag li -

response.xpath('//ul/li')

Per selezionare le descrizioni -

response.xpath('//ul/li/text()').extract()

Per selezionare i titoli del sito -

response.xpath('//ul/li/a/text()').extract()

Per selezionare i collegamenti al sito -

response.xpath('//ul/li/a/@href').extract()

Il codice seguente dimostra l'uso degli estrattori di cui sopra:

import scrapy

class MyprojectSpider(scrapy.Spider):
   name = "project"
   allowed_domains = ["dmoz.org"]
   
   start_urls = [
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
   ]
   def parse(self, response):
      for sel in response.xpath('//ul/li'):
         title = sel.xpath('a/text()').extract()
         link = sel.xpath('a/@href').extract()
         desc = sel.xpath('text()').extract()
         print title, link, desc