1

我正在尝试编写一个蜘蛛来根据索引页面上的数据或信息来爬取某些页面。然后将结果存储在数据库中。

例如,假设我想抓取 stackoverflow.com/questions/tagged/scrapy 我会浏览索引页面,如果问题不在我的数据库中,那么我会将答案计数存储在数据库中,然后按照问题的链接并抓取该页面。

如果问题已经在数据库中,但答案的数量大于数据库中的答案数量:再次抓取该页面。

如果问题已经在数据库中并且答案计数器相同:跳过此问题。

目前,我可以在索引页面上获取所有链接和答案计数(在此示例中)。但我不知道如何让蜘蛛根据答案计数跟随问题页面的链接。

有没有办法用一个蜘蛛而不是两个蜘蛛来做到这一点,一个蜘蛛获取索引页面上的所有链接,将数据与数据库进行比较,导出一个 json 或 csv 文件,然后将其传递给另一个蜘蛛抓取问题页面?

4

2 回答 2

0

这就是CrawlSpider和 Rules 所做的(请务必查看示例)。您可以首先从索引站点获取信息(尽管您计算答案的方法存在某种缺陷:如果用户删除了帖子并添加了新帖子怎么办)并决定每个子页面,如果您想获取其信息或不是。

简单地说:在索引页面上使用蜘蛛并遵循它的问题。给出问题时,请检查您是要获取信息还是放弃/忽略该问题

于 2012-08-01T13:36:11.120 回答
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 回答