2013-02-08 3 views
0

Я написал довольно простой скребок с помощью scrapy. Я хотел бы сохранить очищенные данные в файле .xls, так как у меня есть существующий модуль для чтения xls и сортировки очищенных данных. Но я ударил, что кажется глупым камнем преткновения, фактически сохраняя .xls.Почему мои данные не сохраняются в xls?

  • паук сам работает (он ползет и скребет необходимые данные)
  • .xls создается и инициализированы правильно.
  • Скребковые данные записываются в xls после очистки каждого элемента.

Однако, где бы я поставил сохранить заявление, кажется, спасаются до того начинается фактическое веб выскабливание. Оставив меня с инициализированным (первая строка заполнена заголовками), но в остальном пустой лист. нет Вот что у меня есть (сайт удален, чтобы спасти невинную сервер)

# encoding=utf-8 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item, Field 
from xlwt import Workbook 

# Working row on new spreadsheet 
row_number = 0 

# Create new spreadsheet 
newDb = Workbook(encoding='utf-8') 
newFile = newDb.add_sheet('Sheet1') 
values = ['product','description','image'] 

class TestSpider(CrawlSpider): 
    # Initiate new spreadsheet 
    global newFile 
    global values 
    global row_number 
    for cell in range (len(values)): 
     newFile.write(row_number, cell, values[cell]) 
    row_number = row_number + 1 

    # Initiate Spider 
    name = "Test" 
    allowed_domains = [] 
    start_urls = ["http://www.website.to/scrape",] 
    rules = (Rule(SgmlLinkExtractor(restrict_xpaths="//div[@class='content']/h3"), callback='parse_product'),) 

    def parse_product(self, response): 
     hxs = HtmlXPathSelector(response) 
     item = TestItem() 
     item['product'] = hxs.select('//div [@class = "col-right"][1]/table/tr[1]/td/text()').extract() 
     item['description'] = hxs.select('//div[@class="columns"][1]/div [@class = "col-right"]/p/text()').extract() 
     item['image'] = hxs.select('//img /@src').extract() 

     global values 
     global newFile 
     global row_number 

     # This is where products are written to the xls 
     for title in values: 
      # test to increase row_number, at the start of each new product 
      if title == "product": 
       row_number = row_number + 1 
      try: 
       newFile.write(row_number, values.index(title), item[title]) 
      except: 
       newFile.write(row_number, values.index(title), '') 

class TestItem(Item): 
    product = Field() 
    description = Field() 
    image = Field() 

Я считаю, что я прав, говоря, просто нужно добавить
global newDb
newDb.save('./products_out.xls')

в правильном месте, но опять же, кажется, нет вопрос, где я добавляю это, операторы печати указывают, что порядок операций всегда: create xls -> initialise xls -> save xls -> scrape и write to xls -> закрыть без сохранения.

Я довольно новичок в развитии, и я не согласен с этим, любые советы были бы с благодарностью получены.

+0

Удовлетворены ли вы данными? – TheSentinel

+0

Да, (при указании правильного start_url) добавление 'return item' в конец parse_product выводит собранные данные на терминал по мере того, как он сбрасывается. – user2051497

ответ

1

В идеале вы должны создать класс конкретизированного элемента (посмотрите примеры документации по процедурам) и разместите там все свои файлы.

+0

Хорошо, я посмотрю, спасибо. – user2051497

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