Python 中哪个最好:urllib2、PycURL 或 mechanize?
Posted
技术标签:
【中文标题】Python 中哪个最好:urllib2、PycURL 或 mechanize?【英文标题】:Which is best in Python: urllib2, PycURL or mechanize? 【发布时间】:2011-01-24 01:24:28 【问题描述】:好的,所以我需要使用 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 中添加了关于动词支持的注释
【问题讨论】:
“最好”是什么意思?最好在什么方面?最快的?最大的? Cookie 的最佳用途?你需要做什么? httplib 没有被“弃用”。它是 urllib2 构建在其之上的较低级别的模块。你可以直接使用它,但通过 urllib2 更容易 科里所说的,例如urllib3 是 httplib 之上的一层。此外,httplib2 并没有被弃用——实际上它比 urllib2 更新,并且修复了连接重用等问题(与 urllib3 相同)。 有一个更新的库叫做 requests。见docs.python-requests.org/en/latest/index.html 在此使用@ustun:使用请求。 【参考方案1】:我认为这个演讲(在 pycon 2009 上)可以找到您正在寻找的答案(Asheesh Laroia 在这方面有很多经验)。他从您的大部分列表中指出了好与坏
Scrape the Web: Strategies for programming websites that don't expect it (Part 1 of 3) Scrape the Web: Strategies for programming websites that don't expect it (Part 2 of 3) Scrape the Web: Strategies for programming websites that don't expect it (Part 3 of 3)来自 PYCON 2009 时间表:
你是否发现自己面临着 拥有您需要的数据的网站 提炼? 如果你的生活会更简单 您可以以编程方式输入数据 进入网络应用程序,甚至那些 调整为抵抗机器人交互?
我们将讨论网络的基础知识 刮,然后潜入 不同方法的详细信息以及在哪里 它们是最适用的。
你会离开 了解何时申请 不同的工具,并了解 刮屏的“重锤” 我在一个项目中捡到的 电子前沿基金会。
参加者应携带笔记本电脑,如果 可能,尝试我们的例子 讨论并选择性地做笔记。
更新: 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 表单后面。在本教程中,>您将学习如何解析这些页面以及何时应用使 >scraping 更快、更稳定的高级技术。我们将介绍 Twisted、gevent 等的并行下载;分析 SSL 背后的网站;使用 Selenium 驱动 JavaScript-y 网站;和 >规避常见的反刮擦技术。
【讨论】:
两三句话总结演讲的建议会很棒,对于那些没有时间听的人来说。 :-)【参考方案2】:要“获取一些网页”,请使用 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, ...
【讨论】:
【参考方案3】:看看 Grab (http://grablib.org)。它是一个网络库,提供两个主要接口: 1) Grab 用于创建网络请求和解析检索到的数据 2) 用于创建批量网站抓取工具的蜘蛛
在底层 Grab 使用 pycurl 和 lxml,但也可以使用其他网络传输(例如,请求库)。请求传输尚未经过良好测试。
【讨论】:
【参考方案4】: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
...
【讨论】:
请求内部使用 urllib3【参考方案5】:每个使用 HTTP 的 Python 库都有其自身的优势。
使用具有特定任务所需功能最少的那个。
您的列表至少缺少 urllib3 - 一个很酷的第三方 HTTP 库,它可以重用 HTTP 连接,从而大大加快了从同一站点检索多个 URL 的过程。
【讨论】:
requests 在后台使用 urllib3。【参考方案6】:Urllib2 仅支持 HTTP GET 和 POST,可能有一些变通方法,但如果您的应用依赖于其他 HTTP 动词,您可能会更喜欢不同的模块。
【讨论】:
不正确。见Python - HEAD request with urllib2 @Piotr Dobrogost。还是很真实的。在您可以使用urllib2.urlopen
生成HEAD
请求之前,它是不受支持的。创建自定义子类!= HEAD
支持。我可以创建一个int
子类来生成HTML
,但是说python int
可以生成HTML
是毫无意义的。
在您可以使用 urllib2.urlopen 生成 HEAD 请求之前,它是不受支持的。 是什么让您这么认为? 创建自定义子类!= HEAD 支持。 HEAD 支持 的哪一部分缺少 urllib2?
@Piotr Dobrogost,我认为是这样,因为 api 不支持它。如果您可以指出ullib2.urlopen
生成非 GET 或 POST 请求的示例,我将删除我的答案。【参考方案7】:
不用担心“上次更新”。 HTTP 在过去几年没有太大变化;)
urllib2 是最好的(因为它是内置的),如果您需要来自 Firefox 的 cookie,则切换到机械化。 mechanize 可以用作 urllib2 的替代品——它们具有类似的方法等。使用 Firefox cookie 意味着您可以使用您的个人登录凭据从站点(例如 ***)获取内容。只需对您的请求数量负责(否则您将被阻止)。
PycURL 适用于需要 libcurl 中所有低级内容的人。我会先尝试其他库。
【讨论】:
requests 在存储 cookie 中也很有用。使用请求创建一个新会话,然后调用 sessionName.get() 而不是 requests.get()。然后 Cookie 将存储在您的会话中。例如,一旦您使用会话登录到网站,您将能够使用您的会话作为登录用户执行其他 http 请求。【参考方案8】:urllib2
可以在任何地方的每个 Python 安装中找到,因此是一个很好的起点。
PycURL
对于已经习惯使用 libcurl 的人很有用,它公开了更多 HTTP 的低级细节,此外它还获得了适用于 libcurl 的任何修复或改进。
mechanize
用于持续驱动连接,就像浏览器一样。
这不是一个比另一个更好的问题,而是为工作选择合适的工具的问题。
【讨论】:
我已经在我的 python 应用程序中实现了 httplib2。 httplib2 是否支持 NTLM?如果不是我必须为 NTLM 身份验证做什么?注意:我发现 httplib2 不支持 NTLM。 @Ayyappan urllib3 通过 contrib 子模块支持 NTLM:urllib3/contrib/ntlmpool.py以上是关于Python 中哪个最好:urllib2、PycURL 或 mechanize?的主要内容,如果未能解决你的问题,请参考以下文章