1

インデックスページのデータまたは情報に基づいて特定のページをクロールするスパイダーを作成しようとしています。そして、結果をデータベースに保存します。

たとえば、stackoverflow.com / questions / tags / scrapyをクロールしたいとします。インデックスページを確認します。質問がデータベースにない場合は、回答数をデータベースに保存してから、次の手順に従います。質問のリンクとそのページをクロールします。

質問がすでにデータベースにあるが、回答の数がデータベースの数よりも多い場合は、そのページをもう一度クロールします。

質問がすでにデータベースにあり、回答カウンターが同じである場合:この質問をスキップしてください。

現時点では、インデックスページですべてのリンクと回答数(この例では)を取得できました。しかし、回答数に基づいて質問ページへのリンクをたどるようにスパイダーを作成する方法がわかりません。

2つのスパイダーではなく1つのスパイダーでこれを行う方法はありますか?1つのスパイダーはインデックスページのすべてのリンクを取得し、データをデータベースと比較し、jsonまたはcsvファイルをエクスポートしてから別のスパイダーに渡します質問ページをクロールしますか?

4

2 に答える 2

0

BaseSpiderを使用するだけです。そうすれば、すべてのロジックをスクレイピングするコンテンツに依存させることができます。個人的には、スクレイピング プロセスをより詳細に制御できる BaseSpider を好みます。

スパイダーは次のようになります (これは疑似コードに近いものです)。

from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.http import Request
from myproject.items import MyItem

class StackOverflow(BaseSpider):
    name = 'stackoverflow.com'
    allowed_domains = ['stackoverflow.com']
    start_urls = ['http://stackoverflow.com/questions']

    def parse(self, response):
        hxs = HtmlXPathSelector(response)

        for question in hxs.select('//question-xpath'):
            question_url = question.select('./question-url')
            answer_count = question.select('./answer-count-xpath')
            # you'll have to write the xpaths and db logic yourself
            if get_db_answer_count(question_url) != answer_count[0]:
                yield Request(question_url, callback = self.parse_question)

    def parse_question(self, response):
        insert_question_and_answers_into_db
        pass
于 2012-08-12T07:49:37.400 に答える
0

これは、CrawlSpiderとルールが行うことです (必ず例を確認してください)。最初にインデックス サイトから情報を取得することができます (ただし、回答をカウントするアプローチには何らかの欠陥があります。ユーザーが投稿を削除し、新しい投稿が追加された場合はどうなるでしょうか)。その情報を取得するか、またはいいえ。

簡単に言えば、インデックス ページでスパイダーを使用し、その質問に従ってください。質問があった場合は、情報を取得するか、質問をドロップ/無視するかを確認します。

于 2012-08-01T13:36:11.120 に答える