哪个在Python中最好:urllib2,PycURL还是机械化?

时间:2010-03-05 10:02:49

标签: python urllib2 mechanize pycurl

好的,我需要使用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都是非常成熟的解决方案,效果很好。机械化和PycURL随附了许多Linux发行版(例如Fedora 13)和BSD,因此安装通常不是问题(这样很好)。

urllib2看起来不错,但我想知道为什么PycURL和机械化看起来都非常受欢迎,是否有一些我缺少的东西(即如果我使用urllib2,我会在某个时候把自己画到一个角落?)。我真的很喜欢这些事情的优点/缺点的反馈,所以我可以为自己做出最好的选择。

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

8 个答案:

答案 0 :(得分:45)

我认为这次演讲(在2009年的pycon上)有你想要的答案(Asheesh Laroia在此事上有很多经验)。他指出了你大部分上市的好与坏

来自PYCON 2009时间表:

  

你发现自己面对   拥有您需要的数据的网站   提取?   如果你的生活会更简单吗?   您可以以编程方式输入数据   进入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:

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

  

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

答案 1 :(得分:39)

Python requests也是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
...

答案 2 :(得分:35)

    每个Python安装中都可以找到
  • urllib2,所以这是一个很好的基础。
  • PycURL对于已经习惯使用libcurl的用户非常有用,它会暴露更多HTTP的低级细节,并且会获得应用于libcurl的任何修复或改进。
  • mechanize用于持久驱动连接,就像浏览器一样。

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

每个讲HTTP的python库都有自己的优势。

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

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

答案 7 :(得分:1)

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

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