Dans cet exemple, j'ai récupéré l'URL « https://www.urbandictionary.com/define.php?term=YOLO » et enregistré le code HTML dans le fichier test_output.html.
(scrapy_env) mihai@DESKTOP-0RN92KH:~/myproject$ scrapy shell --nolog
[s] Available Scrapy objects:
[s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s] crawler <scrapy.crawler.Crawler object at 0x7f1eef80f6a0>
[s] item {}
[s] settings <scrapy.settings.Settings object at 0x7f1eef80f4c0>
[s] Useful shortcuts:
[s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s] fetch(req) Fetch a scrapy.Request and update local objects
[s] shelp() Shell help (print this help)
[s] view(response) View response in a browser
>>> response // response is empty
>>> fetch('https://www.urbandictionary.com/define.php?term=YOLO')
>>> response
<200 https://www.urbandictionary.com/define.php?term=Yolo>
>>> with open('test_output.html', 'w') as f:
... f.write(response.text)
...
118260
Examinons maintenant test_output.html et identifions les sélecteurs dont nous aurions besoin pour extraire les données pour notre scraper Urban Dictionary.
Nous pouvons observer que :
- Chaque conteneur de définition de mot possède la classe « definition ».
- La signification du mot se trouve à l'intérieur de la balise div portant la classe « meaning ».
- Les exemples pour le mot se trouvent à l'intérieur de la balise div portant la classe « example ».
- Les informations concernant l'auteur et la date de publication se trouvent dans la balise div portant la classe « contributor ».
Testons maintenant quelques sélecteurs dans le shell Scrapy :
Pour obtenir des références à tous les conteneurs de définition, nous pouvons utiliser des sélecteurs CSS ou XPath :
Vous pouvez en savoir plus sur les sélecteurs XPath ici : https://www.webscrapingapi.com/the-ultimate-xpath-cheat-sheet
definitions = response.css('div.definition')
definitions = response.xpath('//div[contains(@class,"definition")]')
Nous devons extraire la signification, l'exemple et les informations relatives à l'article de chaque conteneur de définition. Testons quelques sélecteurs avec le premier conteneur :
>>> first_def = definitions[0]
>>> meaning = first_def.css('div.meaning').xpath(".//text()").extract()
>>> meaning
['Yolo ', 'means', ', '', 'You Only Live Once', ''.']
>>> meaning = "".join(meaning)
>>> meaning
'Yolo means, 'You Only Live Once'.'
>>> example = first_def.css('div.example').xpath(".//text()").extract()
>>> example = "".join(example)
>>> example
'"Put your seatbelt on." Jessica said.\r"HAH, YOLO!" Replies Anna.\r(They then proceed to have a car crash. Long story short...Wear a seatbelt.)'
>>> post_data = first_def.css('div.contributor').xpath(".//text()").extract()
>>> post_data
['by ', 'Soy ugly', ' April 24, 2019']
En utilisant le shell Scrapy, nous avons pu trouver rapidement un sélecteur général qui répond à nos besoins.
definition.css('div.<meaning|example|contributor>').xpath(".//text()").extract()
// returns an array with all the text found inside the <meaning|example|contributor>
ex: ['Yolo ', 'means', ', '', 'You Only Live Once', ''.']
Pour en savoir plus sur les sélecteurs Scrapy, consultez la documentation. https://docs.scrapy.org/en/latest/topics/selectors.html