In diesem Beispiel habe ich die URL „https://www.urbandictionary.com/define.php?term=YOLO“ abgerufen und den HTML-Code in der Datei test_output.html gespeichert.
(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
Sehen wir uns nun test_output.html an und identifizieren wir die Selektoren, die wir benötigen, um die Daten für unseren Urban-Dictionary-Scraper zu extrahieren.
Wir können Folgendes feststellen:
- Jeder Container für eine Wortdefinition die Klasse „definition“ hat.
- Die Bedeutung des Wortes befindet sich innerhalb des div-Elements mit der Klasse „meaning“.
- Beispiele für das Wort befinden sich im Div mit der Klasse „example“.
- Informationen zum Autor des Beitrags und zum Datum befinden sich im Div mit der Klasse „contributor“.
Testen wir nun einige Selektoren in der Scrapy-Shell:
Um Verweise auf alle Definitionscontainer zu erhalten, können wir CSS- oder XPath-Selektoren verwenden:
Mehr über XPath-Selektoren erfährst du hier: https://www.webscrapingapi.com/the-ultimate-xpath-cheat-sheet
definitions = response.css('div.definition')
definitions = response.xpath('//div[contains(@class,"definition")]')
Wir sollten die Bedeutung, das Beispiel und die Beitragsinformationen aus jedem Definitionscontainer extrahieren. Testen wir einige Selektoren mit dem ersten Container:
>>> 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']
Mithilfe der Scrapy-Shell konnten wir schnell einen allgemeinen Selektor finden, der unseren Anforderungen entspricht.
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', ''.']
Weitere Informationen zu Scrapy-Selektoren finden Sie in der Dokumentation. https://docs.scrapy.org/en/latest/topics/selectors.html