Scrapy抓取UTF-8中文站出现乱码问题解决方案汇总

你在这里

Scrapy抓取UTF-8中文站出现乱码问题解决方案汇总

Scrapy抓取时,输出一般是unicode,这对于英文网站而言不成问题,但对于中文站,却会导致输出结果为乱码,ZZKOOK现将遇到的问题总结如下,欢迎批评指正。
一、交互式Scrapy shell中
在交互模式下,通常使用print查看scrapy抓取结果的输出,此时只需简单调用encode()函数,即可显示出中文:
    title = sel.xpath('a/text()').extract()
    for t in title:
        print t.encode('utf-8')
注意事项:
1)“encode()”函数是字符串函数,而抓取得到的title是一个列表,因此需要对title中的每一个执行该操作;
2)如果通过xshell链接虚拟机上的linux操作系统,需要将xshell的链接“属性”——“终端”——“转换”——“编码”设置为UTF-8,并与linux操作系统的匹配;
二、运行scapy爬虫项目
1)通过执行scrapy crawl spidername由log函数输出
当在操作系统提示符下运行scapy爬虫项目时,有时会在其scrapy.Spider的子类的parse()函数中直接调用self.log()进行内容输出,此时的中文显示处理同交互式Scrapy shell。
2)通过执行scrapy crawl spidername由pipline输出文件
当在操作系统提示符下运行scapy爬虫项目时,如果需要将抓取的内容保存到文件,此时需要以下三项操作:
①抓取的结果输出到文件首先要用到pipline。在爬虫项目根目录下打开settings.py文件,该文件为项目基础设置文件。查询ITEM_PIPELINES,该项为启用管道,并将其前面的注释符号#删除,例如对于名为properties工程:
ITEM_PIPELINES = {
    'properties.pipelines.PropertiesPipeline': 300,
}
 
②修改爬虫项目根目录下的piplines.py文件,加入文件初始化及抓取项处理函数,以名为properties工程为例:
import json  
import codecs
class PropertiesPipeline(object):
    def __init__(self):
        #定义文件编码及名称
        self.file =codecs.open('lianjia_data_utf8.json', 'wb', encoding='utf-8')
        
    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + '\n'  
        # 写入一行,每行为一个抓取项  
        self.file.write(line.decode("unicode_escape")) 
        return item
 
③通过scrapy genspider basic web生成名为basic的蜘蛛,并只爬取web域的内容。修改该蜘蛛文件内容:
# -*- coding: utf-8 -*-
import scrapy
from properties.items import PropertiesItem
from scrapy.selector import Selector  
 
class BasicSpider(scrapy.Spider):
    name = 'basic'
    allowed_domains = ['web']
    start_urls = ['https://example.com/ershoufang']
    def parse(self, response):
        all = self.__one_get(response)
        return all
 
    def __one_get(self,response):
        item = PropertiesItem()
        item['title'] = [s.encode('utf-8') for s in response.xpath('//ul[@class="sellListContent"]/li[1]/div[1]/div[1]/a/text()').extract()]
        item['price'] = response.xpath('//ul[@class="sellListContent"]/li[1]/div[1]/div[6]/div[1]/span/text()').re('[,0-9]+')
         return item
3)通过执行scrapy crawl spidername -o filename.json输出到文件
此时仅需要在工程的根目录下setting.py文件中设置:
FEED_EXPORT_ENCODING = ‘utf-8’ 
 
著作权归作者所有。商业转载请联系本站作者获得授权,非商业转载请注明出处 ZZKOOK

您可能感兴趣的文章

登录以发表评论

评论

本人一定安利

 
144
紫苏的头像

楼主真的零差评

 
176
图灵的头像

博主实在内行

 
133
Cay的头像