Python爬蟲:python2使用scrapy輸出unicode亂碼
無力吐槽的python2,對中文太不友好了,不過在早期專案中還是需要用到
沒辦法,還是需要解決
我編寫scrapy爬蟲的一般思路:
- 建立spider檔案和類
- 編寫parse解析函式,抓取測試,將有用資訊輸出到控制檯
- 在資料庫中建立資料表
- 編寫item
- 編寫model(配合pipline將item寫入資料庫)
- 編寫pipline
- 執行爬蟲專案,測試儲存的資料正確性
在第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