Scrapy - wydobywanie przedmiotów
Opis
Do wydobywania danych ze stron internetowych Scrapy wykorzystuje technikę zwaną selektorami opartą na wyrażeniach XPath i CSS . Oto kilka przykładów wyrażeń XPath -
/html/head/title - Spowoduje to zaznaczenie elementu <title> wewnątrz elementu <head> dokumentu HTML.
/html/head/title/text() - Spowoduje to zaznaczenie tekstu w tym samym elemencie <title>.
//td - Spowoduje to zaznaczenie wszystkich elementów z <td>.
//div[@class = "slice"]- Spowoduje to zaznaczenie wszystkich elementów z div, które zawierają atrybut class = "slice"
Selektory mają cztery podstawowe metody, jak pokazano w poniższej tabeli -
Sr.No | Metoda i opis |
---|---|
1 | extract() Zwraca ciąg znaków Unicode wraz z wybranymi danymi. |
2 | re() Zwraca listę ciągów znaków Unicode, wyodrębnionych, gdy jako argument podano wyrażenie regularne. |
3 | xpath() Zwraca listę selektorów, która reprezentuje węzły wybrane przez wyrażenie xpath podane jako argument. |
4 | css() Zwraca listę selektorów, która reprezentuje węzły wybrane przez wyrażenie CSS podane jako argument. |
Używanie selektorów w powłoce
Aby zademonstrować selektory z wbudowaną powłoką Scrapy, musisz mieć zainstalowany w systemie IPython . Ważną rzeczą jest to, że adresy URL powinny być umieszczane w cudzysłowach podczas uruchamiania Scrapy; w przeciwnym razie adresy URL ze znakami „&” nie będą działać. Możesz uruchomić powłokę, używając następującego polecenia w katalogu najwyższego poziomu projektu -
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
Powłoka będzie wyglądać następująco -
[ ... 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]:
Po załadowaniu powłoki możesz uzyskać dostęp do treści lub nagłówka, używając odpowiednio response.body i response.header . Podobnie można uruchamiać zapytania dotyczące odpowiedzi za pomocą funkcji response.selector.xpath () lub response.selector.css () .
Na przykład -
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']
Wyodrębnianie danych
Aby wyodrębnić dane ze zwykłej witryny HTML, musimy sprawdzić kod źródłowy witryny, aby uzyskać XPath. Po sprawdzeniu możesz zobaczyć, że dane będą w formacieuletykietka. Wybierz elementy w obrębieli etykietka.
Poniższe wiersze kodu pokazują wyodrębnianie różnych typów danych -
Do wybierania danych w tagu li -
response.xpath('//ul/li')
Do wyboru opisów -
response.xpath('//ul/li/text()').extract()
Do wybierania tytułów witryn -
response.xpath('//ul/li/a/text()').extract()
Do wybierania linków do witryn -
response.xpath('//ul/li/a/@href').extract()
Poniższy kod demonstruje użycie powyższych ekstraktorów -
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