Cách trích xuất dữ liệu từ Web sử dụng GraphQL bằng Python

Trong bài viết này, Thanh sẽ chia sẻ với các bạn cách trích xuất dữ liệu từ Website load dữ liệu qua GraphQL sử dụng ngôn ngữ lập trình Python. Bài viết nằm trong Series 3 bài viết về chủ đề trích xuất dữ liệu từ GraphQL, các bạn có thể theo dõi 2 bài còn lại ở địa chỉ sau đây:

Lưu ý Bài viết này trình bày kiến thức nâng cao về Python và cơ chế tải dữ liệu của trang Web, hãy đảm bảo bạn có kiến thức cơ bản để có thể hiểu và áp dụng cho trường hợp của bạn. Kiến thức về trích xuất dữ liệu từ nhiều nguồn online được Thanh trình bày hệ thống và cơ bản hơn trong hai khóa học sau đây, các bạn có thể tham khảo:

Mục tiêu trích xuất là dữ liệu trên trang Axie.zone. Kiến thức cơ bản về cơ chế tải dữ liệu của Web được trình bày trong bài viết đầu tiên trong Series, các bạn có thể theo dõi lại bài viết này.

Đoạn code Python sử dụng để trích xuất dữ liệu từ trang Web trên như bên dưới. Đoạn code Python này, các bạn có thể sử dụng kỹ thuật được trình bày ở các video trước kết hợp với kiến thức về sử dụng công cụ Postman để dễ dàng tạo ra được đoạn code chính xác mà không cần phải tự tay viết ra.

YouTube video
import requests
import json

url = "https://axieinfinity.com/graphql-server-v2/graphql"

payload = json.dumps({
  "operationName": "GetAxieBriefList",
  "query": "query GetAxieBriefList($auctionType: AuctionType, $criteria: AxieSearchCriteria, $from: Int, $sort: SortBy, $size: Int, $owner: String) { axies(auctionType: $auctionType, criteria: $criteria, from: $from, sort: $sort, size: $size, owner: $owner) {   total   results {     ...AxieBrief     __typename   }   __typename }       }       fragment AxieBrief on Axie { id name stage class breedCount image title genes battleInfo {   banned   __typename } auction {   currentPrice   currentPriceUSD   __typename } stats {   ...AxieStats   __typename } parts {   id   name   class   type   specialGenes   __typename } __typename       }            fragment AxieStats on AxieStats {        hp        speed        skill        morale __typename       }",
  "variables": {
    "auctionType": "Sale",
    "criteria": {
      "classes": [
        "Dusk"
      ],
      "parts": [
        "mouth-tiny-turtle",
        "mouth-tiny-carrot",
        "mouth-dango",
        "horn-lagging",
        "horn-laggingggggg",
        "back-snail-shell",
        "back-starry-shell",
        "tail-thorny-caterpillar",
        "tail-thorny-catterpilar"
      ],
      "hp": None,
      "speed": [
        46,
        61
      ],
      "skill": None,
      "morale": None,
      "breedCount": None,
      "pureness": [],
      "numMystic": [],
      "title": None,
      "region": None,
      "stages": [
        3,
        4
      ]
    },
    "from": 24,
    "size": 12,
    "sort": "PriceAsc",
    "owner": None
  }
})
headers = {
  'authority': 'axieinfinity.com',
  'sec-ch-ua': '"Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"',
  'accept': '*/*',
  'content-type': 'application/json',
  'sec-ch-ua-mobile': '?0',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',
  'sec-ch-ua-platform': '"macOS"',
  'origin': 'https://axie.zone',
  'sec-fetch-site': 'cross-site',
  'sec-fetch-mode': 'cors',
  'sec-fetch-dest': 'empty',
  'referer': 'https://axie.zone/',
  'accept-language': 'en-US,en;q=0.9,vi;q=0.8'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)