2017-06-13 87 views
0

我正在编写一个scrapy爬虫,用于迭代'下一页'爬行。 我的代码是这样的:Scrapy意外跳过了一些页面

def parse(self, response): 

    while self.current_page<=self.total_page: 

     self.current_page = int(self.selector.css("something").extract()[-1]) 

     for post_node in self.selector.css("div.info-column"): 
      yield { 
       "location": post_node.css("something").extract(), 
      } 
     logging.info("************** now page is %d **************", self.current_page) 
     logging.info("********** one page done,Going to next **********") 

     try: 

      self.next.send_keys('\n') 

我预想的代码抓取每一页的信息,然后点击下一页。但打印的调试信息显示它经常跳过一些页面。

可能是什么原因?

回答

0

(道歉....我不能发表对您的问题的意见,因为我没有足够的代表) 请张贴更多您的代码...或日志本身。根据配置有很多不同点我们需要更多的信息来诊断。有太多的其他代码可能在这里互动不佳。

当您的logging.info语句执行时,self.current_page肯定会陈旧/误导。自我就是蜘蛛对象。如果任何其他代码生成由parse()处理的链接,那么当执行日志语句时,current_page将被过时/重新分配。

我注意到您的打印效果是在产量之后: 产量暂停函数并在您尝试再次迭代之后从该位置恢复。也许你被误导是因为你的logging.info发生的方式与页面的实际处理分开。

scrapy下载队列是LIFO(后进先出)。所以它会在返回尝试迭代'first'parse()调用之前处理“新”东西。

我也猜测你正在尝试在发送'\ n'的页面下加载一个新的“页面”的AJAXy网页上运行?

什么可以发生的是,你首先加载页面,设置CURRENT_PAGE,你得到新的项目,新项目处理,新的链接被其他规则或机制养殖未显示,解析被称为这些链接,CURRENT_PAGE设置到那些新的页码......一堆其他的东西......,最后你的原始parse()调用被请求它的下一个项目,它从yield语句中恢复并且记录“现在页面是%d”,并且出现错误的current_page编号。

我的答案可能是假设事情不一定是真的,因为缺乏信息......但至少如果给你东西咀嚼。

+0

感谢您的帮助。经过几个小时的调试。当我切换到xpath定位器时,我终于可以工作了。当我阅读他们对selector.css函数的评论时。有人说,CSS选择器是翻译成xpath。我不确定是否由于css选择器的稳定性。但是xpath对我来说一直稳定运行。 – Jimmy