Python scrapy:蜘蛛在得到东西之前已经关上了

Python scrapy:蜘蛛在得到东西之前已经关上了,python,xpath,web-scraping,scrapy,scrapy-spider,Python,Xpath,Web Scraping,Scrapy,Scrapy Spider,我正在尝试使用scrapy从淘宝网获取店铺名称。然而,我发现在“Craweld(200)”之后出现了“closing spider”,我什么也没有得到。 以下是我的代码: # -*- coding: utf-8 -*- from scrapy.spider import Spider from scrapy.selector import Selector from TBFXSpider.items import TbfxspiderItem from scrapy.http import R

我正在尝试使用scrapy从淘宝网获取店铺名称。然而,我发现在“Craweld(200)”之后出现了“closing spider”,我什么也没有得到。 以下是我的代码:

# -*- 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,结果是正确的。有人知道如何解决这个问题吗

它实际上是关于XPath表达式的-它与任何内容都不匹配

来自以下方面的证据:

如果你再深入一点,你会发现这是由于目标站点的异步特性造成的。页面的主要内容由javascript组成,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>'
[8]中的
:response.css('#main').extract()[0]
Out[8]:u'\n\n'
这基本上是浏览器接收到页面后的状态,没有“动态”部分。在这种状态下,“main”div中的唯一元素是
div
元素和
class=“srp load”
,这基本上是在主内容出现在浏览器中之前可以看到的旋转循环

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