【问题标题】:how to crawl webpages base on the info on the index page如何根据索引页面上的信息抓取网页
【发布时间】:2012-07-31 20:15:52
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: python web-scraping scrapy


    【解决方案1】:

    只需使用 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
    

    【讨论】:

    • 可以在爬虫运行的时候动态的在 start_urls 列表中添加 URL 吗?在您的示例中,蜘蛛开始抓取第一个问题页面,但它不会继续到第二个页面。我可以根据我在第一页上抓取的内容将第二页添加到 start_urls 吗?例如,如果第一页的最后一个问题不在我的数据库中,这意味着第二页上可能有更多我没有抓取的新问题。所以我应该去第二页检查。我可以在蜘蛛运行时以某种方式将新 url 附加到 start_urls 吗?
    【解决方案2】:

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

    简单地说:在索引页面上使用蜘蛛并遵循它的问题。收到问题时,请检查您是否想获取信息或drop/ignore the question

    【讨论】:

    • 谢谢。计算答案的数量只是一个例子。但我也想将答案计数(在本例中)与数据库中的抓取数据一起存储。我使用规则的问题是它只检查链接模式。我正在尝试构建一个基于索引页面上某些数据的链接的蜘蛛。继续我的 stackoverflow 示例,如果 user1499532 提出问题,请点击 then 链接,否则:drop/ignore。
    • 这不能通过规则来完成,而是通过 Scrapy 的其他技术来完成。您可以创建一个接收站点(答案)并决定是否处理它的管道。另一种方法是在创建项目之前对其进行检查。蜘蛛本身无法决定这一点,但它是可用的机制之一。
    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2021-04-20
    • 2016-05-21
    相关资源
    最近更新 更多