2016-03-30 39 views
2

私はBeautifulSoupを使ってforループ内の数千のWebサイトを解析しています。ここに私のコードからの抜粋です:美味しいスープのスピードアップ

def parse_decision(link): 
    t1 = time.time() 
    decisionpage = urllib.urlopen(link) 
    t2 = time.time() 
    soup = BeautifulSoup(decisionpage.read(), 'lxml') 
    t3 = time.time() 
    # ... 
    # Parsing happens here and returns a pandas dataframe 

のコードが実行される永遠にかかるので、私は原因を調査し始め、BeautifulSoupはdecisionpageを読み取るためのにかかる時間は、多くの異なることがわかりました。ここでは、各ステップを完了するのにかかる秒の抜粋です:

Element | t2-t1 | t3-t2 
    1.  | 0.073 | 60.023 
    2.  | 0.096 | 0.005 
    3.  | 0.096 | 60.016 
    4.  | 0.064 | 0.006 

1が見ることができるようにウェブサイトが同じ形式で、ほぼ同じ情報が含まれている本家、およそ毎秒のウェブサイトは、60秒かかります。 ウェブサイトは、これと同じ裁判所の決定です: http://www.nycourts.gov/reporter/3dseries/2003/2003_17749.htm

誰もがこのパフォーマンスの違いがそれを克服するためにどのように可能性が存在し、その理由のアイデアを持っていますか?どんな助けでも大歓迎です。

+1

これはBeautifulSoupと関係がありますか? 60秒の数字を考えれば、あなたが掻いているウェブサイトがあなたを抑えていると思う傾向があります。 – user2357112

答えて

2

BeautifulSoupは遅く、decisionpage.read()です。

urllib.urlopenはソケットオブジェクトを返します。実際のhttp要求は.read()で発生します。したがって、ネットワークのどこかにあなたのボトルネックがあります。あなたのインターネット接続またはリモートWebサイトが遅い(またはその両方)場合。

あなたはI/Oバインドされており、数千のWebサイトを持っているため、同時に複数のスレッドを解析することで処理速度を大幅に向上させることができます。

+0

このようなものは、https://docs.python.org/2/library/thread.html以上のPythonのマルチプロセッシングモジュールに似ていますか? – chizze

0

問題に逆説的な解決策があるかもしれません。あなたが掻き取ろうとしているウェブサイトがあなたを抑えていることはかなり明白です。

あなたの希望を尊重し、リクエストの間に休止を追加することをお勧めします。ループの最後にtime.sleep(2)(およびスクリプトの先頭にimport time)を追加すると、60秒間スロットルが行われないことがあります。

あなたに最適な数字を試してみてください。

+0

私は完全にその可能性を逃した。私は間違いなくこれを試してみます。それを指摘してくれてありがとう! – chizze

+0

ええ、BeautifulSoupは合理的に演奏しています。リクエストレートを上げることはお勧めできません。それはうれしくなく、裁判所のウェブサイトにすぐにリクエストしすぎると、あなたを招待することになります。 –

0

大きなウェブサイトをクロールするには、スレッド:concurrent.futuresまたはthreadingを使用します。ネットワークI/Oでは、ネットワークリソースにあるスレッドread()は、ほとんどの時間を待機して過ごします。これは同時実行性を採用するのに非常に適した状況です。

第2に、特定のものを削っていない場合、アンカータグの直後に正規表現を使用します。私のマシンではHTMLParserより約100倍高速です。スピードアップは重要です。

関連する問題