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


72

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

包含在Python中:

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

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

全功能:

机械化-可以使用/保存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和机械化两者似乎都很流行,是否缺少某些东西(即,如果我使用urllib2,我是否会在某个时候画一个角?)。我真的很想就这些事情的利弊提供一些反馈,以便为自己做出最佳选择。

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


3
“最佳”是什么意思?关于什么最好?最快的?最大?最佳使用Cookies?你需要做什么?
S.Lott

1
httplib不被“弃用”。这是urllib2之上构建的较低级别的模块。您可以直接使用它,但通过urllib2可以更轻松
Corey Goldberg 2010年

1
Corey所说的,例如urllib3是httplib之上的一层。另外,不建议使用httplib2-实际上,它比urllib2更新,并修复了连接重用之类的问题(与urllib3相同)。

12
有一个更新的库,称为请求。参见docs.python-requests.org/en/latest/index.html
ustun 2011年

1
在此使用@ustun:使用请求。
hughdbrown 2012年

Answers:


35
  • urllib2 可以在随处可见的每个Python安装中找到,因此是一个良好的起点。
  • PycURL 对于已经习惯使用libcurl的人很有用,它公开了HTTP的更多低级细节,此外,它还获得了应用于libcurl的任何修复或改进。
  • mechanize 用于像浏览器一样持续驱动连接。

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


我已经在我的python应用程序中实现了httplib2。httplib2是否支持NTLM?如果不是,我必须为NTLM身份验证做什么?注意:我发现httplib2不支持NTLM。
TinTin

2
@Ayyappan urllib3通过contrib子模块具有NTLM支持:urllib3 / contrib / ntlmpool.py
shazow 2011年

45

我认为这个演讲(在pycon 2009上)可以为您寻找的答案提供答案(Asheesh Laroia在此问题上有很多经验)。他指出了您大多数清单中的优点和缺点

根据PYCON 2009时间表:

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

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

您将了解何时应用不同的工具,并了解我在Electronic Frontier Foundation的一个项目中挑选的用于屏幕抓取的“重锤”。

参加者应尽可能携带一台笔记本电脑尝试我们讨论的示例并做笔记。

更新: 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表单的后面。在本教程中,您将学习如何解析这些页面,以及何时应用使刮擦更快,更稳定的高级技术。我们将介绍Twisted,gevent等并行下载。分析SSL背后的网站;用Selenium驱动JavaScript-y网站;>规避常见的防刮擦技术。


对于那些没有时间听演讲的人来说,总结演讲建议的两三个句子会很棒。:-)
布兰登·罗兹

39

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

请求内部使用urlib3
Yuvaraj Loganathan

3

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

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

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

事情不应该这样。不在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, ...}

2

不用担心“最新更新”。在过去的几年中,HTTP并没有太大改变;)

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

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


1
请求在存储cookie时也很有用。对于请求,您可以创建一个新会话,然后调用sessionName.get()而不是request.get()。Cookies将被存储在您的会话中。例如,使用会话登录网站后,您就可以使用会话作为登录用户执行其他http请求。
wp-overwatch.com 2012年

2

Urllib2仅支持HTTP GET和POST,可能有解决方法,但是如果您的应用程序依赖于其他HTTP动词,则您可能会希望使用其他模块。



@Piotr Dobrogost。还是很真实的。在无法用于urllib2.urlopen生成HEAD请求之前,该请求不受支持。创建自定义子类!=HEAD支持。我可以创建一个int生成的子类HTML,但是说pythonint可以生成就没有意义HTML
mikerobi 2011年

在不支持使用urllib2.urlopen生成HEAD请求之前,该请求不被支持。是什么让你这么想的?创建一个自定义子类!= HEAD支持。urllib2缺少HEAD支持的哪一部分?
Piotr Dobrogost 2011年

1
@Piotr Dobrogost,我想是因为API不支持它。如果您能指出ullib2.urlopen产生非GET或POST请求的示例,我将删除答案。
mikerobi 2011年

1

每个使用HTTP的python库都有其自身的优势。

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

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


请求在后台使用urllib3。
wp-overwatch.com 2012年

1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.