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

时间:2015-03-28 05:11:47

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

我试图通过使用scrapy从taobao.com获取商店名称。然而,我找到了关闭蜘蛛'在' 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帮助器检查了xpath并且它是正确的。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

实际上是关于你的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收到的id="J_itemlistCont"中没有response.body的元素。

事实上,如果你要检查" 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>'

这基本上是浏览器收到页面后的状态 - 没有&#34;动态&#34;部分。在这种状态下,&#34; main&#34;中的唯一元素div是带有div的{​​{1}}元素,它基本上是在主要内容出现在浏览器中之前可以看到的旋转圈。