1. 程式人生 > >Python爬蟲:python2使用scrapy輸出unicode亂碼

Python爬蟲:python2使用scrapy輸出unicode亂碼

無力吐槽的python2,對中文太不友好了,不過在早期專案中還是需要用到

沒辦法,還是需要解決

我編寫scrapy爬蟲的一般思路:

  1. 建立spider檔案和類
  2. 編寫parse解析函式,抓取測試,將有用資訊輸出到控制檯
  3. 在資料庫中建立資料表
  4. 編寫item
  5. 編寫model(配合pipline將item寫入資料庫)
  6. 編寫pipline
  7. 執行爬蟲專案,測試儲存的資料正確性

在第2步抓取測試的時候,我並沒有建立資料庫(因為我感覺在資料庫中建立資料表比較麻煩,考慮的因素比較多),並不能儲存資料到資料庫,直接輸出到控制檯又不能很好地看到資料的整體效果

一個解決辦法就是利用scrapy提供的資料匯出中介軟體,將抓取的資料匯出到json或者scv檔案中

$ scrapy crawl spider_name -o person.json

額,python2。。。我的天,抓取的資料大概是這樣的

[
{"name": "\u5f20\u4e39"},
{"name": "\u77bf\u6653\u94e7"},
{"name": "\u95eb\u5927\u9e4f"},
{"name": "\u9c8d\u6d77\u660e"},
{"name": "\u9648\u53cb\u658c"},
{"name": "\u9648\u5efa\u5cf0"}
]

好吧,英文能看懂,中文反而看不懂了,簡直不能忍

接下來對它做點什麼

1、找到scrapy預設配置檔案

# scrapy.settings.default_settings

FEED_EXPORTERS_BASE = {
    'json': 'scrapy.exporters.JsonItemExporter',
    'jsonlines': 'scrapy.exporters.JsonLinesItemExporter',
    'jl': 'scrapy.exporters.JsonLinesItemExporter',
    'csv': 'scrapy.exporters.CsvItemExporter',
    'xml': 'scrapy.exporters.XmlItemExporter'
, 'marshal': 'scrapy.exporters.MarshalItemExporter', 'pickle': 'scrapy.exporters.PickleItemExporter', }

2、看到json的匯出類,按照路徑找到這個類

# scrapy.exporters.JsonItemExporter

class JsonItemExporter(BaseItemExporter):

    def __init__(self, file, **kwargs):
        self._configure(kwargs, dont_fail=True)
        self.file = file
        self.encoder = ScrapyJSONEncoder(**kwargs)
        self.first_item = True

    def start_exporting(self):
        self.file.write(b"[\n")

    def finish_exporting(self):
        self.file.write(b"\n]")

    def export_item(self, item):
        if self.first_item:
            self.first_item = False
        else:
            self.file.write(b',\n')
        itemdict = dict(self._get_serialized_fields(item))
        self.file.write(to_bytes(self.encoder.encode(itemdict)))

看到最下面一句,寫入檔案,後面還對其進行了編碼,我們就在這裡做工作

3、改寫JsonItemExporter
方法1:

import json

class MyJsonItemExporter(JsonItemExporter):
    def export_item(self, item):
        if self.first_item:
            self.first_item = False
        else:
            self.file.write(b',\n')
        itemdict = dict(self._get_serialized_fields(item))
        self.file.write(json.dumps(itemdict, ensure_ascii=False))

繼承原有的JsonItemExporter類,將最下面的寫入檔案程式碼修改即可,這種方式比較直觀,也比較簡單

方式2:
我們注意到JsonItemExporter中的初始化函式有一個屬性

self.encoder = ScrapyJSONEncoder(**kwargs)

下面寫入的時候也用到了,順藤摸瓜,依次找到下面兩個類,部分程式碼省略

class ScrapyJSONEncoder(json.JSONEncoder):
    pass

class JSONEncoder(object):

    def __init__(self, skipkeys=False, ensure_ascii=True,
            check_circular=True, allow_nan=True, sort_keys=False,
            indent=None, separators=None, encoding='utf-8', default=None):

這樣看來,我們也可以這麼改寫

class MyJsonItemExporter(JsonItemExporter):
    def __init__(self, file, **kwargs):
        super(MyJsonItemExporter, self).__init__(
            file, ensure_ascii=False, **kwargs
        )

僅僅只是添加了ensure_ascii=False, 這樣看起來,逼格就高了許多

4、使用MyJsonItemExporter
可以在爬蟲中單獨設定,也可以設定在全域性settings裡邊

 custom_settings = {
    "FEED_EXPORTERS_BASE":{
            "json": "MyJsonItemExporter"
    }
}

再次執行爬蟲,這次我能看懂中文了

[
{"name": "張丹"},
{"name": "閆大鵬"},
{"name": "瞿曉鏵"},
{"name": "鮑海明"},
{"name": "陳友斌"},
{"name": "陳建峰"}
]

相關推薦

Python爬蟲python2使用scrapy輸出unicode亂碼

無力吐槽的python2,對中文太不友好了,不過在早期專案中還是需要用到 沒辦法,還是需要解決 我編寫scrapy爬蟲的一般思路: 建立spider檔案和類 編寫parse解析函式,抓取測試,將有用資訊輸出到控制檯 在資料庫中建立資料表 編寫item 編

Python爬蟲爬蟲前得了解的事兒

編寫 election 檢查 語言 jpg mage 圖片 一個 網頁 這是關於Python的第14篇文章,主要介紹下爬蟲的原理。 提到爬蟲,我們就不得不說起網頁,因為我們編寫的爬蟲實際上是針對網頁進行設計的。解析網頁和抓取這些數據是爬蟲所做的事情。 對於大部分網頁來講,它

