Python Scrapy的json转码中文处理2:items方式

Summary

介绍如何使用items以及json转码获得中文结果。用网站数字尾巴来说明。

settings.py

前三条系统默认,另外去掉robot一条,再加上ITEM_PIPELINES一条。

BOT_NAME = 'dgtle'

SPIDER_MODULES = ['dgtle.spiders']
NEWSPIDER_MODULE = 'dgtle.spiders'

ITEM_PIPELINES = {
    'dgtle.pipelines.JsonWriterPipeline':300,
}

items.py

只爬取一个title。

import scrapy

class DgtleItem(scrapy.Item):
    title = scrapy.Field()

spider

需要yield item

import scrapy
from dgtle.items import DgtleItem


class DgtleSpider(scrapy.Spider):
    name = "dgtle4"
    start_urls = [
        "http://www.dgtle.com",
    ]


    def parse(self,response):
        
        for article in response.css('div.cr180article_list dl'):
            item = DgtleItem()
            item['title'] = article.css('dt a::text').extract_first()
            yield item

pipelines.py 后处理

两个Json处理关键点:

  • 使用codecs.open('filename', 'wb', encoding='utf-8'),打开文件
  • 使用line = json.dumps(dict(item), ensure_ascii=False) + "\n"关闭ascii码。

系统默认的DgtlePipeline没有动。按照Scrapy 1.2.2的文档章节3.7.2的"Write items to JSON file"增加JsonWriterPipeline。但是把close_spider放在了process_item后面。

文件名更改为Dgtle_4.js,可以使用其它名字,还可以是.jl的文件。打开方式使用了codecs.open,带参数encoding='utf-8'

处理item时,对json.dumps增加参数ensure_ascii=False,关闭ascii码的存储。而sort_keys可以不必使用。

import json
import codecs


class DgtlePipeline(object):
    def process_item(self, item, spider):
        return item

class JsonWriterPipeline(object):

    def open_spider(self,spider):
        self.file = codecs.open('Dgtle_4.js', 'wb', encoding='utf-8')

    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False, sort_keys=False) + "\n"
        self.file.write(line)
        return item

    def close_spider(self, spider):
        self.file.close()

最后结果正常 Dgtle_4.js

timestamp: 2016-12-16 11:18 PM

{"title": "未来先一步到来?荣耀发布八曲面手机荣耀 Magic"}
{"title": "深夜俱乐部丨一起来晒各种『贴纸』"}
{"title": "年终盘点丨来数数各大品牌今年都发了哪些手机"}
{"title": "三星 Gear S3 体验:别具一格,一表人才"}
{"title": "直播结束|致未来,荣耀 Magic 手机发布会"}
{"title": "Super Mario Run 上架 App Store:手机终于可以玩马里奥了"}
{"title": "『尾巴小组』每日精选:摘不下的世界"}
{"title": "索尼 A99M2 到手,开箱加简单试用感受"}
{"title": "一生必须到过的地方,带上妹子来青海旅拍"}
{"title": "这部深蓝色的「无边框」手机,令我想起久违的 Nokia N9"}
{"title": "我的宾得 67II 日记第四集"}
{"title": "为酷派而改变,酷派改变者 S1 手机发布"}
{"title": "深夜俱乐部 | 你愿意成为某产品的第一批抢购者吗?"}
{"title": "手机网络快不快,谁说了算?"}
{"title": "尾巴图赏丨聆听年轻的声音,AKG Y50 头戴式耳机"}
{"title": "年终盘点丨一场旗舰之间的年度角逐"}
{"title": "直播预告丨飞傲冬季新品发布会"}
{"title": "裸眼 3D 的回归,天机 7 MAX 开箱体验"}
{"title": "『尾巴小组』你的世界,文具知道"}
{"title": "大疆 Mavic Pro 开箱图赏及使用体会"}

测试环境

scrapy 1.2.2
python 2.7.12
os x 10.10.3

你可能感兴趣的:(Python Scrapy的json转码中文处理2:items方式)