1

特定のURLセットをスキャンして、Pythonで「200OK」などのHTTPステータスコードを取得する必要があります。私は現在、これを行うためにurllibを使用しています。これを行うためのより速い方法はありますか?

Pythonコード

def get_status(url):
try:
    return urllib.urlopen(url).getcode()

except StandardError :
    return None
4

5 に答える 5

4

より幸せなステータスチェックのために私が作るカップルの発言。最初のヒントは、httpHEADメソッドを使用することです。これにより、サーバーはhttpヘッダー(ステータスコードを含む)のみを要求し、ページの本文も提供しません。

2番目のurllibは機能しますが、httpで実行したいほとんどすべてのことに対してはるかに優れたAPIを提供する素晴らしいRequestsライブラリを使用することをお勧めします。

最後に、geventsライブラリを使用して、各ヘッダーを非同期でダウンロードできるようにし、プロセス全体を大幅に高速化します。

于 2012-07-19T17:00:51.167 に答える
2

おそらく、非ブロッキングの方法で並行して実行したいと思うでしょう。ここでイベントレットライブラリをチェックしてください:http://eventlet.net/フロントページhttp://eventlet.net/#web-crawler-exampleから例を取得できます。

于 2012-07-19T16:58:17.267 に答える
2

速度を上げるには、GRequestsを使用してURLを非同期で(一度に1つずつではなく)チェックしてみてください。

コード

import grequests

urls = [
    'http://www.heroku.com',
    'http://tablib.org',
    'http://httpbin.org',
    'http://python-requests.org',
    'http://kennethreitz.com'
]

rs = (grequests.get(u) for u in urls)
# For even faster status code checks, use the HEAD method instead of GET
# rs = (grequests.head(u) for u in urls)

for r in grequests.map(rs):
    print r.status_code, r.url

出力

200 http://www.heroku.com/
200 http://tablib.org/
200 http://httpbin.org/
200 http://docs.python-requests.org/en/latest/index.html
200 http://kennethreitz.com/
于 2012-07-19T17:13:36.833 に答える
1

はいあります。

  1. 複数のスレッドを使用して、すべて同時に異なるURLをチェックします。
  2. 単純なHTTPリクエストを実装するrawソケットを使用します。200応答(またはその他のコード)を取得したらすぐに接続を閉じ、不要なデータ転送を回避します。
于 2012-07-19T16:59:16.440 に答える
0

スレッドを使用します。コードをThreadクラスに入れ、結果をグローバルオブジェクトに格納します。スレッドの束を呼び出します。

于 2012-07-19T16:59:11.867 に答える