我正在尝试从航班搜索中下载结果,但我通过右键单击并手动存储站点来获取与我可以获得的文件不同的文件。我已经尝试了urllib
,urllib2
,我在这里找到的每一个命令都无济于事。
这是一个MWE:
import urllib2
import urllib
url = "https://ar.aeromexico.com/search/flight/RoundTrip/EZE/MEX/2014-12-10/2015-01-25/1/0/0?"
# Get data.
f = urllib2.urlopen(url)
# Write to file.
s = f.read()
f.close()
ff = open("temp.del", "w")
ff.write(s)
ff.close()
其他尝试:
# 1
f = urllib.urlopen(url)
# 2
req = urllib2.Request(url)
f = urllib2.urlopen(req)
# 3
urllib.urlretrieve(url, "temp.del")
如果我将我获得的文件与上述任何命令进行比较,则与我通过右键单击并“另存为”下载的文件不同。
我做错了什么?
答案 0 :(得分:2)
这是因为在浏览器端加载和呈现页面还有很多事情要发生。可以asynchronous requests加载其他数据,执行javascript代码等urllib
/ urllib2
只获取浏览器首先收到的初始HTML页面。
此外,正如@tdelaney所说,服务器可以应用其他检查,例如检查User-Agent
,或某些自定义标头或Cookie等。
在这种情况下,通常有两种常规方法:
研究负责在页面上请求和显示所需数据的内容,并在代码中模拟这些请求/逻辑。有很多库可能适用于您的情况:
利用真正的浏览器,让它构建页面,然后从HTML中检索所需的数据。这是selenium
包有用的地方。
例如,以下是使用selenium
+ Firefox
网络驱动程序获取每个结果总价的方法:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("https://ar.aeromexico.com/search/flight/RoundTrip/EZE/MEX/2014-12-10/2015-01-25/1/0/0?")
results = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'results')))
for price in results.find_elements_by_class_name('total-price'):
print price.text.strip()
driver.close()
打印U$S 2.147
。