python - urllib 下载的文件与我手动下载的文件不同

标签 python url urllib2 urllib

我正在尝试下载航类搜索结果,但我不断收到一个与通过右键单击并手动存储网站获得的文件不同的文件。我已经尝试过 urlliburllib2 以及我在这里找到的每个命令都无济于事。

这是一个 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 等。

在这种情况下,通常有两种通用方法:

  • 研究什么负责请求并在页面上显示所需的数据,并在代码中模拟这些请求/逻辑。有大量的库可能适用于您的情况:

  • 使用真正的浏览器,让它构造页面,然后从 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/

相关文章:

Python: Pandas 中的数据框操作和聚合

python - PyMongo,绘图

python - 如何在 python 中高效地多线程或多进程处理大型 itertools.combinations?

php - 当字符串变量中有 URL 时,如何在 PHP 中使用 parse_url?

python - 废料 : how to pass multiple setting values to scrapy service

json - 从 JSON 字符串中删除反斜杠?

python - pip install bs4 给出 _socketobject 错误

javascript - 无需哈希或正则表达式的替代单页应用程序路由机制

java - 带有中文字符的无效 URI (Java)

python - 使用来自用户的 url 的服务器端 urllib2.urlopen 的安全注意事项