我试图通过使用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并且它是正确的。有谁知道如何解决这个问题?
答案 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}}元素,它基本上是在主要内容出现在浏览器中之前可以看到的旋转圈。