2011-12-20 6 views
3

私はいくつかのURLに基​​づいてウェブサイトからいくつかのWebページをダウンロードするためにpythonでクローラを作成しました。私はときどき私のプログラムが "conn.getresponse()"という行でハングアップすることに気付きました。例外は投げられず、プログラムは単にそこまで待っていました。conn.getresponse()(httplib.HTTPConnection)にぶら下がってはいけない

conn = httplib.HTTPConnection(component.netloc) 
conn.request("GET", component.path + "?" + component.query) 
resp = conn.getresponse() #hang here 

私はAPIドキュメントを読んで、それが(タイムアウトを追加する)ことを言う:

conn = httplib.HTTPConnection(component.netloc, timeout=10) 

しかし、それは私が接続し、「再試行」することはできません。タイムアウト後にクロールを再試行するベストプラクティスは何ですか?右方向に

trials = 3 
while trials > 0: 
    try: 
     ... code here ... 
    except: 
     trials -= 1 

アムI:

例えば、私は、次の解決策を考えていますか?

+0

時々、PythonライブラリがいくつかのヘッダーをWebブラウザとは異なる解釈をすることがあります([この質問](http://stackoverflow.com/q/8527862/183066)で起こったように)。したがって、確かに、私はあなたがウェブブラウザで同じURLを開こうとすることができると思います。 – jcollado

答えて

1

ただし、接続を「再試行」することはできません。

はい、タイムアウトは、このポリシーが属する場所(コード内ではhttplibの範囲外)にプッシュするように設計されています。

タイムアウト後にクロールを再試行するベストプラクティスは何ですか?

非常にアプリケーションに依存します。あなたのクローラは他の仕事をどれくらい延期できますか?どのくらいひどくそれが各サイトに深く入り込むようにしたいですか?低速でオーバーサブスクライブしているサーバーに耐えることができる必要がありますか?クローラに遭遇したときにスロットルやその他の対策を実施しているサーバーはどうですか?私が尋ねる間に、あなたはrobots.txtを尊重していますか?

これらの質問に対する回答は大きく異なる可能性があるので、これをクローラのニーズ、クロールする傾向のあるサイト(傾向があると仮定した場合)、WANパフォーマンスに合わせて調整することは理にかなっています。

関連する問題