【问题标题】:Scrapy skipped some pages unexpectedlyScrapy 意外跳过了一些页面
【发布时间】:2017-06-13 18:19:37
【问题描述】:

我正在编写一个用于迭代“下一页”爬取的爬虫爬虫。 我的代码是这样的:

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')

我希望代码爬取每个页面的信息,然后点击下一页。但是打印的调试信息显示它经常跳过一些页面。

可能是什么原因?

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    (抱歉......我还不能对你的问题发表评论,因为我没有足够的代表) 请发布更多您的代码...或日志本身。基于配置有很多分歧点,我们需要更多信息来诊断。这里还有很多其他代码可能交互不佳。

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

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

    scrapy 下载队列是 LIFO(后进先出)。因此,它会在返回尝试迭代 'first' parse() 调用之前处理“新”内容。

    我还猜想您正在尝试在 AJAXy 网页上操作,其中发送“\n”会在后台加载一个新“页面”?

    可能发生的情况是您加载第一页,设置 current_page,产生新项目,处理新项目,新链接由其他未显示的规则或机制生成,对这些链接调用 parse,current_page 设置为那些新的页码,......一堆其他的东西......,最后你原来的 parse() 调用被要求提供它的下一个项目,它从 yield 语句恢复并记录“现在页面是 %d”,并且当前页码非常错误。

    我的回答可能是假设由于缺乏信息,事情不一定正确......但至少如果给你一些东西可以咀嚼。

    【讨论】:

    • 感谢您的帮助。经过数小时的调试。当我切换到 xpath 定位器时,我终于让它工作了。当我阅读他们对 selector.css 函数的评论时。据说css选择器是翻译成xpath的。我不确定这是否是由于 css 选择器的稳定性。但是 xpath 对我来说一直很稳定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2016-01-10
    • 2017-03-12
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多