Python+Requests安裝及抓取網頁原始碼中文亂碼問題的解決
阿新 • • 發佈:2019-01-28
剛開始自學Python課程,學習到自制單執行緒小爬蟲,利用pip install requests命令安裝Python的Requests庫(自備梯子,注意如果安裝了不同Python版本的話記得先進入對應版本的pip目錄)。
安裝完後在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)
爬取完網頁原始碼,接下來就可以利用正則表示式等篩選出我們想要的內容。
至此,本人第一篇部落格文章到此完成,新手一枚,歡迎大家留言討論。