話說晚上上完爬蟲抓取班會以後羣裏有童鞋扔出來了一個網址html
www.runoob.com/python/python-exercise-example1.htmlpython
而且疑問說這個地址用urllib2抓出來的竟然是亂碼但願你們一塊兒看看。本着上山打老虎的精神我先是不信邪的寫了一下代碼從新運行了一下而後出來一大羣這種東西。
python爬蟲
【代碼1】ide
import urllib2網站
ur1='http://www.runoob.com/python/python-exercise-example1.html'ui
reponse=urllib2.urlopen(ur1)編碼
r=reponse.read()url
print rspa
【運行結果1】code
瞬間感受有一種扯淡的感受。不過做爲一個白條碼農雖然可能沒有「愚公移山」找bug的精神但不找一找總感受有點不太對因此根據僅有的一點知識就開始進行嘗試開始認爲是編碼問題並且通常來說很大可能也是編碼問題就先試着轉了一下碼。由於網頁是utf8編碼不知道如何查看網頁編碼的同窗請找度娘詢問一下因此就想着轉碼一下估計就能夠了因而就利用了decode轉碼先嚐試一下。
爲小白着想解釋一下decode:decode的做用是將其餘編碼的字符串轉換成unicode編碼如str1.decode('gb2312')表示將gb2312編碼的字符串str1轉換成unicode編碼。
【代碼2】
import urllib2
ur1='http://www.runoob.com/python/python-exercise-example1.html'
reponse=urllib2.urlopen(ur1)
r=reponse.read()
r=r.decode('utf-8')
當我在等着biu一下就行了的時候結果又坑了。
【運行結果2】
UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1: invalid start byte。
看到這個結果以後我第一個想法是是否是網頁內部還存在其餘編碼不止utf8在個別位置還採用了其餘類型的編碼。因而又去找了一下度娘根據某些大神的說法通常對於中文網站基本是UTF-8,GB2312,能夠GB18030通吃。因而我又把最後 r=r.decode('utf-8')中的編碼改爲了r=r.decode('GB2312')但是結果仍是出現了問題。
【運行結果2-GB2312】
UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 1-2: illegal multibyte sequence
這個時候根據我僅有的一點小白知識發現這個問題貌似我有點不知道該怎麼解決了但在這個時候我想仍是試試python3吧若是還不行我就繳械投降了。
因而有用python3的requests模塊兒寫了一下。
【代碼3-python3】
import requests
r=requests.get("http://www.runoob.com/python/python-exercise-example1.html")
print(r.encoding)#打印網頁內容編碼
print(r.text)#打印網頁內容
當我等着報錯的時候竟然出告終果。
【運行結果3】
utf-8網頁編碼
<!Doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Python 練習實例1 | 菜鳥教程</title>
結果太長只摘取部份內容
當看到結果我就在想python3能夠出來而2出現亂碼並且程序報出的編碼確實是utf8那會不會是二者對網頁的解析不太同樣python2缺乏了某些步驟或者方法。因而就問了度娘」python2抓取網頁亂碼問題「這個時候就看到了答案
不少亂碼問題是編碼形成的但另外一個形成亂碼的緣由是壓縮格式不少規模較大的網站都是以gzip的壓縮格式輸出頁面的因此在用BS解析以前須要先判斷該網頁是否通過壓縮若是通過壓縮則先進行解壓操做。
緊接着下一步就開始嘗試解壓縮
【代碼4】
import gzip
import StringIO
import urllib2
ur1='http://www.runoob.com/python/python-exercise-example1.html'
reponse=urllib2.urlopen(ur1)
r=reponse.read()
data = StringIO.StringIO(r)
gzipper = gzip.GzipFile(fileobj=data)
html = gzipper.read()
print html
解決問題
【運行結果4】
<!Doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Python 練習實例1 | 菜鳥教程</title>
結果太長只摘取部份內容
【附1:關於亂碼問題簡單介紹的網頁】
http://www.cnblogs.com/bbcar/p/3625084.html
【附2:用python爬蟲抓站的一些技巧總結】
http://www.open-open.com/lib/view/open1375945149312.html
ps感謝張錦添同窗提出的問題及最後找到的技巧總結