Chào mọi người, mấy hôm nay mình có tìm hiểu được 1 chút về Scrapy nên muốn viết vài dòng để xem mình đã học được những gì và làm 1 bản demo nho nhỏ
Giả sử giới thiệu này đang có nhiều tiền muốn nhập Macbook về bán lấy hời, và giờ muốn nghiên cứu những cửa hàng khác họ bán những con Macbook nào và giá bóng rổ làm sao thì chả nhẽ mình phải lên trang web của họ rồi xem trực tiếp từng cái . Không phải đâu, mình muốn xem những dữ liệu đó theo dạng thống kê báo cáo cho chuyên nghiệp thay vì phải click từng sản phẩm để xem thủ công, vừa đau mắt vừa vừa thời gian. Phải nghĩ ngay tới việc sử dụng Scrapy sẽ giúp mình thu thập dữ liệu của các em Macbook về và xuất ra định dạng json, csv,… trực quan hơn và dễ thao tác để thống kê báo cáo hơn
Giờ thì cùng mình tìm hiểu và thực hiện demo 1 chút, và ở demo này mình sẽ thu thập dữ liệu cơ bản của mấy em Macbook trên thegioididong xem sao nhé
Trước tiên, vì scrapy là 1 framework của python nên chúng ta cần cài đặt python, scrapy cái đã. Vui lòng làm theo các bước trên trang chủ của scrapy để tiến hành cài đặt nhé
Tiếp theo, mình sẽ tạo dự án phế liệu với tên là tutorial
bằng câu lệnh sau
1
2
scrapy startproject demo_ scrapy
Hướng dẫn dự án mà chúng ta vừa tạo có cấu trúc như sau
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
demo_scrapy/
phế liệu. cfg # tệp cấu hình triển khai
demo_scrapy/ # mô-đun Python của dự án, bạn'
__init__. py
mặt hàng. py # tệp định nghĩa hạng mục dự án
phần mềm trung gian. py # tệp phần mềm trung gian của dự án
đường ống. py # tệp quy trình dự án
cài đặt. py # tệp cài đặt dự án
nhện/ # thư mục nơi bạn sẽ
__init__. py
2. Tạo con nhện
Sau khi đã tạo xong dự án thì giờ chúng ta cần tạo 1 con spider để tiến hành thu thập dữ liệu bằng câu lệnh sau
1
2
scrapy genspider macbook_tgdd www. thegioididong. com/máy tính xách tay-apple-macbook
Lệnh trên đã tạo ra 1 con nhện MacbookTgddSpider
trong thư mục con nhện như sau
1
2
3
4
5
6
7
8
9
10
nhập phế liệu
class MackbookTgddSpider[scrapy. Con nhện].
tên = 'macbook_tgdd'
allowed_domains = ['www. thegioididong. com']
start_urls = ['https. //www. thegioididong. com/laptop-apple-macbook/']
def parse[self, response]:
vượt qua
Như bạn đã thấy
- Con spider này có tên là
macbook_tgdd
sẽ được sử dụng để chạy cmd khi thu thập dữ liệu start_urls
. đây là địa chỉ bắt đầu cho spider, có thể là một danh sách các url tương ứng với tên miền trongallowed_domains
. Ở bản demo này mình sẽ bắt đầu ở link các sản phẩm Macbookparse[]
. Chính là chức năng mình sẽ viết code để điều khiển spider đi thu thập dữ liệu mà mình muốn lấy về từ url phía trên
Đầu tiên, chúng ta cần xác định trước dữ liệu mà chúng ta muốn là gì. Ở đây mình cần thống kê thị trường Macbook được bán tại thegioididong nên mình sẽ thu thập tên sản phẩm, giá gốc, giá bán và lượng bình chọn trung bình của từng em Macbook. Sau khi đã lên ý tưởng về những mục muốn thu thập thông tin thì công việc tiếp theo là xác định những mục đó trong tệp items.py
như sau
1
2
3
4
5
6
7
8
nhập phế liệu
class DemoScrapyItem[scrapy. Mục].
product_name = scrapy. Trường[]
price_sale =phế liệu. Trường[]
giá = phế liệu. Trường[]
rate_average = scrapy. Trường[]
Giờ thì bắt tay vào việc chính thôi, để thu thập dữ liệu đúng mục mình cần thì các bạn phải chọn đúng đối tượng đó trên DOM. Có thể sử dụng Css selector hay Xpath đều được, tuy nhiên mỗi cái đều có ưu nhược điểm riêng nên các bạn tự tham khảo để sử dụng cho phù hợp nhé
Ở bản demo này, mình sẽ sử dụng bộ chọn Css để chọn những mục mà mình muốn lấy, bật kiểm tra và sao chép bộ chọn của những mục đó như sau
Thực hiện lần lượt với các mục tiếp theo, sau một mã khôi phục, tệp spiders/macbook_tgdd.py
của mình sẽ như sau
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
nhập phế liệu
từ demo_scrapy. mục nhập DemoScrapyItem
class MacbookTgddSpider[scrapy. Con nhện].
tên = 'macbook_tgdd'
allowed_domains = ['www. thegioididong. com']
start_urls = ['https. //www. thegioididong. com/laptop-apple-macbook/']
def parse[self, response]:
# Yêu cầu tới từng sản phẩm có trong danh sách Macbook dựa trên href
cho item_url trong phản hồi.css["li. mục > một. attr[href]"]. giải nén[].
sản lượng phế liệu. Yêu cầu[phản hồi. urljoin[item_url], . callback=self.parse_macbook] # Nếu có product thì sẽ gọi hàm parse_macbook
# nếu có sản phẩm tiếp theo thì tiếp tục thu thập dữ liệu
trang_tiếp theo = phản hồi. css["li. tiếp theo > một. attr[href]"]. extract_first[]
if trang_tiếp theo.
sản lượng phế liệu. Yêu cầu[phản hồi. liên kết url[trang_tiếp theo], . callback=self.phân tích cú pháp]
def parse_macbook[self, response]:
item = DemoScrapyItem[]
mặt hàng['product_name'] = response.css[
'div. hàng đầu > h1. văn bản']. extract_first[] # Tên macbook
hết hàng = phản hồi. css['span. trạng thái sản phẩm. văn bản']. extract_first[] # Tình trạng còn hàng hay không
if hết hàng.
mặt hàng['price'] = response.css[
'strong. giá bán. văn bản']. extract_first[]
khác.
mặt hàng['price'] = response.css[
'sang một bên. price_sale > div. khu vực_giá. không áp dụng > mạnh mẽ. văn bản']. extract_first[]
discount_online = phản hồi. css['div. hộp-trực tuyến. notapply']. extract_first[] # Kiểm tra xem có giảm giá khi mua trực tuyến hay không
if discount_online:
item['price_sale'] = response.css[
'sang một bên. price_sale > div. hộp-trực tuyến. notapply > div > mạnh mẽ. văn bản']. extract_first[]
khác.
item['price_sale'] = response.css[
'span. giá của anh ấy. văn bản']. extract_first[]
mặt hàng['rate_average'] = response.css['div. toprt > div. crt > div. attr[data-gpa]']. extract_first[]
sản lượng mặt hàng
Mình sẽ giải thích 1 chút đoạn mã phía trên
parse[]
. Do dữ liệu của từng sản phẩm nằm ngoài danh sách Macbook không thể đáp ứng đủ nhu cầu thu thập thông tin của mình nên cần vào link từng sản phẩm bên trong thẻli
ở trong danh sách đó, mỗili
chứa 1 sản phẩm. Dựa vào href của mỗi sản phẩm, mình sẽ gửiMacbookTgddSpider
1 tới url của sản phẩm đó và gọi tớiMacbookTgddSpider
2 để thực hiện thu thập dữ liệuMacbookTgddSpider
2. Ở hàm này, mình sẽ tiến hành thu thập dữ liệu những mục mà mình xác định trongMacbookTgddSpider
4. Vui lòng xem kỹ trang web và kiểm tra để chọn đúng mục đó trên DOM nhé. v, ví dụ như khi cửa hàng hết hàng thì bộ chọn giá sản phẩm sẽ khác, hoặc bộ chọn giá bán cũng sẽ khác khi mua hàng trực tuyến. Nên cân nhắc kỹ khi Copy selector chứ đừng copy luôn kẻo crawl không ra dữ liệu đúng nhé =]]
Giờ thì có thể thu hút dữ liệu của Macbook trên thegioididong về, Scrapy hỗ trợ xuất dữ liệu sang các định dạng khác nhau như JSON, CSV và XML. Tại mình quen nhìn JSON rồi nên ở đây mình sẽ xuất ra JSON. v
1
2
scrapy thu thập dữ liệu macbook_tgdd -o macbook_tgdd.json
Kết quả là mình bị lỗi 403. Do các trang web thường có cơ chế chặn bot thu thập dữ liệu của họ. Phải xử lý ngay lỗi này bằng cách cấu hình thêm MacbookTgddSpider
5 trong MacbookTgddSpider
6 mà Scrapy comment đi vào tệp MacbookTgddSpider
7 như sau, đồng thời các bạn cấu hình thêm utf-8 để tránh lỗi phông chữ nha
1
2
3
4
5
6
7
8
9
DEFAULT_REQUEST_HEADERS = {
# 'Chấp nhận'. 'văn bản/html,ứng dụng/xhtml+xml,ứng dụng/xml;q=0. 9,*/*;q=0. số 8',
# 'Ngôn ngữ chấp nhận'. 'en',
'Tác nhân người dùng'. 'Mozilla/5. 0 [X11; Linux x86_64; rv. 48. 0] Tắc kè/20100101 Firefox/48. 0',
}
FEED_EXPORT_ENCODING = 'utf-8'
Ok, giờ thì chạy lại lệnh thu thập thông tin trên xem thu được gì
Please check thủ công lại một chút so với web thegioididong xem mình đã crawl đúng hay chưa. v, sau khi check thì thấy một số MacbookTgddSpider
8 null do con Macbook đó không sale được, còn MacbookTgddSpider
9 null thì do con Macbook đó không có ai rate luôn. v, but back thì đều khớp 100%. Thế là thành công rồi đó =]]
Như vậy là mình đã thu thập được 1 số thông tin giúp ích cho việc nghiên cứu thị trường để kinh doanh Macbook của mình rồi, tuy nhiên đây chỉ là 1 bản demo cơ bản và số lượng Macbook được bán tại thegioididong vẫn còn ít bạn nên xem . v
Lưu ý một chút là bài viết của mình chỉ có thể thu thập dữ liệu được trong thời điểm mình viết bài, các bạn cần theo dõi cập nhật giao diện từ thegioididong xem họ có thay đổi HTML hay không để chỉnh lại bộ chọn cho phù hợp, tránh trường
Cảm ơn các bạn đã chiến thắng thời gian đọc bài viết của mình, nếu có gì còn thiếu sót, đóng góp ý, các bạn có thể để lại bình luận bên dưới bài viết để nghiên cứu và cải thiện. [cây cung]