Rút trích dữ liệu

Một phần của tài liệu Đề tài hệ thống mua sắm thông minh (Trang 22 - 31)

Chương 2. CƠ SỞ LÝ THUYẾT

2.2. Cơ sở lý thuyết

2.2.1. Rút trích dữ liệu

a. Css Selector

Định nghĩa

CSS Selector là sự kết hợp giữa chọn một phần tử và chọn một giá trị xác định của phần tử đó trong một trang web, một bộ Selector gồm phần tử và giá trị đó được gọi là Pattern Selector. CSS Selector được xây dựng trên nguyên tắc sử dụng các thẻ của HTML, bao gồm thuộc tính và giá trị của mỗi thẻ. Nhìn chung, công cụ này cung cấp những chức năng tương tự như XPath trong việc lựa chọn, lấy ra các phần của một trang HTML, chủ yếu lấy dựa vào các thiết kế như màu của các thành phần trong trang web. Khi sử dụng bộ CSS Selector không cần biết trước nội dung mà chúng lấy được sẽ có cấu trúc như thế nào. Vì các trang HTML trình bày theo các node tách biệt, nên CSS Selector sẽ duyệt qua từng node và trả về nội dung mà chúng ta mong muốn.

Nhưng chúng ta phải biết được node mà mình muốn trích xuất.

Quy tắc xác định

CSS Selector có thể định vị phần tử dựa vào ID, lớp hoặc tên của phần tử đó.

10

Hình 2.1: Các quy tắc xác định CSS Selector Trong đó:

- CSS Selector ID: tìm kiếm phần tử dựa vào ID.

- CSS Selector Class: tìm kiếm phần tử dựa vào tên Class.

- CSS Selector Attribute: tìm kiếm phần tử dựa vào thuộc tính, cặp thuộc tính và giá trị của phần tử.

- CSS Selector ID/Class and attribute: kết hợp tìm kiếm dựa vào cả ba yếu tố trên.

- CSS Selector Sub-string: tìm kiếm phần tử dựa vào các chuỗi con.

- CSS Selector Inner text: giúp xác định và tạo các CSS Selector theo mẫu của tag HTML.

Mục đích sử dụng:

Selector dùng để truy xuất dữ liệu từ đến các thẻ HTML. Trong một file HTML có rất nhiều thẻ giống nhau và thông thường chúng ta sẽ đặt các ID, Class cho các thẻ để phân biệt, vì vậy trong CSS sẽ dựa vào các ID và class đó để truy xuất tới và cách truy xuất đó ta gọi là Selector.

Cách lấy

Cách lấy CSS Selector trên trình duyệt: Chuột phải nhấn “Kiểm tra/Inspect” ® Chọn phần tử cần lấy ® “Copy Selector”.

Sử dụng selector trong Scrapy

Để lấy các nodes văn bản:

Bảng 2.1: Sử dụng CSS Selector trong Scrapy

Sử dụng Ví dụ Ý nghĩa

::text - response.css(‘title::text’).get() - Lấy 1 node văn bản.

*::text - response.css(‘#imagetitle *::text’).get() - Lấy tất cả các node văn bản.

- response.css('img::text').getall() - Trả về văn bản trống foo::text - response.css('img::text').get(default='') ngay phi phần tử tồn

tại

a::attr(href) - response.css('a::attr(href)').getall() - Lấy giá trị thuộc tính - [a.attrib['href'] for a in response.css('a')] href của liên kết con.

- response.css('base').attrib - Trả về 1 từ điển với - response.css('base').attrib['href'] thuộc tính đầu tiên.

Chọn theo ID hoặc - response.css('img').attrib['src']

SelectorList chọn 1 phần tử duy

nhất trên trang.

- response.css('foo').attrib - Trả về

rỗng(empty).{}

Regular - response.xpath('//a[contains(@href, - Trả về 1 danh sách

"image")]/text()').re(r'Name:\s*(.*)') các chuỗi Unicode.

expressions

.re() - response.xpath('//a[contains(@href, - Trả về chuỗi đầu

"image")]/text()').re_first(r'Name:\s*(.*)') tiên.

Lưu ý:

.get() và .getall():

- .get()luôn trả về một kết quả duy nhất

- .getall() luôn trả về danh sách tất cả các kết quả được trích xuất.

.extract() và .extract_first()

- Với .extract() không phải lúc nào cũng rõ ràng nếu kết quả là 1 danh sách hoặc không phải 1 danh sách để có được một kết quả duy nhất .extract()

hoặc .extract_first() nên được gọi.

b. Xpath

Định nghĩa

Xpath (XML Path Language) là viết tắt của ngôn ngữ đường dẫn XSLT. Sử dụng syntax “path like” xác định và navigate nodes trong XML. Xpath có chưa hơn 200 hàm dựng sẵn, là một yếu tố chính trong tiêu chuẩn XSLT.

