Scrapy – Cào dữ liệu từ file JSON

Rate this post

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
...
5 1 vote
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments