2014-06-18 99 views
0

这是我第一次创建一个蜘蛛,尽管我的努力,它仍然没有任何回报我的CSV导出。我的代码是:Scrapy:蜘蛛没有任何返回

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import Selector 

class Emag(CrawlSpider): 
    name = "emag" 
    allowed_domains = ["emag.ro"] 
    start_urls = [ 
     "http://www.emag.ro/"] 

    rules = (Rule(SgmlLinkExtractor(allow=(r'www.emag.ro')), callback="parse", follow= True)) 

    def parse(self, response): 
     sel = Selector(response) 
     sites = sel.xpath('//a/@href').extract() 
     for site in sites: 
      site = str(site) 

     for clean_site in site: 
      name = clean_site.xpath('//[@id=""]/span').extract() 
      return name 

事情是,如果我打印的网站,它给我一个网址列表,这是确定的。如果我在scrapy shell中的某个URL中搜索名称,它会找到它。问题是当我所有的链接所有名称爬行。我运行它与“scrapy crawl emag> emag.cs​​v”

你能给我一个提示什么是错的?在蜘蛛

回答

1

多个问题:

  • rules应该是最后的括号指定
  • 没有Item年代以前的迭代,缺少逗号 - 你需要定义一个Item类和返回/从产生它蜘蛛parse()回调

这里是蜘蛛的一个固定的版本:

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import Selector 
from scrapy.item import Field, Item 


class MyItem(Item): 
    name = Field() 


class Emag(CrawlSpider): 
    name = "emag" 
    allowed_domains = ["emag.ro"] 
    start_urls = [ 
     "http://www.emag.ro/"] 

    rules = (Rule(SgmlLinkExtractor(allow=(r'www.emag.ro')), callback="parse", follow=True),) 

    def parse(self, response): 
     sel = Selector(response) 
     sites = sel.xpath('//a/@href') 
     for site in sites: 
      item = MyItem() 
      item['name'] = site.xpath('//[@id=""]/span').extract() 
      yield item 
+0

很多花时间。但它仍然没有提取;它的错误与xpath选择也是? – user3753592

+0

@ user3753592尝试以这种方式运行蜘蛛:'scrapy crawl -o output.csv -t csv'。 – alecxe

+0

thks,那是我运行它们的最初方式。无论如何,我仍然有空文件 – user3753592