Mục đích sử dụng:

Xpath được thiết kế ra với mục đích giúp cho ứng dụng có thể di chuyển bên trong XML document và truy xuất các giá trị cũng như thuộc tính của các elements. Nó được sử dụng khá phổ biến để duyệt và tìm kiếm các thuộc tính hay các phần tử cụ thể với các pattern phù hợp trong một file XML. Có thể tạo một truy vấn XPath để tìm các bảng cụ thể, tìm đến các hàng cụ thể, hoặc tìm các ô của một bảng có các thuộc tính nhất định.

Đây cũng là một cách để chia nhỏ nội dung trong một trang web cụ thể nào đó.

Cách lấy Xpath

Cách lấy Xpath trên trình duyệt: Chuột phải nhấn “Kiểm tra/Inspect” ® Chọn phần tử cần lấy ® “Copy Xpath”.

Sử dụng Xpath trong Scrapy

Bảng 2.2: Sử dụng Xpath trong Scrapy

Sử dụng Ví dụ Ý nghĩa

- response.xpath('//div[@id="not- - Trả về none nếu None exists"]/text()').get() is None không tìm thấy

- response.xpath('//div[@id="not- phần tử nào.

exists"]/text()').get(default='not-found')

/text() - response.xpath('//span/text()').get() - Trả về văn bản - Selector(text=body).xpath('//span/text()').get() bên trong thẻ.

13

//a/@href - response.xpath("//a/@href").getall() - Lấy giá trị của

hay thuộc tính.

@attributes

- for p in - for p in divs.xpath('p'): - Trích xuất tất cả

divs.xpath

... print(p.get() thẻ p.

('p'):

...

print(p.get ())

- response.css('img').xpath('@src').getall() - Trả về 1 danh sách từ thuộc tính src.

- [img.attrib['src'] for img in response.css('img')] - Truy vấn các

SelectorList thuộc tính bằng

.attrib của a .

- response.css('img').attrib['src'] - Trả về thuộc

tính phần tử đầu tiên.

c. Scrapy Framework

Scrapy là một Framework ứng dụng thu thập dữ liệu từ các trang web và trích xuất dữ liệu có cấu trúc, các ứng dụng hữu ích: khai thác dữ liệu, xử lý thông tin hoặc lưu trữ lịch sử.

Scrapy ban đầu được thiết kế cho việc rút trích web, nó cũng có thể được sử dụng để trích xuất dữ liệu bằng cách sử dụng các API (dịch vụ web của Amazon Associates) hoặc như một trình thu thập thông tin web với mục đích chung.

Kiến trúc Scrapy:

Hình 2.2: Thành phần chính và cách thức hoạt động của Scrapy Framework [7]

Thành phần gồm 5 thành phần chính như trên:

- Scheduler: như một hàng đợi (queue), sắp xếp thứ tự các URL cần tải.

- Downloader: thực hiện tải dữ liệu từ trang web, quản lý các lỗi khi tải, chống trùng lắm và cung cấp cho Engine.

- Spiders: là Class được viết bởi người dùng, nhiệm vụ bóc tách dữ liệu thành các mục (item) và các yêu cầu (request) cần thiết và tạo các url mới để nạp lại cho scheduler qua engine.

- Item Pipeline: dữ liệu được bóc tách từ spiders sẽ đưa đến đây, Item pipeline có nhiệm vụ xử lý chúng và lưu vào cơ sở dữ liệu.

- Scrapy Engine: kiểm soát luồng dữ liệu giữa tất cả các thành phần của hệ thống và kích hoạt các sự kiện khi một số hành động xảy ra.

- Middlewares: thành phần nằm giữa Engine với các thành phần khác, có mục đích giúp người dùng có thể tùy biến, mở rộng khả năng xử lý cho các thành phần:

+ Spider middlewares: thành phần nằm giữa Eninge và Spiders, xử lý các response đầu vào của Spiders và đầu ra (Item và các URL mới).

15

+ Downloader middlewares: nằm giữa Engine và Downloader, xử lý các request được đẩy vào từ Engine và các response được tạo ra từ Downloader.

+ Scheduler middlewares: nằm giữa Engine và Scheduler để xử lý những requests giữa hai thành phần.

Luồng dữ liệu

- Bước 1: Một website bắt đầu được rút trích, Engine xác định tên miền, tìm vị trí của Spider đó và yêu cầu spider đó tìm các URL xuất phát từ (start_url) đầu tiên, tạo thành một yêu cầu (request) lưu trong Scheduler.

- Bước 2: Engine nhận danh sách các URL từ Spider, gửi Scheduler để sắp xếp.

- Bước 3: Engine yêu cầu danh sách cách URL tiếp theo từ Scheduler.

- Bước 4: Engine nhận danh sách các URL tiếp theo từ Scheduler vào gửi đến Downloader (requests).

- Bước 5: Downloader nhận request và thực hiện việc tải trang, sau khi tải xong sẽ tạo một response và gửi lại Engine.

- Bước 6: Respone từ Dowloader sẽ được Engine đẩy qua Spiders để xử lý.

- Bước 7: Tại Spiders, khi nhận được response, chúng bóc tách thông tin từ response và những URL có khả năng để crawl và đẩy lại cho Engine (requests).

- Bước 8: Engine nhận được kết quả từ Spiders sẽ thực hiện 2 công việc: đẩy những dữ liệu đã được bóc tách tới Item Pipeline để xử lý và lưu vào Databases, đẩy những URL mới (requests) mới về Scheduler và quay về bước 3.

Cài đặt Scrapy

Thư viện Scrapy được viết bằng Python, để sử dụng chúng ta cần cài đặt thông qua pip (hệ thống quản lý package), Anacoda hoặc Minicoda (hệ thống quản lý các thư viện mã nguồn mở và môi trường làm việc) bằng lệnh:

Pip install scrapy

#Hoặc

Conda install –c scrapinghub scrapy

Lưu ý:

• Nếu sử dụng conda để cài đặt, chúng ta sẽ phải tải và cài đặt Anaconda/Miniconda.

• Đối với hệ điều hành Windows nếu như bạn cài đặt Scrapy (đã cài đặt Python trước đó) bằng pip trước khi cài Scrapy bạn phải cài pypiwin32 bằng lệnh:

pip install pypiwin32

Cấu trúc cây thư mục của một project scrapy:

- scrapy startproject <Tên project>

Hình 2.3: Cấu trúc của một Scrapy project

Người lập trình có thể viết mã nguồn rút trích dữ liệu từ các trang web khác nhau.

Các file đó được đặt trong thư mục spiders của project, tại đây chúng ta sử dụng Xpath, Css Selector,… rút trích dữ liệu của trang web. Ta cung cấp cho Scrapy một URL để bắt đầu rút trích thông tin, sau đó có thể chỉ định các ràng buộc về số lượng URL chúng ta muốn rút trích. Tuyệt nhiên, trong khoảng thời giờ nhất định Scrapy có số lượng yêu cầu từ một địa chỉ IP quá cao, có thể địa chỉ IP sẽ bị chặn trong một thời gian. Nếu xảy ra trường hợp chặn IP, tại file setting.py chúng ta đặt lại các thông số phù hợp hơn

CONCURRENT_REQUESTS_PER_DOMAIN hoặc

CONCURRENT_REQUESTS_PER_IP xuống một số nhỏ hơn. Một tùy chọn khác là làm tăng thời gian giữa các yêu cầu được gửi: thay đổi thông số DOWNLOAD_DELAY sang một giá trị lớn hơn chẳng hạn.

d. Một số phương thức

Trong khi thực hiện rút trích dữ liệu từ web người lập trình có thể dùng một số phương thức tích hợp để thuận tiện cho việc xử lý chuỗi dữ liệu. Một số phương thức

17

được sử dụng chính trong bài được liệt kê bên dưới, ngoài ra có còn rất nhiều phương thức khác mà lập trình viên có thể tham khảo nhiều hơn tại [13].

.replace(): dùng để thay thế một cụm từ được chỉ định hoặc cụm từ cụ thể.

- Syntax của replace(): str.replace(old, new [, count]) - Phương thức này có tối đa 3 tham số:

+ old: chuỗi cũ muốn thay thế.

+ new: chuỗi con mới sẽ thay thế chuỗi cũ.

+ count (tùy chọn): số lần muốn thay thế chuỗi cũ bằng chuỗi mới.

Nếu count không được chỉ định, phương thức sẽ thay thế tất cả các lần xuất hiện của chuỗi con cũ bằng chuỗi con mới. Trả về giá trị là một bản sao của chuỗi trong đó chuỗi cũ được thay thế bằng chuỗi mới. Chuỗi ban đầu không thay đổi.

Discout = item.css( "a > p > span.sale-tag.sale-tag- square::text").get()

if Discout is not None:

Discout1 = Discout.replace(u'\n', '').replace(u'-', '').replace(u'.', '').replace(u'%', '')

.find(): dùng để tìm kiếm một ký tự hoặc kí tự cụ thể trong một chuỗi.

if (ProductName.find("Samsung") >= 0 or

ProductName.find("SamSung") >= 0 or ProductName.find( "samsung")

>= 0 or ProductName.find("SAMSUNG") >= 0):

Manufacture = 3

Một phần của tài liệu Đề tài hệ thống mua sắm thông minh (Trang 22 - 31)

Tải bản đầy đủ (DOCX)

(100 trang)
w