web-dev-qa-db-ja.com

Pythonで最適なのは、urllib2、PycURL、mechanizeのどれですか?

[OK]ので、Python=を使用していくつかのWebページをダウンロードし、オプションの簡単な調査を行いました。

Pythonに含まれるもの:

rllib -代わりにurllib2を使用する必要があるように思えます。 urllibにはCookieのサポートはありません。HTTP/ FTP /ローカルファイルのみ(SSLなし)

rllib2 -完全な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)以降は更新されません

新しい可能性:

rllib -接続の再利用/プーリングおよびファイル投稿をサポート

非推奨(別名、代わりにurllib/urllib2を使用):

httplib -HTTP/HTTPSのみ(FTPなし)

httplib2 -HTTP/HTTPSのみ(FTPなし)

私が最初に気づいたのは、urllib/urllib2/PycURL/mechanizeがすべてうまく機能する非常に成熟したソリューションであるということです。 mechanizeとPycURLには多くのLinuxディストリビューション(Fedora 13など)とBSDが付属しているため、通常はインストールは問題になりません(これで問題ありません)。

urllib2は良いように見えますが、なぜPycURLとmechanizeの両方が非常に人気があるように思われますか?私はこれらのことの賛否両論についてのフィードバックが本当に欲しいので、自分のために最良の選択をすることができます。

編集:urllib2の動詞サポートに関する注記を追加

72
bigredbob
  • urllib2はすべてのPython install everywhereにあるため、開始するのに適したベースです。
  • PycURLはlibcurlの使用にすでに慣れている人々に役立ち、HTTPの低レベルの詳細を公開し、さらにlibcurlに適用された修正または改善を取得します。
  • mechanizeは、ブラウザのように接続を永続的に駆動するために使用されます。

それは、一方が他方より優れているという問題ではなく、仕事に適したツールを選択するという問題です。

この講演(pycon 2009)には、あなたが探しているものに対する答えがあると思います(Asheesh Laroiaには多くの経験があります)。そして彼はあなたのリストのほとんどから良い点と悪い点を指摘しています

PYCON 2009スケジュールから:

抽出する必要のあるデータがあるWebサイトに直面していますか? Webアプリケーションにプログラムでデータを入力できれば、ボットによる相互作用に抵抗するように調整されたものであっても、あなたの人生はよりシンプルになりますか?

Webスクレイピングの基本について説明した後、さまざまな方法の詳細と、それらが最も適切な場所について説明します。

さまざまなツールを適用するタイミングを理解し、Electronic Frontier Foundationのプロジェクトで取り上げたスクリーンスクレイピング用の「重いハンマー」について学びます。

可能であれば、参加者はラップトップを持参して、説明した例を試してみて、必要に応じてメモを取ってください。

更新:Asheesh Laroiaはpycon 2010のプレゼンテーションを更新しました

  • PyCon 2010:Webをスクレイプ:予期しない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スクレイピング:予期しないページからデータを確実かつ効率的にプル

エキサイティングな情報は、WebページとHTMLフォームの背後に閉じ込められています。このチュートリアルでは、これらのページを解析する方法と、スクレイピングをより速く、より安定させる高度な手法をいつ適用するかを学びます。 > Twisted、geventなどを使用した並列ダウンロードについて説明します。 SSLの背後にあるサイトの分析。 Seleniumを使用してJavaScript-yサイトを駆動します。 >一般的なスクレイピング技術の回避。

45
Diego Castro

Python requests も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
...
39
Tutul

「いくつかのWebページを取得」するには、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
mit

「最終更新」を心配しないでください。 HTTPはここ数年あまり変わっていません;)

(組み込みなので)urllib2が最適です。FirefoxからのCookieが必要な場合は、mechanizeに切り替えます。 mechanizeはurllib2のドロップイン代替として使用できます-同様の方法などがあります。FirefoxCookieを使用すると、個人のログイン資格情報を使用してサイト(StackOverflowなど)からアイテムを取得できます。リクエスト数に責任を負うだけです(またはブロックされます)。

PycURLは、libcurlの低レベルのものをすべて必要とする人々のためのものです。最初に他のライブラリを試します。

2
wisty

Urllib2はHTTP GETとPOSTのみをサポートしています。回避策があるかもしれませんが、アプリが他のHTTP動詞に依存している場合は、おそらく別のモジュールを好むでしょう。

2
mikerobi

Grab(http://grablib.org)をご覧ください。 2つの主要なインターフェイスを提供するネットワークライブラリです。1)ネットワークリクエストを作成し、取得したデータを解析するためのグラブ2)バルクサイトスクレーパーを作成するためのスパイダー

内部では、Grabはpycurlとlxmlを使用しますが、他のネットワークトランスポート(要求ライブラリなど)を使用することもできます。リクエストのトランスポートはまだ十分にテストされていません。

1