我正在编写一个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 :(得分:0)
(道歉......我不能发表对你的问题的评论,因为我没有足够的代表) 请发布更多代码...或日志本身。根据配置有很多分歧点,我们需要更多信息来诊断。还有很多其他代码可能在这里进行很差的交互。
执行logging.info语句时,self.current_page肯定会陈旧/误导。自我是蜘蛛对象。如果任何其他代码生成由parse()处理的链接,那么在执行日志语句时,您的current_page将被陈旧/重新分配。
我注意到你的印刷品是在收益率之后: yield会暂停该函数并在您尝试再次迭代后从该位置恢复。也许您因为您的logging.info的发生方式与页面的实际处理分开而被误导。
scrapy下载程序队列是LIFO(后进先出)。所以它将处理&#34; new&#34;在它回到尝试迭代“第一个”之前的东西。 parse()调用。
我还猜测你正试图在AJAXy网页上进行操作,发送&#39; \ n&#39;加载一个新的&#34;页面&#34;在引擎盖下?
可能发生的是你加载第一页,设置current_page,你产生新项目,处理新项目,新链接是由未显示的其他规则或机制养殖,在这些链接上调用解析,current_page设置为那些新的页码,...一堆其他东西......,最后你的原始parse()调用被要求它的下一个项目,它从yield语句和日志恢复&#34;现在页面是%d& #34;当前错误的当前页码。
我的回答很可能是因为缺乏信息而不一定是真的...但至少如果给你一些东西可以咀嚼。