2015-03-28 2 views
0

Я пытаюсь получить названия магазинов с taobao.com с помощью scrapy. Однако я обнаружил, что «закрывающий паук» появляется после «ползания (200)», и я ничего не получил. Ниже приведены мой код:scrapy: 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, и это правильно. Кто-нибудь знает, как это решить?

ответ

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, который выполняется в браузере. Другими словами, нет элемента с id="J_itemlistCont" в response.body, который получает Scrapy.

В самом деле, если вы будете проверять «главный» 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>' 

Это в основном состояние страницы после того, как браузер получает его - без «динамической» части , В этом состоянии единственным элементом внутри основного «div» является элемент div с class="srp-loading", который представляет собой круговое окружение, которое вы можете видеть до того, как основное содержимое появится в браузере.

Смежные вопросы