0

私はscrapyを使用して非常に単純なWebスクレイパーを作成しました。xlsを読み取り、スクレイピングされたデータを並べ替える既存のモジュールがあるため、スクレイピングされたデータを.xlsファイルに保存したいと思います。しかし、私はばかげたつまずきのように感じるものにぶつかり、実際に.xlsを保存しました。

  • スパイダー自体は機能します(必要なデータをクロールしてスクレイプします)
  • .xlsは正しく作成され、初期化されています。
  • スクレイピングされたデータは、各アイテムをスクレイピングした後にxlsに書き込まれます。

ただし、saveステートメントをどこに置いても、実際のWebスクレイピングが始まる前に保存されているようです。初期化された(最初の行にタイトルが入力されている)が、それ以外の場合は空のスプレッドシートを残します。これが私が持っているものです(無実のサーバーを保存するためにWebサイトが削除されました)

# 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')

正しい場所ですが、これをどこに追加しても、printステートメントは、操作の順序が常に次のようになっていることを示しています。作成xls->初期化xls->保存xls->スクレイプしてxlsに書き込む->保存せずに閉じる。

私は開発にかなり慣れていません、そして私はこれに途方に暮れています、どんなアドバイスもありがたいことに受け取られるでしょう。

4

1 に答える 1

1

理想的には、カスタムアイテムパイプラインクラスを作成し(例についてはスクレイプドキュメントを参照してください)、そこにすべてのファイル書き込みコードを配置する必要があります。

于 2013-02-08T21:36:48.723 に答える