我正在尝试下载航类搜索结果,但我不断收到一个与通过右键单击并手动存储网站获得的文件不同的文件。我已经尝试过 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")
如果我将我获得的文件与上述任何命令进行比较,它与我通过右键单击并“另存为”下载的文件不同。
我做错了什么?
最佳答案
这是因为在浏览器端加载和渲染页面时发生了很多事情。可以有 asynchronous requests加载附加数据、执行 JavaScript 代码等 urllib
/urllib2
仅获取浏览器首先接收到的初始 HTML 页面。
此外,正如@tdelaney 指出的,服务器可能会应用其他检查,例如检查您的User-Agent
,或一些自定义 header 或 cookie 等。
在这种情况下,通常有两种通用方法:
研究什么负责请求并在页面上显示所需的数据,并在代码中模拟这些请求/逻辑。有大量的库可能适用于您的情况:
- requests (通常与
BeautifulSoup
结合使用) - mechanize
- mechanicalsoup
- robobrowser
- requests (通常与
使用真正的浏览器,让它构造页面,然后从 HTML 中检索所需的数据。这就是
selenium
包会有帮助。
例如,以下是如何使用 selenium
+ Firefox
Web 驱动程序获取每个结果的总价格:
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()
打印 2.147 美元
。
关于python - urllib 下载的文件与我手动下载的文件不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25943216/