0

Python で 3 段階の Web スクレイピングを行う必要があります。最初にスクレイピングする基本ページがいくつかあります。それらのページからいくつかの選択リンクを取得し、それらが指すページを取得して、もう一度繰り返す必要があります。トリックは、すべてのリクエストができるだけ早く開始され、アプリケーション全体が単一のリクエストでブロックされないように、これをすべて非同期で実行したいということです。どうすればいいですか?

この時点まで、次eventletのようにワンステップスクレイピングを行ってきました。

urls = ['http://example.com', '...']
def scrape_page(url):
    """Gets the data from the web page."""
    body = eventlet.green.urllib2.urlopen(url).read()
    # Do something with body
    return data

pool = eventlet.GreenPool()
for data in pool.imap(screen_scrape, urls):
    # Handle the data...

ただし、この手法を拡張してネストされたGreenPool.imapループを含めると、そのグループ内のすべてのリクエストが完了するまでブロックされます。つまり、アプリケーションは必要に応じてそれ以上のリクエストを開始できません。

Twisted または別の非同期サーバーでこれを実行できることはわかっていますが、そのような巨大なライブラリは必要ないので、軽量なものを使用したいと考えています。ただし、提案は受け付けています。

4

1 に答える 1

3

ここにアイデアがあります...しかし、私はイベントレットを知らないので許してください。大まかな概念しか提供できません。

「ステップ 1」のプールをプロデューサーと考えてください。キューを作成し、ステップ 1 のワーカーに、見つけた新しい URL をキューに配置させます。

ワーカーの別のプールを作成します。これらのワーカーに URL のキューから引き出して処理させます。プロセス中に別の URL を発見した場合は、それをキューに入れます。彼らはその後の仕事で自分自身を養い続けます。

技術的には、このアプローチにより、1、2、3+ ステップを超えて簡単に再帰できます。新しい URL を見つけてキューに入れる限り、作業は継続されます。

さらに良いことに、キュー内の元の URL から始めて、新しい URL を同じキューに入れる単一のプールを作成するだけです。必要なプールは 1 つだけです。

メモを投稿する

おもしろいことに、この回答を投稿して、イベントレットの「キュー」に相当するものを探しに行った後、すぐに、今説明したことを正確に示す例を見つけました。

http://eventlet.net/doc/examples.html#producer-consumer-web-crawler

その例にはproducerandfetchメソッドがあります。プロデューサは、キューから URL をプルし始め、スレッドを に生成しfetchます。fetch次に、新しい URL をキューに戻し、相互にフィードし続けます。

于 2012-07-16T05:39:12.170 に答える