72

わかりましたので、Python を使用していくつかの Web ページをダウンロードする必要があり、オプションを簡単に調査しました。

Python に含まれるもの:

urllib - 代わりに urllib2 を使用する必要があるようです。urllib は Cookie をサポートしておらず、HTTP/FTP/ローカル ファイルのみ (SSL なし)

urllib2 - 完全な HTTP/FTP クライアントで、Cookie などの最も必要なものをサポートしますが、すべての HTTP 動詞をサポートしているわけではありません (GET と POST のみ、TRACE などはサポートしていません)。

フル機能:

mechanize - Firefox/IE の Cookie を使用/保存でき、2 番目のリンクをたどるなどのアクションを実行でき、積極的にメンテナンスされています (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 の動詞サポートに関するメモを追加

4

8 に答える 8

45

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

PYCON 2009 スケジュールから:

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

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

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

出席者は、可能であれば、ここで説明する例を試し、必要に応じてメモを取るために、ラップトップを持参する必要があります。

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

  • PyCon 2010: Scrape the 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 サイトを駆動する。>一般的なアンチスクレイピング技術を回避します。

于 2010-03-05T10:48:30.370 に答える
39

Pythonリクエストも、HTTP の良い候補です。公式ドキュメントからのhttpリクエストの例である、より優れたAPI IMHOがあります。

>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.content
...
于 2012-01-08T04:32:34.933 に答える
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, ...}
于 2013-01-19T23:02:41.573 に答える
2

「最終更新日」について心配する必要はありません。HTTPはここ数年あまり変わっていません;)

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

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

于 2010-03-05T11:09:02.760 に答える
2

Urllib2 は HTTP GET と POST のみをサポートしています。回避策があるかもしれませんが、アプリが他の HTTP 動詞に依存している場合は、別のモジュールを使用することをお勧めします。

于 2010-03-05T14:10:29.830 に答える
1

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

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

于 2012-06-19T09:00:37.973 に答える
1

HTTP を使用するすべての Python ライブラリには、独自の利点があります。

特定のタスクに必要な最小限の機能を備えたものを使用してください。

あなたのリストには、少なくともurllib3がありません。これは、HTTP 接続を再利用できるクールなサードパーティの HTTP ライブラリです。これにより、同じサイトから複数の URL を取得するプロセスが大幅に高速化されます。

于 2010-08-04T03:27:06.553 に答える