【问题标题】:Scrapy not following links on parse_dir_contents callbackScrapy 不关注 parse_dir_contents 回调上的链​​接
【发布时间】:2016-04-19 14:33:17
【问题描述】:

我无法让我的蜘蛛跟踪链接。 Scrapy教程我翻了很多遍,也搜了不少,还是一头雾水。

出于某种原因,即使有数百个结果分布在大约 15-20 页上,我的蜘蛛程序总是返回 5 - 7 个结果并表示已完成。

我已经在调用 parse_dir_contents 方法之前和它开始运行时放置了一些打印语句。由于某种原因,它被调用了 40 次(两组 20 次),并且只运行了 5 - 7 次。我每页大约有 20 个结果,如果我打印出它每次导航到的 URL,它永远不会超过第 1 页。

我确信在这段代码中有很多我可以做得更好的事情。任何帮助都将不胜感激。我真的一直在努力工作。

这里有相当多的“帮助”代码,确实使事情变得混乱。很抱歉,但我想为您提供我用来获得最佳解决方案的确切代码。

每个页面上都有许多重复的“vip”列表。所以我只想把它们刮一次,而不是把它们考虑到 numPages 计算中。

【问题讨论】:

    标签: python python-2.7 web-scraping scrapy scrapy-spider


    【解决方案1】:

    真的很难指出问题所在,因为我无法使用您提供的代码重现错误。 我不知道你的代码到底有什么问题,但我可以给你一些改进代码的提示:

    for regularListingContainer in body.xpath('//div[@class="search-item regular-ad"]'):
            link = str(regularListingContainer.re('href="(.*)" class="title">'))
    

    您可以多次调用 xpath 或 css 选择器,在抓取时坚持使用 scrapy 库更快,您可以执行 body.xpath().xpath().css() 来获取您只需 extract() 它的字符串

    for regularListingContainer in body.xpath('//div[@class="search-item regular-ad"]'):
            link = regularListingContainer.xpath('a[contains(@class, "title")]/@href').extract_first()
    

    大多数时候处理链接时最好使用urljoin(),让scrapy 完成繁重的工作并处理相对路径或绝对路径

    link = regularListingContainer.xpath('a[contains(@class, "title")]/@href').extract_first()
    yield Request(urljoin(link), callback=self.parse_dir_contents)
    

    Scrapy 使用多线程意味着每次产生任何东西时,它都会打开一个线程并使其彼此异步运行。这意味着您无法控制首先执行代码的流程。我最好的选择是您的全局变量不会改变您的想法。

    要解决这个问题,您可以使用meta[] 标签在线程之间交换信息,例如

    link = regularListingContainer.xpath('a[contains(@class, "title")]/@href').extract_first()
    request=Request(urljoin(link), callback=self.anotherFunc)
    request['string']="I'm going on a journy"
    yield request
    
    def anotherFunc(self, response)
       foo=response['string']
       print foo
    

    这将输出

    I'm going on a journy
    

    希望对我有所帮助,欢迎进一步提问

    【讨论】:

    • 感谢您的提示和 cmets。我刚刚更新了代码以包含完整的蜘蛛代码,因为我真的想弄清楚这一点并且不想放弃您提供帮助的意愿。请原谅所有菜鸟代码和随机打印语句帮我调试。
    • 糟糕,我发现我没有在评论中标记你。
    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多