簡體   English   中英

使用scrapy將抓取的項目保存到json/csv/xml文件

[英]saving scraped items to json/csv/xml file using scrapy

我正在從他們的官方文檔中學習Scrapy (一個網絡爬行框架)。
通過以下示例和文檔,我創建了我的蜘蛛來使用站點地圖抓取數據

from scrapy.contrib.spiders import SitemapSpider
from scrapy.selector import Selector
from MyProject1.items import MyProject1Item

class MySpider(SitemapSpider):
    name="myspider"
    sitemap_urls = ['http://www.somesite.com/sitemap.xml']
    sitemap_follow = ['/sitemapbrowsesection\d+']
    count=0
    def parse(self, response):
        self.count=self.count+1
        item=MyProject1Item()
        sel=Selector(response)
        item["exp"]=sel.xpath('/html/head/title/text()').extract()
        print str(self.count)+":\t"+response.url
        print sel.xpath('/html/head/title/text()').extract()
        print "\n\n"

我可以通過運行命令在帶有日志的屏幕上看到抓取的結果
scrapy crawl myspider
我可以通過在命令中添加選項將抓取的結果保存到 json/csv/xml 文件
scrapy crawl myspider -o item.json -t json用於在json文件中獲取結果。

我的問題是,只有當scrapy 完成爬行時,scrapy 才會將抓取的結果轉儲到 item.json。 意味着必須等到爬行結束。 所以對於大項目,我將不得不等待很長時間,因為我猜在所有爬行完成后,scrapy 會將抓取的結果寫入 json 文件。

我希望scrapy立即或幾乎立即或在抓取過程中寫入json文件,以便我可以看到在scrapy運行時抓取的站點的結果。

我知道scrapy中一定有一些我無法捕捉的東西。 我試圖從http://doc.scrapy.org/en/latest/topics/feed-exports.html獲得幫助

http://doc.scrapy.org/en/latest/topics/exporters.html
但無法解決我的問題。 所以我正在尋找一些幫助或示例代碼,否則我必須向parse(self, response)函數添加幾行以創建 json/csv 文件並將報廢的結果寫入其中。

這就是寫入文件的方式。 只有在磁盤已滿時才會將緩沖區寫入磁盤。

例如,在一個 shell 中用 python 打開一個文件:

$ ipython

In [1]: fp = open('myfile', 'w')

在另一個 shell 中監視文件內容:

$ tail -f myfile

回到python shell,寫一些內容:

In [2]: _ = [fp.write("This is my file content\n") for i in range(100)]

就我而言,我在tail輸出中看不到任何內容。 寫更多內容:

In [3]: _ = [fp.write("This is my file content\n") for i in range(100)]

現在我看到tail輸出中的行。

事實上,您可以更改文件緩沖(參見 [1])。 再次打開一個文件:

$ ipython

In [1]: fp = open('myfile', 'w', buffering=0)

在另一個 shell 中監視文件內容:

$ tail -f myfile

寫一些東西並查看tail輸出:

In [2]: fp.write("Hello there\n")

最好啟用緩沖(減少磁盤 I/O)。 您的項目文件最終將獲得輸出,但您可能希望將格式更改為默認的jsonlines (不需要-t參數),這樣您每行都會獲得一個 json 對象。 這是一種高度使用的流媒體格式。

您可以輕松閱讀jsonlines.jl擴展名):

import json

for line in open('items.jl'):
    data = json.loads(line)
    # do stuff with data

甚至其他工具,如head + json.tooljq (參見 [2]):

$ head -1 items.jl | python -m json.tool
$ jq -I . items.jl

到目前為止,我還沒有看到任何問題,將項目寫入.jl文件(或任何其他格式)。 然而,如果您的工作被殺死,您將丟失緩沖區中的最后一項。 這可以通過將項目存儲在 db 或類似的東西中來解決。

[1] http://docs.python.org/2/library/functions.html#open

[2] http://stedolan.github.io/jq/manual/

scrapy crawl myspider -o item.json -t json僅在爬行時保存獲取的結果。 我不必等待爬行完成。 我可以在爬蟲運行時看到文件 item.json 的內容

所以不需要在蜘蛛中包含將獲取的數據寫入文件的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM