[英]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.tool
或jq
(參見 [2]):
$ head -1 items.jl | python -m json.tool
$ jq -I . items.jl
到目前為止,我還沒有看到任何問題,將項目寫入.jl
文件(或任何其他格式)。 然而,如果您的工作被殺死,您將丟失緩沖區中的最后一項。 這可以通過將項目存儲在 db 或類似的東西中來解決。
scrapy crawl myspider -o item.json -t json
僅在爬行時保存獲取的結果。 我不必等待爬行完成。 我可以在爬蟲運行時看到文件 item.json 的內容
所以不需要在蜘蛛中包含將獲取的數據寫入文件的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.