Trị liệu - Trích xuất vật phẩm
Sự miêu tả
Để trích xuất dữ liệu từ các trang web, Scrapy sử dụng một kỹ thuật được gọi là bộ chọn dựa trên các biểu thức XPath và CSS . Sau đây là một số ví dụ về biểu thức XPath:
/html/head/title - Thao tác này sẽ chọn phần tử <title>, bên trong phần tử <head> của tài liệu HTML.
/html/head/title/text() - Thao tác này sẽ chọn văn bản trong cùng một phần tử <title>.
//td - Thao tác này sẽ chọn tất cả các phần tử từ <td>.
//div[@class = "slice"]- Thao tác này sẽ chọn tất cả các phần tử từ div có chứa thuộc tính class = "slice"
Bộ chọn có bốn phương pháp cơ bản như được hiển thị trong bảng sau:
Sr.No | Phương pháp & Mô tả |
---|---|
1 | extract() Nó trả về một chuỗi unicode cùng với dữ liệu đã chọn. |
2 | re() Nó trả về một danh sách các chuỗi unicode, được trích xuất khi biểu thức chính quy được cung cấp dưới dạng đối số. |
3 | xpath() Nó trả về một danh sách các bộ chọn, đại diện cho các nút được chọn bởi biểu thức xpath được đưa ra làm đối số. |
4 | css() Nó trả về một danh sách các bộ chọn, đại diện cho các nút được chọn bởi biểu thức CSS được cung cấp làm đối số. |
Sử dụng Bộ chọn trong Vỏ
Để trình diễn các bộ chọn với vỏ Scrapy tích hợp, bạn cần phải cài đặt IPython trong hệ thống của mình. Điều quan trọng ở đây là, các URL phải được bao gồm trong dấu ngoặc kép khi chạy Scrapy; nếu không, các URL có ký tự '&' sẽ không hoạt động. Bạn có thể bắt đầu một trình bao bằng cách sử dụng lệnh sau trong thư mục cấp cao nhất của dự án -
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
Một shell sẽ giống như sau:
[ ... 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]:
Khi trình bao tải, bạn có thể truy cập phần nội dung hoặc tiêu đề bằng cách sử dụng response.body và response.header tương ứng. Tương tự, bạn có thể chạy các truy vấn về phản hồi bằng cách sử dụng response.selector.xpath () hoặc response.selector.css () .
Ví dụ -
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']
Trích xuất dữ liệu
Để trích xuất dữ liệu từ một trang HTML thông thường, chúng ta phải kiểm tra mã nguồn của trang đó để lấy XPath. Sau khi kiểm tra, bạn có thể thấy rằng dữ liệu sẽ nằm trongulnhãn. Chọn các phần tử bên trongli nhãn.
Các dòng mã sau đây cho thấy việc trích xuất các loại dữ liệu khác nhau:
Để chọn dữ liệu trong thẻ li -
response.xpath('//ul/li')
Để chọn mô tả -
response.xpath('//ul/li/text()').extract()
Để chọn tiêu đề trang web -
response.xpath('//ul/li/a/text()').extract()
Để chọn liên kết trang web -
response.xpath('//ul/li/a/@href').extract()
Đoạn mã sau minh họa việc sử dụng các trình giải nén trên:
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