scrapy框架--?乱码unicode

Posted yifengs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy框架--?乱码unicode相关的知识,希望对你有一定的参考价值。

安装

pip install scrapy

建立一个爬虫项目

scrapy startproject 项目名称

scrapy startproject itcast

生成一个爬虫

scrapy genspider 爬虫名称 "爬虫范围"

scrapy genspider itcast "itcast.cn"

爬虫生成位置

技术图片

 

 

 编写itcast.py

# -*- coding: utf-8 -*-
import scrapy


class ItcastSpider(scrapy.Spider):
    name = "itcast"
    allowed_domains = ["itcast.cn"]
    start_urls = (
        http://www.itcast.cn/channel/teacher.shtml,
    )

    def parse(self, response):
        # print(response)
        data_list = response.xpath("//div[@class=‘tea_con‘]//h3/text()").extract()  # extract() 返回一个含有字符串数据的列表 如果没用这个方法 返回一个包含选择器的列表
        print(data_list)  # 乱码 uu5218.... setting.py中添加了 FEED_EXPORT_ENCODING = ‘utf-8‘ 还是不行 不知道原因  ???
        for i in data_list:
            print(i)  # 此处打印的是中文 

乱码是由于ubuntu终端没有中文安装包

安装中文包

apt-get install language-pack-zh

修改 /tec/environment

sudo gedit /etc/environment

在下面添加两行

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh:en_US:en"

第二行即是默认的中文字符编码。注:可以通过这里修改默认的中文编 码字符,比如修改为:zh_CN.GBK

修改/var/lib/locales/supported.d/local文件

sudo gedit /var/lib/locales/supported.d/local

添加

zh_CN.UTF-8 UTF-8
en_US.UTF-8 UTF-8

保存后,执行命令

sudo locale-gen

重启

sudo reboot

解决 乱码没有了,可以显示中文了

终端打印出来后有其它数据

setting.py中配置log的等级

LOG_LEVEL = "WARNING"

 xapath分组 数据传到pipline itcast.py中

# -*- coding: utf-8 -*-
import scrapy


class ItcastSpider(scrapy.Spider):
    name = "itcast"
    allowed_domains = ["itcast.cn"]
    start_urls = (
        http://www.itcast.cn/channel/teacher.shtml,
    )

    def parse(self, response):
        # # print(response)
        # data_list = response.xpath("//div[@class=‘tea_con‘]//h3/text()").extract()  # extract() 返回一个含有字符串数据的列表 如果没用这个方法 返回一个包含选择器的列表
        # print(data_list)  # 乱码 uu5218.... setting.py中添加了 FEED_EXPORT_ENCODING = ‘utf-8‘ 还是不行 不知道原因  ???
        # for i in data_list:
        #     print(i)  # 此处打印的是中文
        ret = response.xpath("//div[@class=‘tea_con‘]//li")  # xpath分组提取
        # print(ret)
        for i in ret:
            item = {}
            item[name] = i.xpath(".//h3/text()").extract_first()  # extract_first()相当于 extract()[0] 取列表的第一条数据 
            # extrack_first() 如果没有数据则返回空列表
            # extrack()[0] 如果没有数据会报错
            item[position] = i.xpath(".//h4/text()").extract_first()
            item[commondcommond] = i.xpath(".//p/text()").extract_first()
            yield item  # 把数据传给pipline

pipline如果想显示接收数据 先要在设置setting.py中开启

技术图片

# -*- coding:utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import json
import codecs

class MyspiderPipeline(object):
    # def __init__(self):
    #     # 定义文件编码及名称
    #     self.file = codecs.open(‘中文乱码.json‘, ‘wb‘, encoding=‘utf-8‘)

    def process_item(self, item, spider):  # 实现存储方法
        # line = json.dumps(dict(item)) + ‘
‘
        # print(line.decode("unicode_escape"))
        # 写入一行,每行为一个抓取项
        # self.file.write(line.decode("unicode_escape"))
        # return item
        print(item)
     return item

 查看效果,控制端输入代码

scrapy crawl itcast

技术图片

 

 使用多个pipline

技术图片

# -*- coding:utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import json
import codecs

class MyspiderPipeline(object):
    # def __init__(self):
    #     # 定义文件编码及名称
    #     self.file = codecs.open(‘中文乱码.json‘, ‘wb‘, encoding=‘utf-8‘)

    def process_item(self, item, spider):
        # line = json.dumps(dict(item)) + ‘
‘
        # print(line.decode("unicode_escape"))
        # 写入一行,每行为一个抓取项
        # self.file.write(line.decode("unicode_escape"))
        # return item
        del item["commondcommond"]  # 删除详细介绍
        return item

class MyspiderPipeline2(object):
    def process_item(self, item, spider):
        print(item)  # 此时item是从上面方法处理后的item
        return item

配置setting.py

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   myspider.pipelines.MyspiderPipeline: 300,
   myspider.pipelines.MyspiderPipeline2: 301,
}

查看效果

技术图片

 

 

 

 

 

以上是关于scrapy框架--?乱码unicode的主要内容,如果未能解决你的问题,请参考以下文章

scrapy主动退出爬虫的代码片段(python3)

scrapy按顺序启动多个爬虫代码片段(python3)

Scrapy爬取到的中文数据乱码问题处理

高效的Scrapy爬虫框架干货教程,请查收!

Python之Scrapy安装

jmeter中文乱码及Unicode转中文