Я написал довольно простой скребок с помощью 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 -> закрыть без сохранения.
Я довольно новичок в развитии, и я не согласен с этим, любые советы были бы с благодарностью получены.
Удовлетворены ли вы данными? – TheSentinel
Да, (при указании правильного start_url) добавление 'return item' в конец parse_product выводит собранные данные на терминал по мере того, как он сбрасывается. – user2051497