使用Python请求刮擦飞行数据

时间:2017-12-09 13:14:12

标签: python python-requests

以下网址显示了一个航班并提供了更多详细信息(例如,切换到" 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搜索提供三个文件,它们包含我想要的内容,但我的想法已经用完,如何获取它们。访问数据的正确方法是什么?

3 个答案:

答案 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