Scrapy: extracción de elementos

Descripción

Para extraer datos de páginas web, Scrapy utiliza una técnica denominada selectores basada en expresiones XPath y CSS . A continuación se muestran algunos ejemplos de expresiones XPath:

  • /html/head/title - Esto seleccionará el elemento <title>, dentro del elemento <head> de un documento HTML.

  • /html/head/title/text() - Esto seleccionará el texto dentro del mismo elemento <title>.

  • //td - Esto seleccionará todos los elementos de <td>.

  • //div[@class = "slice"]- Esto seleccionará todos los elementos de div que contengan un atributo class = "slice"

Los selectores tienen cuatro métodos básicos, como se muestra en la siguiente tabla:

No Señor Método y descripción
1

extract()

Devuelve una cadena Unicode junto con los datos seleccionados.

2

re()

Devuelve una lista de cadenas Unicode, extraídas cuando se proporcionó la expresión regular como argumento.

3

xpath()

Devuelve una lista de selectores, que representa los nodos seleccionados por la expresión xpath dada como argumento.

4

css()

Devuelve una lista de selectores, que representa los nodos seleccionados por la expresión CSS dada como argumento.

Usar selectores en el Shell

Para demostrar los selectores con el shell Scrapy incorporado, debe tener IPython instalado en su sistema. Lo importante aquí es que las URL deben incluirse entre las comillas mientras se ejecuta Scrapy; de lo contrario, las URL con caracteres '&' no funcionarán. Puede iniciar un shell utilizando el siguiente comando en el directorio de nivel superior del proyecto:

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

Un caparazón tendrá el siguiente aspecto:

[ ... 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]:

Cuando se carga el shell, puede acceder al cuerpo o al encabezado utilizando response.body y response.header respectivamente. Del mismo modo, puede ejecutar consultas sobre la respuesta mediante response.selector.xpath () o response.selector.css () .

Por ejemplo

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

Extrayendo los datos

Para extraer datos de un sitio HTML normal, tenemos que inspeccionar el código fuente del sitio para obtener XPaths. Después de inspeccionar, puede ver que los datos estarán en eluletiqueta. Seleccione los elementos dentroli etiqueta.

Las siguientes líneas de código muestran la extracción de diferentes tipos de datos:

Para seleccionar datos dentro de la etiqueta li -

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

Para seleccionar descripciones -

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

Para seleccionar títulos de sitios:

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

Para seleccionar enlaces a sitios:

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

El siguiente código demuestra el uso de los extractores anteriores:

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