Scrapy - Extraction d'éléments

La description

Pour extraire des données de pages Web, Scrapy utilise une technique appelée sélecteurs basés sur des expressions XPath et CSS . Voici quelques exemples d'expressions XPath -

  • /html/head/title - Cela sélectionnera l'élément <title>, à l'intérieur de l'élément <head> d'un document HTML.

  • /html/head/title/text() - Cela sélectionnera le texte dans le même élément <title>.

  • //td - Cela sélectionnera tous les éléments de <td>.

  • //div[@class = "slice"]- Cela sélectionnera tous les éléments de div qui contiennent un attribut class = "slice"

Les sélecteurs ont quatre méthodes de base, comme indiqué dans le tableau suivant -

Sr. Non Méthode et description
1

extract()

Il renvoie une chaîne Unicode avec les données sélectionnées.

2

re()

Il renvoie une liste de chaînes Unicode, extraites lorsque l'expression régulière a été donnée en argument.

3

xpath()

Il renvoie une liste de sélecteurs, qui représente les nœuds sélectionnés par l'expression xpath donnée en argument.

4

css()

Il renvoie une liste de sélecteurs, qui représente les nœuds sélectionnés par l'expression CSS donnée en argument.

Utilisation de sélecteurs dans le shell

Pour démontrer les sélecteurs avec le shell Scrapy intégré, vous devez avoir IPython installé sur votre système. L'important ici est que les URL doivent être incluses entre les guillemets lors de l'exécution de Scrapy; sinon, les URL avec les caractères «&» ne fonctionneront pas. Vous pouvez démarrer un shell en utilisant la commande suivante dans le répertoire de niveau supérieur du projet -

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

Un shell ressemblera à ce qui suit -

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

Lors du chargement du shell, vous pouvez accéder au corps ou à l'en-tête en utilisant respectivement response.body et response.header . De même, vous pouvez exécuter des requêtes sur la réponse à l'aide de response.selector.xpath () ou response.selector.css () .

Par exemple -

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

Extraire les données

Pour extraire des données d'un site HTML normal, nous devons inspecter le code source du site pour obtenir des XPath. Après inspection, vous pouvez voir que les données seront dans leulmarque. Sélectionnez les éléments dansli marque.

Les lignes de code suivantes montrent l'extraction de différents types de données -

Pour sélectionner des données dans la balise li -

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

Pour sélectionner les descriptions -

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

Pour sélectionner les titres de sites -

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

Pour sélectionner les liens du site -

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

Le code suivant illustre l'utilisation des extracteurs ci-dessus -

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