首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >urllib下载的文件与我手动下载的文件不同。

urllib下载的文件与我手动下载的文件不同。
EN

Stack Overflow用户
提问于 2014-09-19 22:24:12
回答 1查看 70关注 0票数 1

我试图从一个航班搜索下载结果,但我一直得到一个不同的文件,我可以通过右键点击和存储网站手动获得。我已经尝试过urlliburllib2和我在这里找到的所有命令都没有用。

这是一辆MWE:

代码语言:javascript
复制
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()

其他尝试:

代码语言:javascript
复制
# 1
f = urllib.urlopen(url)

# 2
req = urllib2.Request(url)
f = urllib2.urlopen(req)

# 3
urllib.urlretrieve(url, "temp.del")

如果我将所获得的文件与上述命令中的任何一个进行比较,它将不同于通过右键单击和“另存为”下载它的文件。

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-19 22:28:43

这是因为在浏览器端加载和呈现页面的情况更多。可以使用异步请求来加载附加数据,执行的javascript代码等urllib/urllib2首先只获得浏览器接收的初始HTML页面。

此外,正如@tdelaney所指出的,服务器还可以进行额外的检查,比如检查您的User-Agent、一些自定义的标头或cookie等等。

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

  • 研究什么负责在页面上请求和显示所需的数据,并在代码中模拟这些请求/逻辑。有大量的库可能适用于您的情况:
代码语言:javascript
复制
- [requests](http://docs.python-requests.org/en/latest/) (typically in conjunction with [`BeautifulSoup`](http://www.crummy.com/software/BeautifulSoup/bs4/doc/))
- [mechanize](http://wwwsearch.sourceforge.net/mechanize/)
- [mechanicalsoup](https://github.com/hickford/MechanicalSoup)
- [robobrowser](https://github.com/jmcarp/robobrowser)

  • 利用真正的浏览器,让它构建页面,然后从HTML中检索您需要的数据。这就是selenium包会有所帮助的地方。

例如,下面是如何使用selenium + Firefox web驱动程序获得每个结果的总价:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25943216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档