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