0

我有以下代码:

#!/usr/bin/env python
from mechanize import Browser
from BeautifulSoup import BeautifulSoup

mech = Browser()
mech.set_handle_robots(False)
url = "http://storage.googleapis.com/patents/retro/2011/ad20111231-02.zip"
page = mech.open(url)
html = page.read()

soup = BeautifulSoup(html)
print soup.prettify()

非常简单的网络爬虫试图从网页下载 .zip 文件。当我运行这段代码并记住这个文件是 4kb 时,程序只是没有完成,就好像它处于无限循环中一样。我在这里做了什么?

4

1 回答 1

2

在你做完print html你的page.read(). 您可能没有得到您所想的,听起来您收到的是错误页面而不是文件本身。我不确定您是否正确处理了文件,您可能会在这里找到更好的方法:使用 Python 下载网页上的所有链接(相关文档)

zip 文件不是 4KB,顺便说一句,它约为 87MB,包含一个784MB的XML 文件,您应该可以通过在浏览器中点击该 URL 并下载它来确认。问题可能不是无限循环,只是需要很长时间才能加载。

当数据是 zip-archived XML 时,您还尝试将数据作为 HTML 传递。如果(一旦您实际拥有该文件)将响应数据存储在 a 中StringIO,您将能够将其解压缩到内存中(如此处所述)。然后,您需要明确告知BeautifulSoup您正在向其传递 XML。

soup = BeautifulSoup(html, 'xml')

这将要求您安装 lxml,但这对您有利,因为它可能是 Python 下最快的 XML 解析器。

最后一件事:

mech.set_handle_robots(False)
url = "http://storage.googleapis.com/patents/retro/2011/ad20111231-02.zip"

我的印象是谷歌设置了他们robots.txt尽可能禁止抓取。如果您仍然无法下载该文件的副本,我建议您尝试Selenium;它很像mechanize但控制实际的浏览器,如 Chrome 和 Firefox,所以这将是一个合法的浏览器请求。

于 2012-10-11T00:11:20.663 回答