【问题标题】:Python web scraping pausesPython 网页抓取暂停
【发布时间】:2012-10-01 11:56:03
【问题描述】:

我有以下代码:

#!/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 时,程序只是没有完成,就好像它处于无限的 while 循环中一样。我在这里做了什么?

【问题讨论】:

  • 您等了多长时间?我刚刚尝试使用timeit (python -m timeit -n 1 -r 1 -s "import requests" "r = requests.get('http://storage.googleapis.com/patents/retro/2011/ad20111231-02.zip').content") 花了 113 秒。你至少等了那么久吗?

标签: python beautifulsoup mechanize


【解决方案1】:

尝试在完成page.read() 之后输入print html。您可能没有得到您所想的,听起来您收到的是错误页面而不是文件本身。我不确定您是否正确处理了文件,您可能会在这里找到更好的方法:Download all the links(related documents) on a webpage using Python。

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

当数据是 zip-archived XML 时,您还尝试将数据作为 HTML 传递。如果(一旦您真正拥有该文件)您将响应数据存储在StringIO 中,您将能够将其解压缩到内存中(as outlined here)。然后,您需要 explicitly tell BeautifulSoup 告知您正在向其传递 XML。

soup = BeautifulSoup(html, 'xml')

这需要你install lxml,但这对你有利,因为它可能是 Python 下最快的 XML 解析器。

最后一件事:

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

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

【讨论】:

  • “当它是 XML 时,您还试图将数据作为 HTML 传递” - 他似乎没有先解压缩它,所以他实际上是在尝试解析可能没有帮助的 zip 文件。
猜你喜欢
  • 2021-01-12
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 2023-03-12
  • 2018-04-25
相关资源
最近更新 更多