以下网址显示了一个航班并提供了更多详细信息(例如,切换到" Flugweg"或" Statistik"在左侧)。我想阅读这些数据,然后将其转换为列表。
https://www.onlinecontest.org/olc-2.0/gliding/flightinfo.html?dsId=6188729
所以我到目前为止所做的是以下内容:
import requests
API_url = "https://www.onlinecontest.org/olc-2.0/gliding/dataprov.html"
response = requests.post(API_url)
做一个response.text给了我一个回页,基本上告诉我"请求的页面不存在"。
然后我尝试添加标题信息,因为我读到有时这是拒绝请求的原因:
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
"Referer":"https://www.onlinecontest.org/olc-2.0/gliding/flightinfo.html?dsId=6188729",
"Origin":"https://www.onlinecontest.org"}
然后
response = requests.post(API_url, headers = headers)
这并没有改变什么,只是在浑浊的水域钓鱼。
使用Chrome for XHR搜索提供三个文件,它们包含我想要的内容,但我的想法已经用完,如何获取它们。访问数据的正确方法是什么?
答案 0 :(得分:2)
如您所说,该页面会发出3个XHR请求。您可以使用POST发出这些请求。您只需要为有效负载获取正确的参数。您可以使用BeautifulSoup和urllib执行此操作,如果您尚未安装,可能需要安装它。这适用于Python 3,Python 2具有不同的urllib实现。
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs
# Get the web page.
url = "https://www.onlinecontest.org/olc-2.0/gliding/flightinfo.html?dsId=6188729"
page = requests.get(url).text
# Extract the first parameter you need for the POST request from the URL.
parsed_url = urlparse(url)
id = parse_qs(parsed_url.query)['dsId'][0]
print (id) # 6188729
# Get the first XML.
payload = {'nature':'dsstat','id': id}
data1 = requests.post("https://www.onlinecontest.org/olc-2.0/gliding/dataprov.html", data =payload)
print (data1.text)
# Get the ref attribute for the second POST request using BeautifulSoup.
soup = BeautifulSoup(page, 'html.parser')
dsstat = soup.find("meta", {'name':"og:image"})
parsed_url = urlparse(dsstat['content'])
ref = parse_qs(parsed_url.query)['ref'][0]
print (ref) # 977301232
# Get the second XML.
payload = {'nature':'track','ref': ref}
data2 = requests.post("https://www.onlinecontest.org/olc-2.0/gliding/dataprov.html", data =payload)
print (data2.text)
# Get the thrd XML. The id is the first ID + 1.
id2 = (int (id) + 1)
print (id2) # 6188730
payload = {'nature':'dsstat','id':id2}
data3 = requests.post("https://www.onlinecontest.org/olc-2.0/gliding/dataprov.html", data =payload)
print (data3.text)
答案 1 :(得分:0)
您尝试的网址返回404.请检查浏览器中的网址。请试试这个:
page_url = ""https://www.onlinecontest.org/olc-2.0/gliding/dataprov.html?nature=track&ref=977301232""
response = requests.get(page_url)
添加了在检查时显示的额外参数(“自然”和“参考”)。使用url传递给我们返回xml数据。也许我们可以使用python的Elementree来解析XML数据。
答案 2 :(得分:0)
此页面的竞争是由javascript生成的。为了抓取内容,您需要使用一些处理和呈现javascript生成对象的工具,即Selenium。