1

大量のデータ スクレイピングを実行する必要があるプロジェクトがあります。

私はこれまで非常に感銘を受けたScrapyを見てきましたが、次のことを行うための最良のアプローチを探しています:

1) 複数の URL をスクレイピングし、スクレイピングする URL ごとに同じ変数を渡したいとします。たとえば、Bing、Google、および Yahoo からキーワード「python」の上位の結果を返したいとします。

http://www.google.co.uk/q=pythonhttp://www.yahoo.com?q=pythonおよびhttp://www.bing.com/?q=python(実際のURLではありませんが、アイデアはわかります)

キーワードを使用して動的 URL を指定する方法が見つかりません。考えられる唯一のオプションは、PHP またはその他で URL を構築するファイルを生成し、scrapy を指定して URL 内のリンクをクロールすることです。

2) 明らかに、各検索エンジンには独自のマークアップがあるため、各結果を区別して、関連データを抽出する対応する XPath を見つける必要があります。

3) 最後に、スクレイピングされたアイテムの結果をデータベース (おそらく redis) に書き込みたいと思いますが、3 つの URL すべてのスクレイピングが完了した場合にのみ、基本的に 3 つの検索エンジンから「プロファイル」を構築したいと考えています。出力結果を 1 回のトランザクションで保存します。

誰かがこれらの点について何か考えを持っているなら、私は非常に感謝しています.

ありがとうございました

4

3 に答える 3

3

1) BaseSpider には、__init__サブクラスでオーバーライドできるメソッドがあります。これは、start_urls および allowed_domains 変数の宣言が設定される場所です。スパイダーを実行する前に、URL のリストを念頭に置いている場合は、ここに動的に挿入できます。

たとえば、私が構築したいくつかのスパイダーでは、MongoDB から事前にフォーマットされた URL のグループを取得し、一度の一括挿入でそれらを start_urls リストに挿入します。

2) これは少し難しいかもしれませんが、応答オブジェクト ( response.url) を見ると、クロールされた URL を簡単に確認できます。URL に「google」、「bing」、または「yahoo」が含まれているかどうかを確認し、そのタイプの URL に対して事前に指定されたセレクターを使用できるはずです。

3) #3 が可能であるかどうか、または少なくとも問題がなければそうではないかどうかはわかりません。私の知る限り、start_urls リスト内の URL は順番にクロールされず、それぞれ独立してパイプラインに到着します。いくつかの重大なコア ハッキングがなければ、応答オブジェクトのグループを収集し、それらを一緒にパイプラインに渡すことができるかどうかはわかりません。

ただし、データを一時的にディスクにシリアル化し、後でデータをデータベースに一括保存することを検討することもできます。私が作成したクローラーの 1 つは、約 10000 の URL のグループを受け取ります。10000 個の単一項目データベースを挿入するのではなく、URL (および収集したデータ) を BSON に保存し、後で MongoDB に挿入します。

于 2012-08-28T14:17:49.677 に答える
1

これには機械化を使用します。

import mechanize
br = mechanize.Browser()
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
br.set_handle_robots(False)
response = br.open('https://www.google.ca/search?q=python')
links = list(br.links())

これにより、すべてのリンクが提供されます。または、クラスごとにフィルターで除外できます。

links = [aLink for aLink in br.links()if ('class','l') in aLink.attrs]
于 2012-08-28T14:15:41.947 に答える
0

「-a」スイッチを使用して、特定の検索語を示すことができるキーと値のペアをスパイダーに指定できます

scrapy crawl <spider_name> -a search_word=python
于 2013-07-06T00:39:46.087 に答える