python爬蟲爬取網站視頻

爬蟲 python python爬取百思不得姐網站視頻:http://www.budejie.com/video/新建一個py文件,代碼如下:#!/usr/bin/python # -*- coding: UTF-8 -*- import urllib,re,requests import sys

Python爬蟲新浪新聞詳情頁的數據抓取(函數版)

earch edit arm python爬蟲 print 詳情 contents enter uwa 上一篇文章《Python爬蟲:抓取新浪新聞數據》詳細解說了如何抓取新浪新聞詳情頁的相關數據,但代碼的構建不利於後續擴展,每次抓取新的詳情頁時都需要重新寫一遍,因此,我們需

Python爬蟲HTTP協議、Requests庫

.org clas python爬蟲 print 通用 娛樂 信息 傳輸協議 介紹 HTTP協議: HTTP(Hypertext Transfer Protocol):即超文本傳輸協議。URL是通過HTTP協議存取資源的Internet路徑,一個URL對應一個數據資源。

Python 爬蟲把廖雪峰教程轉換成 PDF 電子書

網絡 odi 變量 turn chrome github htm git 臨時文件 寫爬蟲似乎沒有比用 Python 更合適了,Python 社區提供的爬蟲工具多得讓你眼花繚亂,各種拿來就可以直接用的 library 分分鐘就可以寫出一個爬蟲出來,今天嘗試寫一個爬蟲,將廖雪

Python爬蟲認識urllib/urllib2以及requests

更多 查看 sts urllib2 chrome 超時設置 word 3.0 erro 首先說明一下我的爬蟲環境是基於py2.x的, 為什麽用這個版本呢,因為py2.x的版本支持的多,而且一般會使用py2.x環境,基本在py3.x也沒有太大問題,好了,進入正題! urlli

Python爬蟲現學現用Xpath爬取豆瓣音樂

9.1 tree when href scrapy 發現 pat 直接 where 爬蟲的抓取方式有好幾種,正則表達式,Lxml(xpath)與Beautiful,我在網上查了一下資料,了解到三者之間的使用難度與性能 三種爬蟲方式的對比。 抓取方式 性能 使用難度

python 爬蟲HTTP ERROR 406

spl att sof sel cati python error line TP 解決方法: 設置了Accept頭後解決了,但是還是不知道原因 headers:{ Accept:"text/html, application/xhtml+xml, */

Python爬蟲Xpath語法筆記

上一個 div 運算符 tar 爬蟲 att 語法 ont tab 常用的路勁表達式: 表達式 描述 實例 nodename 選取nodename節點的所有子節點 xpath(‘//div’) 選取了div節點的所有子節點 / 從根節點選取 xpath

Python爬蟲抓取手機APP的數據

sig ner ont sele ebo span fail pytho 抓取 摘要: 大多數APP裏面返回的是json格式數據,或者一堆加密過的數據 。這裏以超級課程表APP為例,抓取超級課程表裏用戶發的話題。 1、抓取APP數據包 方法詳細可以參考這篇博文:

我的第一個python爬蟲爬取豆瓣top250前100部電影

爬取豆瓣top250前100部電影   1 # -*-coding=UTF-8 -*- 2 3 import requests 4 from bs4 import BeautifulSoup 5 6 headers = {'User-Agent':'Moz

python爬蟲爬取鏈家深圳全部二手房的詳細信息

data sts rip 二手房 lse area 列表 dom bubuko 1、問題描述: 爬取鏈家深圳全部二手房的詳細信息,並將爬取的數據存儲到CSV文件中 2、思路分析: (1)目標網址:https://sz.lianjia.com/ershoufang/ (2

Python爬蟲爬取網站電影資訊

以爬取電影天堂喜劇片前5頁資訊為例,程式碼如下: 1 # coding:UTF-8 2 3 import requests 4 import re 5 6 def mov(): 7 headers={'User-Agent':'Mozilla/5.0 (Windo

Python爬蟲Scrapy除錯執行單個爬蟲

一般執行Scrapy專案的爬蟲是在命令列輸入指令執行的: $ scrapy crawl spider 每次都輸入還是比較麻煩的,偶爾還會敲錯,畢竟能少動就少動 Scrapy提供了一個命令列工具,可以在單個spider檔案中加入以下程式碼: from scrapy im

Python爬蟲Request Payload和Form Data的簡單區別

Request Payload 和 Form Data 請求頭上的引數差別在於: Content-Type Form Data Post表單請求 程式碼示例 headers = { "Content-Type": "application/x-www-form-urlen

Python爬蟲mac環境apktool反編譯Android安卓程式碼

所需工具 Java環境 apktool:反編譯APK檔案,得到classes.dex檔案 dex2jar:將反編譯後的classes.dex檔案轉化為.jar檔案 jd-gui:用於將.jar檔案轉換成java程式碼 以上所需的工具打包下載: 連結

Python爬蟲Scrapy的get請求和post請求

scrapy 請求繼承體系 Request |-- FormRequest 通過以下請求測試 GET: https://httpbin.org/get POST: https://httpbin.org/post get請求 方式:通過Request 傳送 im

Python爬蟲帶參url的拼接

  如果連線直接這樣寫,看上去很直觀,不過引數替換不是很方便,而且看著不舒服 https://www.mysite.com/?sortField=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&

Python爬蟲Windows系統下用pyquery庫解析含有中文的本地HTML檔案報UnicodeDecodeError的解決方法

由於Windows系統預設GBK編碼,用pyquery解析本地html檔案,如果檔案中有中文,會報錯: UnicodeDecodeError: 'gbk' codec can't decode byte 0xa3 in position 12: illegal multibyte sequenc