1. 程式人生 > >Python+Requests安裝及抓取網頁原始碼中文亂碼問題的解決

Python+Requests安裝及抓取網頁原始碼中文亂碼問題的解決

剛開始自學Python課程,學習到自制單執行緒小爬蟲,利用pip install requests命令安裝Python的Requests庫(自備梯子,注意如果安裝了不同Python版本的話記得先進入對應版本的pip目錄)。Windows環境下cmd安裝requests庫
安裝完後在IDE中就可以呼叫Requests了。

import requests

於是開始嘗試自己的第一個小爬蟲,借用Requests庫可以很簡單地抓取原始碼:

# -*- coding:utf-8 -*-
import requests
html=requests.get('自己的網站')
print html.text

但這樣執行發現網頁原始碼的中文部分全部亂碼顯示:

<ul>
    <li><a  href="UpLoadFile/2010719174647.jpg" rel="lightbox[1]" title="�����"><img src="UpLoadFile/2010719174647.jpg" width="97" height="86" alt="�����"><p>�����</p></a></li>
    <li><a  href="UpLoadFile/2010719191259.jpg" rel="lightbox[1]"
title="�����">
<img src="UpLoadFile/2010719191259.jpg" width="97" height="86" alt="���ε���"><p>���ε���</p></a></li> <li><a href="UpLoadFile/201071919051.jpg" rel="lightbox[1]" title="�ְ屨����"><img src="UpLoadFile/201071919051.jpg" width="97" height="86" alt="�ְ屨����"
>
<p>�ְ屨����</p></a></li> <li><a href="UpLoadFile/2010719184616.jpg" rel="lightbox[1]" title="���ε���"><img src="UpLoadFile/2010719184616.jpg" width="97" height="86" alt="���ε���"><p>���ε���</p></a></li> <li><a href="UpLoadFile/2010719183418.jpg" rel="lightbox[1]" title="ģ�ߵ���"><img src="UpLoadFile/2010719183418.jpg" width="97" height="86" alt="ģ�ߵ���"><p>ģ�ߵ���</p></a></li> <li><a href="UpLoadFile/201071916438.jpg" rel="lightbox[1]" title="Բ������"><img src="UpLoadFile/201071916438.jpg" width="97" height="86" alt="Բ������"><p>Բ������</p></a></li> </ul>

在網上查詢解決方案,有發現如下幾種方法:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')   #不推薦
import urllib2            #利用Python的urllib2庫抓取網頁
import sys
content = urllib2.urlopen("http://www.higis.cn").read()   #網站頁面是utf-8編碼的。
type = sys.getfilesystemencoding()   # 關鍵
print content.decode("UTF-8").encode(type)  # 關鍵
content.encode('GBK')

分析了幾種解決方案,看來問題的關鍵是網頁原始碼與預設的utf-8編碼不一致導致。瞭解了這個解決起來就容易多了。可以發現要抓取的網頁原始碼中顯示編碼為gb2312

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

所以我們要做的就是在程式碼中新增一句用於指定編碼

html.encoding = 'gb2312'  

這樣再次執行就能成功顯示中文了:

<ul>
    <li><a  href="UpLoadFile/2010719174647.jpg" rel="lightbox[1]" title="碟形彈簧"><img src="UpLoadFile/2010719174647.jpg" width="97" height="86" alt="碟形彈簧"><p>碟形彈簧</p></a></li>
    <li><a  href="UpLoadFile/2010719191259.jpg" rel="lightbox[1]" title="波形彈簧"><img src="UpLoadFile/2010719191259.jpg" width="97" height="86" alt="波形彈簧"><p>波形彈簧</p></a></li>
    <li><a  href="UpLoadFile/201071919051.jpg" rel="lightbox[1]" title="鋼板寶塔簧"><img src="UpLoadFile/201071919051.jpg" width="97" height="86" alt="鋼板寶塔簧"><p>鋼板寶塔簧</p></a></li>
    <li><a  href="UpLoadFile/2010719184616.jpg" rel="lightbox[1]" title="環形彈簧"><img src="UpLoadFile/2010719184616.jpg" width="97" height="86" alt="環形彈簧"><p>環形彈簧</p></a></li>
    <li><a  href="UpLoadFile/2010719183418.jpg" rel="lightbox[1]" title="模具彈簧"><img src="UpLoadFile/2010719183418.jpg" width="97" height="86" alt="模具彈簧"><p>模具彈簧</p></a></li>
    <li><a  href="UpLoadFile/201071916438.jpg" rel="lightbox[1]" title="圓柱彈簧"><img src="UpLoadFile/201071916438.jpg" width="97" height="86" alt="圓柱彈簧"><p>圓柱彈簧</p></a></li>
 </ul>

還有一點要說的是,可能有些網站會阻擋爬蟲爬取,因此需要簡單的偽裝下Headers,如:

user_agent={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36'}
html=requests.get('http://www.baidu.com',headers=user_agent)

爬取完網頁原始碼,接下來就可以利用正則表示式等篩選出我們想要的內容。
至此,本人第一篇部落格文章到此完成,新手一枚,歡迎大家留言討論。