2010-03-05 37 views
71

好的,我需要使用Python下载一些网页,并对我的选项进行了快速调查。哪个在Python中最好:urllib2,PycURL还是机械化?

包括在Python:

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

urllib2 - 完整的HTTP/FTP客户端,支持cookies等)

全功能:

mechanize - 可以使用/保存火狐/ IE的cookies,需要像跟随第二环节,积极维护(0.2.5于2011年3月发布)的行动

PycURL - 支持curl所做的一切(FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和L DAP),坏消息是:没有更新自2008年9月9日(7.19.0)

新的可能性:

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

已过时(亦称使用的urllib/urllib2的替代):

httplib - HTTP/HTTPS(不使用FTP)

httplib2 - HTTP/HTTPS(不使用FTP)

令我惊讶的是,urllib的/ urllib2的第一件事/ PycURL /机械化都是相当成熟的解决方案,运行良好。机械化和PycURL附带许多Linux发行版(例如Fedora 13)和BSD,所以安装通常不是问题(所以这很好)。

urllib2看起来不错,但我想知道为什么PycURL和机械化两者似乎非常受欢迎,有没有我缺少的东西(即如果我使用urllib2我会在某个角落画一个角落?)。我真的很喜欢这些东西的利弊反馈,所以我可以为自己做出最好的选择。

编辑:在urllib2的

+3

“最好”是什么意思?最好的是什么?最快的?最大?最好使用Cookie?你需要做什么? – 2010-03-05 11:03:40

+1

httplib不是“已弃用”。它是urllib2构建于其上的较低级别的模块。你可以直接使用它,但通过urllib2 – 2010-03-05 16:48:11

+1

更容易。 urllib3是httplib之上的一个图层。此外,httplib2不被弃用 - 实际上它比urllib2更新,并修复了连接重用问题(与urllib3相同)。 – Yang 2011-04-21 01:03:49

回答

34
  • urllib2对动词的支持补充说明在每个Python发现安装无处不在,所以是对其开始了良好的基础。
  • PycURL对于已经习惯使用libcurl的人很有用,它暴露了更多低级别的HTTP细节,并且可以获得应用于libcurl的任何修复或改进。
  • mechanize用于持久驱动连接,非常像浏览器。

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

+0

我在我的python应用程序中实现了httplib2。 httplib2是否支持NTLM ?. 如果不是我必须为NTLM身份验证做什么? 注意:我发现httplib2不支持NTLM。 – TinTin 2011-01-25 06:03:12

+2

@Ayyappan urllib3通过contrib子模块支持NTLM:[urllib3/contrib/ntlmpool.py](http://code.google.com/p/urllib3/source/browse/urllib3/contrib/ntlmpool.py?spec = svn308cfcafd2c78e4158397c0d29de667f3f387335&r = 308cfcafd2c78e4158397c0d29de667f3f387335) – shazow 2011-07-27 01:38:11

44

我认为这个演讲(在pycon 2009上)有你要找的答案(Asheesh Laroia在这件事上有很多经验)。他指出,从大部分的上市

的好的和坏的从PYCON 2009年时间表:

你找到你自己面临着 有你需要的数据的网站 提取? 你的生活会更简单,如果 你可以编程输入数据 到Web应用程序,甚至那些 调整抵制机器人的交互?

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

你会离开 用时应用 不同的工具有所了解,并了解如何在 “重锤”的屏幕抓取 ,我在为 电子前沿基金会的一个项目回升。

参加者应该带一台笔记本电脑,如果 可能,尝试我们 讨论和任意记笔记的例子。

更新: Asheesh Laroia已经更新了他的演讲的PYCON 2010

  • PyCon 2010: Scrape the Web: Strategies for programming websites that don't expected it

    * 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:

精彩信息被困在网页和HTML表格后面。在本教程中,>您将学习如何解析这些页面以及何时应用高级技术,以便更快,更稳定地进行抓取。我们将介绍Twisted,gevent和其他人的并行下载;分析SSL背后的网站;用Selenium驾驶JavaScript-y网站;和>避开常见的防刮技术。

+3

我希望我也可以接受这个答案。很棒的介绍! – bigredbob 2010-03-05 21:08:48

+0

总结谈话建议的两三句话对于那些没有时间倾听的人来说会很棒。 :-) – 2010-10-27 01:05:27

+0

断开链接... – Sheena 2013-08-26 11:00:58

2

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

urllib2是最好的(因为它是内置的),然后切换到机械化,如果你需要从Firefox的cookie。 mechanize可以用作urllib2的直接替代品 - 它们具有类似的方法等。使用Firefox cookies意味着您可以使用您的个人登录凭据从网站(比如说StackOverflow)获取内容。只是对你的请求数量负责(或者你会被阻止)。

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

+1

请求在存储Cookie时也很有用。用请求创建一个新的会话,然后调用sessionName.get()而不是requests.get()。 Cookies将被存储在你的会话中。例如,一旦您使用会话登录网站,您将可以使用会话以登录用户身份执行其他http请求。 – 2012-06-11 17:18:33

2

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

+2

不正确。参见[Python - 与urllib2的HEAD请求](http://stackoverflow.com/questions/4421170/) – 2011-04-29 19:06:49

+0

@Piotr Dobrogost。仍然非常真实。直到你可以使用'urllib2.urlopen'来生成一个'HEAD'请求,它不受支持。创建一个自定义的子类!='HEAD'支持。我可以创建一个生成“HTML”的“int”子类,但是说python“int”可以生成“HTML”是没有意义的。 – mikerobi 2011-04-29 20:44:26

+0

*直到你可以使用urllib2.urlopen来产生一个HEAD请求,它不被支持。*什么让你这么认为? *创建一个自定义子类!= HEAD支持* * HEAD支持*的哪部分是urllib2缺失? – 2011-04-29 22:39:52

1

说到HTTP的每个python库都有自己的优点。

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

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

+0

添加到列表中,谢谢! – bigredbob 2010-11-30 09:05:48

+0

请求在引擎盖下使用urllib3。 – 2012-06-11 17:20:46

38

Python requests也是一个很好的候选HTTP的东西。它有一个更好的API恕我直言,从他们的offcial文档的HTTP请求示例:

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

请求在内部使用urlib3 – 2013-09-24 07:26:14

1

拿上抢的样子(http://grablib.org)。这是一个网络库,其提供两个主接口: 1)抓斗,用于创建网络请求和解析检索到的数据 2)蜘蛛用于创建批量站点刮刀

引擎盖下抓斗使用pycurl和LXML但也可以使用其他网络传输(例如请求库)。请求运输尚未经过充分测试。

3

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

从:

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