72

好的,所以我需要使用 Python 下载一些网页并快速调查我的选项。

包含在 Python 中:

urllib - 在我看来,我应该使用 urllib2 来代替。urllib 不支持 cookie,仅支持 HTTP/FTP/本地文件(无 SSL)

urllib2 - 完整的 HTTP/FTP 客户端,支持最需要的东西,比如 cookie,不支持所有 HTTP 动词(只有 GET 和 POST,没有 TRACE 等)

全功能:

mechanize - 可以使用/保存 Firefox/IE cookie,采取跟随第二个链接等操作,积极维护(2011 年 3 月发布的 0.2.5)

PycURL - 支持 curl 所做的一切(FTP、FTPS、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE 和 LDAP),坏消息:自 2008 年 9 月 9 日 (7.19.0) 以来未更新

新的可能性:

urllib3 - 支持连接重用/池和文件发布

已弃用(又名使用 urllib/urllib2 代替):

httplib - 仅 HTTP/HTTPS(无 FTP)

httplib2 - 仅 HTTP/HTTPS(无 FTP)

让我印象深刻的第一件事是 urllib/urllib2/PycURL/mechanize 都是非常成熟且运行良好的解决方案。mechanize 和 PycURL 附带许多 Linux 发行版(例如 Fedora 13)和 BSD,因此安装通常不是问题(这很好)。

urllib2 看起来不错,但我想知道为什么 PycURL 和 mechanize 看起来都非常受欢迎,我是否缺少一些东西(即,如果我使用 urllib2,我会在某个时候把自己画到一个角落吗?)。我真的很想得到一些关于这些东西的利弊的反馈,这样我就可以为自己做出最好的选择。

编辑:在 urllib2 中添加了关于动词支持的注释

4

8 回答 8

45

我认为这个演讲(在 pycon 2009 上)可以找到您正在寻找的答案(Asheesh Laroia 在这方面有很多经验)。他从您的大部分列表中指出了好与坏

来自 PYCON 2009 的时间表:

您是否发现自己面临需要提取数据的网站?如果您可以以编程方式将数据输入到 Web 应用程序中,即使是那些经过调整以抵抗机器人交互的应用程序,您的生活会变得更简单吗?

我们将讨论网络抓取的基础知识,然后深入探讨不同方法的细节以及它们最适用的地方。

您将了解何时应用不同的工具,并了解我在电子前沿基金会的一个项目中获得的用于屏幕抓取的“重锤”。

如果可能的话,与会者应带一台笔记本电脑来尝试我们讨论的示例并选择性地做笔记。

更新: Asheesh Laroia 更新了他的 pycon 2010 演示文稿

  • PyCon 2010:Scrape the Web:编程网站的策略出乎意料

    * My motto: "The website is the API."
    * Choosing a parser: BeautifulSoup, lxml, HTMLParse, and html5lib.
    * Extracting information, even in the face of bad HTML: Regular expressions, BeautifulSoup, SAX, and XPath.
    * Automatic template reverse-engineering tools.
    * Submitting to forms.
    * Playing with XML-RPC
    * DO NOT BECOME AN EVIL COMMENT SPAMMER.
    * Countermeasures, and circumventing them:
          o IP address limits
          o Hidden form fields
          o User-agent detection
          o JavaScript
          o CAPTCHAs 
    * Plenty of full source code to working examples:
          o Submitting to forms for text-to-speech.
          o Downloading music from web stores.
          o Automating Firefox with Selenium RC to navigate a pure-JavaScript service. 
    * Q&A; and workshopping
    * Use your power for good, not evil. 
    

更新 2:

PyCon US 2012 - Web 抓取:可靠且高效地从不期望的页面中提取数据

令人兴奋的信息被困在网页和 HTML 表单后面。在本教程中,>您将学习如何解析这些页面以及何时应用使 >scraping 更快、更稳定的高级技术。我们将介绍 Twisted、gevent 等的并行下载;分析 SSL 背后的网站;使用 Selenium 驱动 JavaScript-y 网站;> 规避常见的反刮擦技术。

于 2010-03-05T10:48:30.370 回答
39

Python请求也是 HTTP 的一个很好的候选者。它有一个更好的 api 恕我直言,一个来自他们官方文档的示例 http 请求:

>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.content
...
于 2012-01-08T04:32:34.933 回答
35
  • urllib2在任何地方的每个 Python 安装中都可以找到,因此是一个很好的开始基础。
  • PycURL对于已经习惯使用 libcurl 的人来说很有用,它公开了更多 HTTP 的低级细节,此外它还获得了适用于 libcurl 的任何修复或改进。
  • mechanize用于像浏览器一样持久地驱动连接。

这不是一个比另一个更好的问题,而是为工作选择合适的工具的问题。

于 2010-03-05T10:21:12.693 回答
3

要“获取一些网页”,请使用requests

来自http://docs.python-requests.org/en/latest/

Python 的标准 urllib2 模块提供了您需要的大部分 HTTP 功能,但 API 被彻底破坏了。它是为不同的时间和不同的网络而构建的。执行最简单的任务需要大量工作(甚至方法覆盖)。

事情不应该是这样的。不是在 Python 中。

>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}
于 2013-01-19T23:02:41.573 回答
2

不要担心“最后更新”。HTTP 在过去几年没有太大变化;)

urllib2 是最好的(因为它是内置的),如果您需要来自 Firefox 的 cookie,则切换到机械化。mechanize 可以用作 urllib2 的替代品——它们具有类似的方法等。使用 Firefox cookie 意味着您可以使用您的个人登录凭据从站点(例如 StackOverflow)获取内容。只需对您的请求数量负责(否则您将被阻止)。

PycURL 适用于需要 libcurl 中所有低级内容的人。我会先尝试其他库。

于 2010-03-05T11:09:02.760 回答
2

Urllib2 仅支持 HTTP GET 和 POST,可能有解决方法,但如果您的应用程序依赖于其他 HTTP 动词,您可能会更喜欢不同的模块。

于 2010-03-05T14:10:29.830 回答
1

每个使用 HTTP 的 Python 库都有自己的优势。

使用具有特定任务所需的最少功能的那个。

您的列表至少缺少urllib3 - 一个很酷的第三方 HTTP 库,它可以重用 HTTP 连接,从而大大加快了从同一站点检索多个 URL 的过程。

于 2010-08-04T03:27:06.553 回答
1

看看 Grab (http://grablib.org)。它是一个网络库,提供两个主要接口:1) Grab 用于创建网络请求和解析检索到的数据 2) Spider 用于创建批量站点抓取工具

Grab 在底层使用 pycurl 和 lxml,但可以使用其他网络传输(例如,请求库)。请求传输尚未经过良好测试。

于 2012-06-19T09:00:37.973 回答