Python中哪个更好:urllib2、PycURL还是mechanize?
我想用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中请求方式支持的说明。
8 个回答
Python的requests库也是处理HTTP请求的一个不错选择。我觉得它的接口更友好,下面是他们官方文档中的一个HTTP请求示例:
>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.content
...
我觉得这场演讲(在2009年的pycon上)能给你想要的答案(Asheesh Laroia在这方面经验丰富)。他指出了你列出的内容中好的和不好的地方。
这是PYCON 2009的日程安排:
你是否遇到过需要提取数据的网站?如果你能通过编程的方式将数据输入到那些不太欢迎机器人的网页应用中,你的生活会不会简单一些?
我们将讨论网页抓取的基础知识,然后深入不同方法的细节,以及它们最适用的场景。
你将了解到何时使用不同的工具,并学习到一个我在电子前沿基金会的项目中学到的“重锤”抓取方法。
如果可能的话,参与者应该带上笔记本电脑,以便尝试我们讨论的示例,并可以选择做笔记。
更新:Asheesh Laroia更新了他在2010年pycon上的演讲。
PyCon 2010:抓取网页:编程那些不期待被抓取的网站的策略
* 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 - 网页抓取:可靠高效地从不期待被抓取的页面提取数据
有趣的信息被困在网页和HTML表单后面。在这个教程中,你将学习如何解析这些页面,以及何时应用一些高级技术,使抓取更快更稳定。我们将讨论使用Twisted、gevent等进行并行下载;分析SSL后的网站;使用Selenium驱动JavaScript网站;以及如何躲避常见的反抓取技术。
urllib2
是每个 Python 安装包里都有的,所以它是一个很好的起点。PycURL
对于那些已经习惯使用 libcurl 的人来说很有用,它能让你接触到更多 HTTP 的底层细节,而且还会包含 libcurl 的修复和改进。mechanize
则像浏览器一样,可以持续保持连接。
这并不是说哪个更好,而是要根据工作需要选择合适的工具。