Nếu bạn chưa biết JSON là gì thì có thể hiểu đơn giản nó là một quy tắc lưu trữ dữ liệu theo cú pháp sử dụng cặp dấu ngoặc nhọn {},
cú pháp này bắt nguồn từ Javascript.
Khi chúng ta truy cập một trang web, ngoài việc trang này tải về các trang HTML, CSS, Javascript, file ảnh…v.v thì cũng có nhiều khả năng là chúng cũng tải về các file JSON hoặc các request mà dữ liệu trả về là dạng JSON. Chẳng hạn như khi vào trang vnexpress.net, chúng ta có thể thấy các request đến URL /bid-request
trả về data là JSON:
Đây thực chất là data của các mạng quảng cáo có liên kết với VnExpress.
Trong phần này chúng ta sẽ cào data từ file json tại url sau:
https://www.learningcontainer.com/wp-content/uploads/2019/10/Sample-employee-JSON-data.json
File này có nội dung như sau:
{ "Employees": [ { "userId": "krish", "jobTitle": "Developer", "firstName": "Krish", "lastName": "Lee", "employeeCode": "E1", "region": "CA", "phoneNumber": "123456", "emailAddress": "krish.lee@learningcontainer.com" }, { "userId": "devid", "jobTitle": "Developer", "firstName": "Devid", "lastName": "Rome", "employeeCode": "E2", "region": "CA", "phoneNumber": "1111111", "emailAddress": "devid.rome@learningcontainer.com" }, { "userId": "tin", "jobTitle": "Program Directory", "firstName": "tin", "lastName": "jonson", "employeeCode": "E3", "region": "CA", "phoneNumber": "2222222", "emailAddress": "tin.jonson@learningcontainer.com" } ] }
Bây giờ chúng ta tạo một Spider bằng lệnh spidergen
với tên là api:
$ scrapy genspider api web
File api.py
được tạo ra trong thư mục spiders
, chúng ta sửa lại như sau:
# -*- coding: utf-8 -*- import scrapy import json class ApiSpider(scrapy.Spider): name = 'api' allowed_domains = ['web'] start_urls = ['https://www.learningcontainer.com/wp-content/uploads/2019/10/Sample-employee-JSON-data.json'] def parse(self, response): js = json.loads(response.body) employees = js["Employees"] for employee in employees: print(employee["firstName"], employee["lastName"], " - ", employee["jobTitle"])
Dữ liệu JSON có thể nói là loại cấu trúc dữ liệu dễ cào nhất nếu so sánh với HTML, vì chúng ta không cần phải viết XPath hay CSS. Thêm vào đó Python có thư viện json
, chúng ta chỉ cần gọi phương thức loads()
và đưa vào chuỗi JSON là mọi thứ đã hoàn thành. Việc còn lại là chỉ cần đưa vào key để lấy data mà chúng ta cần.
Chạy đoạn code trên chúng ta được kết quả như sau:
$ scrapy crawl api ... DEBUG: Crawled (200) <GET https://www.learningcontainer.com/...data.json> (referer: None) Krish Lee - Developer Devid Rome - Developer tin jonson - Program Directory ...