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
元素,这基本上是您在主要内容出现之前可以看到的旋转圈浏览器。
我正在尝试使用 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
元素,这基本上是您在主要内容出现之前可以看到的旋转圈浏览器。