我正在尝试从航班搜索中下载结果,但是我一直得到的文件与通过右键单击并手动存储站点所获得的文件不同。我已经尝试过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或一些自定义标头或cookie等。

在这种情况下,通常有两种一般的处理方式:


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


requests(通常与BeautifulSoup结合使用)
mechanize
mechanicalsoup
robobrowser

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

关于python - urllib下载与我手动执行的文件不同的文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25943216/

10-13 08:26