Scrapy - Mengekstrak Item
Deskripsi
Untuk mengekstraksi data dari halaman web, Scrapy menggunakan teknik yang disebut penyeleksi berdasarkan ekspresi XPath dan CSS . Berikut adalah beberapa contoh ekspresi XPath -
/html/head/title - Ini akan memilih elemen <title>, di dalam elemen <head> dari dokumen HTML.
/html/head/title/text() - Ini akan memilih teks dalam elemen <title> yang sama.
//td - Ini akan memilih semua elemen dari <td>.
//div[@class = "slice"]- Ini akan memilih semua elemen dari div yang berisi atribut class = "slice"
Penyeleksi memiliki empat metode dasar seperti yang ditunjukkan pada tabel berikut -
Sr Tidak | Metode & Deskripsi |
---|---|
1 | extract() Ini mengembalikan string unicode bersama dengan data yang dipilih. |
2 | re() Ini mengembalikan daftar string unicode, diekstraksi ketika ekspresi reguler diberikan sebagai argumen. |
3 | xpath() Ini mengembalikan daftar pemilih, yang mewakili node yang dipilih oleh ekspresi xpath yang diberikan sebagai argumen. |
4 | css() Ini mengembalikan daftar pemilih, yang mewakili node yang dipilih oleh ekspresi CSS yang diberikan sebagai argumen. |
Menggunakan Selectors di Shell
Untuk mendemonstrasikan pemilih dengan shell Scrapy built-in, Anda harus menginstal IPython di sistem Anda. Yang penting di sini adalah, URL harus disertakan di dalam tanda kutip saat menjalankan Scrapy; jika tidak, URL dengan karakter '&' tidak akan berfungsi. Anda dapat memulai shell dengan menggunakan perintah berikut di direktori level teratas proyek -
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
Sebuah shell akan terlihat seperti berikut -
[ ... 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]:
Saat shell dimuat, Anda dapat mengakses body atau header dengan masing-masing menggunakan response.body dan response.header . Demikian pula, Anda bisa menjalankan kueri pada respons menggunakan response.selector.xpath () atau response.selector.css () .
Misalnya -
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']
Mengekstrak Data
Untuk mengekstrak data dari situs HTML biasa, kita harus memeriksa kode sumber situs tersebut untuk mendapatkan XPath. Setelah memeriksa, Anda dapat melihat bahwa datanya akan berada diulmenandai. Pilih elemen di dalamnyali menandai.
Baris kode berikut menunjukkan ekstraksi berbagai jenis data -
Untuk memilih data dalam li tag -
response.xpath('//ul/li')
Untuk memilih deskripsi -
response.xpath('//ul/li/text()').extract()
Untuk memilih judul situs -
response.xpath('//ul/li/a/text()').extract()
Untuk memilih tautan situs -
response.xpath('//ul/li/a/@href').extract()
Kode berikut menunjukkan penggunaan ekstraktor di atas -
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