哪一个在 Python 中是最好的: urllib2、 PycURL 还是機械化?

好的,我需要下载一些使用 Python 的网页,并对我的选项做了一个快速调查。

包括 Python:

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

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

全部特色:

Machize -可以使用/保存 Firefox/IE cookie,采取如 follow second link 等行动,积极维护(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/機 ize 都是非常成熟的解决方案,运行良好。若干 Linux 发行版(例如 Fedora 13)和 BSD 都附带了機 ize 和 PycURL,所以安装通常是不成问题的(所以这是好事)。

urllib2 looks good but I'm wondering why PycURL and mechanize both seem very popular, is there something I am missing (i.e. if I use urllib2 will I paint myself in to a corner at some point?). I'd really like some feedback on the pros/cons of these things so I can make the best choice for myself.

编辑: 在 urllib2中添加动词支持说明

33824 次浏览
  • 在任何地方的每个 Python 安装中都可以找到 urllib2,因此它是一个很好的开始基础。
  • 对于已经习惯使用 libcurl 的人来说,PycURL非常有用,它公开了更多 HTTP 的底层细节,而且它获得了应用于 libcurl 的任何修复或改进。
  • mechanize用于像浏览器一样持久地驱动连接。

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

我认为这个演讲(在 pycon 2009) ,有你正在寻找的答案(Asheesh Laroia 在这个问题上有很多经验)。他指出了你大部分的优点和缺点

来自 PYCON 2009时间表:

你发现自己面对的是 你需要提供资料的网站 提取物? 如果你的生活 你可以通过程序输入数据 网络应用程序,甚至那些 能够抵抗机器人的互动?

我们将讨论网络的基础知识 然后一头扎进 不同方法的详情及地点 它们是最适用的。

你会离开的 懂得什么时候申请 不同的工具,并学习 “重锤”刮网 我在一个项目中学到的 电子前哨基金会。

参加者应携带笔记本电脑 我们可以试试这些例子 讨论并随意做笔记。

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

Update 2:

PyCon US 2012 - Web scraping: Reliably and efficiently pull data from pages that don't expect it

Exciting information is trapped in web pages and behind HTML forms. In this tutorial, >you'll learn how to parse those pages and when to apply advanced techniques that make >scraping faster and more stable. We'll cover parallel downloading with Twisted, gevent, >and others; analyzing sites behind SSL; driving JavaScript-y sites with Selenium; and >evading common anti-scraping techniques.

不要担心“上次更新”,HTTP 在过去的几年里没有太大的变化;)

Urllib2是最好的(因为它是内置的) ,然后切换到机械化,如果你需要来自 Firefox 的 cookie。机械化可以作为一个下降替代 urllib2-他们有类似的方法等。使用 Firefox cookie 意味着你可以使用你的个人登录凭证从站点(比如 StackOverflow)获取信息。只要对你的请求数量负责(否则你会被阻止)。

PycURL 是为那些需要 libcurl 中所有底层内容的人准备的。

Urllib2只支持 HTTPGET 和 POST,可能有一些变通方法,但是如果您的应用程序依赖于其他 HTTP 谓词,那么您可能更喜欢不同的模块。

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

使用具有特定任务所必需的最少数量的特性。

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

Python 请求也是 HTTP 内容的一个很好的候选者。它有一个更好的 api IMHO,一个来自官方文档的 http 请求示例:

>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.content
...

让我们来看看 Grab ( http://grablib.org ) ,它是一个网络库,提供了两个主要的界面: 1)抓取用于创建网络请求和解析检索到的数据 2)用于创建批量现场刮板机的蜘蛛

在这个架构下,Grab 使用 pycurl 和 lxml,但是也可以使用其他网络传输(例如,请求库)。请求传输尚未得到很好的测试。

要“获得一些网页”,使用 请求

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

Python 的标准 urllib2模块提供了大部分 HTTP 你所需要的能力,但是 API 已经完全被破坏了 一个不同的时代ーー一个不同的网络。它需要一个巨大的 工作量(甚至方法重写) ,以执行最简单的 任务。

事情不应该是这样的,不应该是巨蟒。

>>> 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, ...}