scrapy:蜘蛛在得到一些东西之前就被关闭了

scrapy: spider was closed before having got something

我正在尝试使用 scrapy 从 taobao.com 获取商店名称。但是我发现 'closing spider' 出现在 'craweled(200)' 之后,但我什么也没得到。 以下是我的代码:

# -*- coding: utf-8 -*-

from scrapy.spider import Spider
from scrapy.selector import Selector
from TBFXSpider.items import TbfxspiderItem
from scrapy.http import Request

class TBFXSpider(Spider):
    name = "TBFXSpider"
    start_urls = [
        "http://s.taobao.com/"
    ]

    def parse(self, response):
        if response.url == "http://s.taobao.com/":
            print "******response url:%s******" % response.url
            url = "http://s.taobao.com/search?spm=1.7274553.1997520241.3.bKiaLP&q=%E8%BF%9E%E8%A1%A3%E8%A3%99&refpid=420462_1006&source=tbsy&style=grid&tab=all&sort=sale-desc"
            yield Request(url,callback=self.parse)
        else:
            sel = Selector(response)
            items = []
            keys = sel.xpath('//*[@id="J_itemlistCont"]/div')

            for key in keys:
                item = TbfxspiderItem()
                d = keys.xapth('div[4]/div[1]/a/span[2]').extract()
                item['desc'] = [d1.encode("utf-8") for d1 in d]
                items.append(item)
                yield item

我怀疑这可能是 xpath 的问题。但是我用 xpath helper 检查了 xpath,它是正确的。有谁知道如何解决这个问题?

实际上是关于您的 XPath 表达式 - 它不匹配

来自 shell 的证明:

$ scrapy shell "http://s.taobao.com/search?spm=1.7274553.1997520241.3.bKiaLP&q=%E8%BF%9E%E8%A1%A3%E8%A3%99&refpid=420462_1006&source=tbsy&style=grid&tab=all&sort=sale-desc"
In [1]: response.xpath('//*[@id="J_itemlistCont"]')
Out[1]: []

如果你再深入一点,你会发现这是由于目标站点异步性质造成的。页面的主要内容由在浏览器中执行的 javascript 组成。也就是说,Scrapy接收到的response.body中没有带id="J_itemlistCont"的元素。

事实上,如果您检查 "main" div 元素,您会看到:

In [8]: response.css('#main').extract()[0]
Out[8]: u'<div id="main" class="srp-main">\n        <div class="srp-loading" style="text-align:center; margin: 100px auto 0;
...
MOFDhs5S4CADs=);"></div>\n    </div>'

这基本上是浏览器收到页面后的状态 - 没有 "dynamic" 部分。在这种状态下,"main" div 中唯一的元素是带有 class="srp-loading"div 元素,这基本上是您在主要内容出现之前可以看到的旋转圈浏览器。