我已经使用 scrapy 编写了一个非常简单的网络爬虫。我想将抓取的数据保存到 .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')
在正确的位置,但同样,无论我在哪里添加,打印语句都指示操作顺序始终是:创建 xls -> 初始化 xls -> 保存 xls -> 刮擦并写入 xls -> 关闭而不保存。
我对开发很陌生,对此我很茫然,任何建议都将不胜感激。