1. 修改settings.py,啟用item pipelines組件
將
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
# ITEM_PIPELINES = {
# 'tutorial.pipelines.TutorialPipeline': 300,
# }
改為
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'tutorial.pipelines.TutorialPipeline': 300,
}
當(dāng)然,我們不能只改而不去研究其中的意義.
根據(jù)官方注釋我們順利找到了官方文檔對此的解釋說明:
為了啟用一個Item Pipeline組件,你必須將它的類添加到
ITEM_PIPELINES配置,就像下面這個例子:ITEM_PIPELINES = { 'myproject.pipelines.PricePipeline': 300, 'myproject.pipelines.JsonWriterPipeline': 800, >}分配給每個類的整型值,確定了他們運(yùn)行的順序,item按數(shù)字從低到高的順序,通過pipeline,通常將這些數(shù)字定義在0-1000范圍內(nèi)。
那么什么是Item Pipeline組件呢?
當(dāng)Item在Spider中被收集之后,它將會被傳遞到Item Pipeline,一些組件會按照一定的順序執(zhí)行對Item的處理。
每個item pipeline組件(有時稱之為“Item Pipeline”)是實(shí)現(xiàn)了簡單方法的Python類。他們接收到Item并通過它執(zhí)行一些行為,同時也決定此Item是否繼續(xù)通過pipeline,或是被丟棄而不再進(jìn)行處理。
以下是item pipeline的一些典型應(yīng)用:
- 清理HTML數(shù)據(jù)
- 驗(yàn)證爬取的數(shù)據(jù)(檢查item包含某些字段)
- 查重(并丟棄)
- 將爬取結(jié)果保存到數(shù)據(jù)庫中
如果你想了解更多item pipeline組件相關(guān)的知識,請自行閱讀官方文檔
2.設(shè)置item pipelines組件
將你的 *pipelines.py 代碼添加以下代碼
def *_item(self, item, spider):
with open('data_cn1.json', 'a') as f:
json.dump(dict(item), f, ensure_ascii=False)
f.write(',\n')
return item
其中重點(diǎn)關(guān)注一下json.dump函數(shù)
根據(jù)查看json的源碼中的注釋發(fā)現(xiàn):
If
ensure_asciiis false, then the strings written tofpcan
contain non-ASCII characters if they appear in strings contained in
obj. Otherwise, all such characters are escaped in JSON strings.
如果ensure_ascii為false,那么寫入fp的字符串可以包含非ASCII字符。否則,所有這些字符都會在JSON字符串中轉(zhuǎn)義。
也就是說json.dump函數(shù)將獲取到item轉(zhuǎn)化成字符串中存入json文件,并且 將參數(shù)ensure_ascii設(shè)為False使得中文(UTF-8編碼)不經(jīng)過轉(zhuǎn)義,也就不會亂碼
參考: