1

一部のフォーラムをスクレイピーでスクラップし、データをデータベースに保存しようとしています。しかし、データベースの更新に関しては、効率的に行う方法がわかりません。これは私のスパイダーがどのように見えるかです:

class ForumSpider(CrawlSpider):
name = "forum"
allowed_domains= ["forums.example.com"]
start_urls = ["forums.example.com/index.php"]
rules = (
       Rule(SgmlLinkExtractor(allow=(r'/forum?id=\d+',)), 
        follow=True,   callback='parse_index'),
    )

def parse_index(self, response):
    hxs = HtmlXPathSelector(response)
    #parsing....looking for threads.....
    #pass the data to pipeline and store in to the db....

私の問題は、たとえば 1 週間後に同じフォーラムを再びスクラップする場合です。新しいスレッドまたは新しい投稿のあるスレッドが他の非アクティブなスレッドの上にあるため、すべてのページを確認する意味がありません。私の考えは、フォーラムの最初のページ (forums.example.com/forum?id=1) をチェックすることです。同じ URL で同じ数の返信がページ 1 にあるスレッドが見つかった場合です。2ページ目に行く意味はありません。そのため、スパイダーは別のフォーラム (forums.example.com/forum?id=2) に進む必要があります。start_urls とルールを変更してみましたが、スパイダーが実行されると応答しないように見えました。スクレイピーでそれを行う方法はありますか?

私の 2 番目の問題は、異なるスパイダーに異なるパイプラインを使用する方法です。スタック オーバーフローで何かを見つけました。しかし、scrapy はこれを行うように構築されていないようです。異なるサイト用に新しいプロジェクトを作成することを想定しているようです。

これを行うために間違ったツールを使用していますか? または、何かが欠けています。mechanize と lxml を使用してそれを行うことを考えました。しかし、ねじれたユニコード処理などを実装する必要があるため、スクレイピーに固執したいと思います

ありがとう

4

1 に答える 1

1

あなたが求めているのは、その場で http リクエストを作成することです。

parse_index 関数内でこれを行います。
request = self.make_requests_from_url(http://forums.example.com/forum?id=2)
return request

複数の http リクエストを送信する場合は、配列を返します。
このリクエストをスクレイピーで見る

2 番目のことについては正しいです。さまざまな Web サイトからさまざまな種類のデータを抽出する場合は、さまざまなスパイダーを作成する必要があります。

于 2012-10-09T22:08:15.057 に答える