2012-07-31 57 views
1

我想根据索引页上的数据或信息来编写抓取某些页面的蜘蛛。然后将结果存储在数据库中。如何基于索引页上的信息来抓取网页

例如,让说,我想爬stackoverflow.com/questions/tagged/scrapy 我会去通过索引页面,如果这个问题是不是在我的数据库,那么我会保存回答次数在数据库,然后按照问题的链接并抓取该页面。

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

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

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

有没有办法用一个蜘蛛,而不是有两个蜘蛛要做到这一点,一个蜘蛛越来越索引页上的所有环节,与数据库中的数据进行比较,输出一个JSON或CSV文件,然后将其传递到另一个蜘蛛爬行问题页面?

回答

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 
+0

当蜘蛛运行时,我可以动态地在start_urls列表中添加URL吗?在你的例子中,蜘蛛开始抓取第一个问题页面,但它不会继续到第二个页面。我可以在第一页上添加第二页到start_urls基础上吗?例如,如果第一页的最后一个问题不在我的数据库中,这意味着第二页上可能会有更多新问题,这些问题我还没有涉及。所以我应该去第二页查看。我能以某种方式在蜘蛛运行时将新网址附加到start_urls上吗? – user1499532 2012-10-06 17:20:36

0

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

把简单:在索引页上使用蜘蛛,并按照其问题。当提出问题时,请检查您是否想获取信息或drop/ignore the question

+0

感谢。计算答案的数量只是一个例子。但我想将答案数(在本例中)存储在数据库中的刮取数据旁边。我使用规则的问题是它只检查链接模式。我正在尝试构建一个蜘蛛,它将遵循链接库中索引页上某些数据的基础。要继续我的stackoverflow示例,如果该问题被user1499532询问,那么请遵循link和else:drop/ignore。 – user1499532 2012-08-02 17:42:43

+0

这不能通过规则来完成,而是通过Scrapy的其他技术完成。您可以创建一个接收网站(答案)的管道,并决定是否会处理该网站。另一种方法是在创建项目之前检查它。蜘蛛本身无法决定这一点,但它可用的机制之一。 – DrColossos 2012-08-03 06:35:26