首页 > 解决方案 > 如何抓取ajax返回的网页内容?

问题描述

这是我要抓取的页面 https: //www.racing.com/form/2018-11-06/flemington/race/7/results 在此处输入图像描述 比赛结果信息不在源代码中。

我在 Chrome DevTools 中尝试过,但没有找到包含结果的响应数据。

以下是源代码中的一些代码:

ng-controller="formTabResultsController" 
ng-init="meet=5149117;race=7;init();" ajax-loader="result"

我认为结果被返回并保存在“结果”结构中,因为有很多这样的:“result.PrizeMoney”“result.Record”。

那么如何使用 Python 获取结果的数据呢?谢谢。

标签: pythonajaxweb-scrapinggraphql

解决方案


站点在https://graphql.rmdprod.racing.com. API 密钥需要通过标头发送 &在此处检索。

的示例:

api_key=$(curl -s "https://www.racing.com/layouts/app.aspx" | \
          sed -nE 's/.*headerAPIKey:\s*"(.*)"/\1/p')

curl -s "https://www.racing.com/layouts/app.aspx"
query='query GetMeeting($meetCode: ID!) {
  getMeeting(id: $meetCode) {
    id
    trackName
    date
    railPosition
    races {
      id
      raceNumber
      status
      tempo
      formRaceEntries {
        id
        raceEntryNumber
        horseName
        silkUrl
        jockeyName
        trainerName
        scratched
        speedValue
        barrierNumber
        horse {
            name
            fullName
            colour
        }
      }
    }
  }
}'
variables='{ "meetCode": 5149117 }'
curl -G 'https://graphql.rmdprod.racing.com' \
     --data-urlencode "query=$query" \
     --data-urlencode "variables=$variables" \
     -H "X-Api-Key: $api_key" | jq '.'

一起使用:

import requests
import re
import json

r = requests.get("https://www.racing.com/layouts/app.aspx")
api_key = re.search(".*headerAPIKey:\s*\"(.*)\"", r.text).group(1)

query= """query GetMeeting($meetCode: ID!) {
  getMeeting(id: $meetCode) {
    id
    trackName
    date
    railPosition
    races {
      id
      raceNumber
      status
      tempo
      formRaceEntries {
        id
        raceEntryNumber
        horseName
        silkUrl
        jockeyName
        trainerName
        scratched
        speedValue
        barrierNumber
        horse {
            name
            fullName
            colour
        }
      }
    }
  }
}"""
payload = {
    "variables": json.dumps({ 
        "meetCode": 5149117 
    }), 
    "query": query
}
r = requests.get(
    'https://graphql.rmdprod.racing.com', 
    params = payload,
    headers = {
        "X-Api-Key": api_key
    })
print(r.json())

推荐阅读