python3實現網路爬蟲(1)--urlopen抓取網頁的html
準備開始寫一些python3關於爬蟲相關的東西,主要是一些簡單的網頁爬取,給身邊的同學入門看。
首先我們向網路伺服器傳送GET請求以獲取具體的網頁,再從網頁中讀取HTML內容。
我們大家平時都使用網路瀏覽器,並且它已經成為我們上網不可或缺的軟體。它建立資訊的資料包,傳送他們,然後把我們獲取的的資料 顯示 成漂亮的影象、聲音、視訊和文字。我們應該注意的是,瀏覽器就是程式碼,而程式碼是可以分解的,可以分解成許多基本元件,可重用、重寫,以及做成我們想要 的任何東西。
那麼現在我們就來看看如何從一個網頁獲取html並顯示出來(程式碼可在pycharm等編輯器 中編寫):
#coding:utf-8 from urllib.request import urlopen html=urlopen("http://tieba.baidu.com/") print(html.read())
當我們執行這個程式後會得到如下的結果:
b'<!DOCTYPE html><!--STATUS OK--><html><head><meta name="keywords" content="\xe8\xb4\xb4\xe5\x90\xa7,\xe7\x99\xbe\xe5\xba\xa6\xe8\xb4\xb4\xe5\x90\xa7,\xe8\xae\xba\xe5\x9d\x9b,\xe5\x85\xb4\xe8\xb6\xa3,\xe7\xa4\xbe\xe5\x8c\xba,BBS"/><meta name="description" content="\xe7\x99\xbe\xe5\xba\xa6\xe8\xb4\xb4\xe5\x90\xa7\xe2\x80\x94\xe2\x80\x94\xe5\x85\xa8\xe7\x90\x83\xe6\x9c\x80\xe5\xa4\xa7\xe7\x9a\x84\xe4\xb8\xad\xe6\x96\x87\xe7\xa4\xbe\xe5\x8c\xba\xe3\x80\x82\xe8\xb4\xb4\xe5\x90\xa7\xe7\x9a\x84\xe4\xbd\xbf\xe5\x91\xbd\xe6\x98\xaf\xe8\xae\xa9\xe5\xbf\x97\xe5\x90\x8c\xe9\x81\x93\xe5\x90\x88\xe7\x9a\x84\xe4\xba\xba\xe7\x9b\xb8\xe8
這是百度貼吧的首頁啊,程式碼還是比較長的,我就貼上了首頁的一些程式碼。
大家仔細看我們拿回的網頁程式碼會發現,這個程式中拿回來的html中為什麼會有些\xe8\xb4\xb4\xe5的東西,其實呢這個是編碼問題,大家仔細觀察會發現,在html程式碼最前面有b這個字母,後面的html程式碼用引號括起來了,這就表示這是個bytes型別的位元組序列,在這種型別的序列中,中文會用16進位制進行表示,所以我們看不到中文了。關於這個問題呢,是python中的編碼問題,我們可以通過譯碼操作來對bytes進行解碼,這就就要用到decode函數了
下面我們只要稍微修改下程式碼:
#coding:utf-8 from urllib.request import urlopen html=urlopen("http://tieba.baidu.com/") print(html.read().decode('utf-8'))
當我們再次執行這個程式會得到如下的結果:
<!DOCTYPE html><!--STATUS OK--><html><head><meta name="keywords" content="貼吧,百度貼吧,論壇,興趣,社群,BBS"/><meta name="description" content="百度貼吧——全球最大的中文社群。貼吧的使命是讓志同道合的人相聚。不論是大眾話題還是小眾話題,都能精準地聚集大批同好網友,展示自我風采,結交知音,搭建別具特色的“興趣主題“互動平臺。貼吧目錄涵蓋遊戲、地區、文學、動漫、娛樂明星、生活、體育、電腦數碼等方方面面,是全球最大的中文交流平臺,它為人們提供一個表達和交流思想的自由網路空間,並以此彙集志同道合的網友。" /><meta charset="UTF-8
現在我們就可以讀懂這個html了。
有興趣的話可以將抓取到的html程式碼貼上到自己記事本中,將檔案字尾名儲存成.html,然後用瀏覽器開啟,你會發現百度貼吧首頁已經在你自己的電腦上了。
一番觀賞之後,我們來解釋下這個程式中用到的技術啊,程式中我們匯入了一個urllib包中的函式用於訪問網頁。
首先來介紹下urlopen函式:
函式原型:def urlopen(url, data=None, proxies=None)
形參:
(1)url:符合URL規範的字串(包括http,ftp,gopher,local-file標準),其實就是我們平時輸入在瀏覽器中的網址。
(2)data : 向指定的URL傳送的資料字串,GET和POST都可以,但必須符合標準格式,即key=value&key1=value1....
(3)proxies :
代理伺服器地址字典,如果未指定,在WINDOWS平臺上則依據IE的設定,不支援需要驗證的代理伺服器。
例如:proxies = {'http': 'http://www.someproxy.com:3128'},該例子表示一個http代理伺服器http://www.someproxy.com:3128
從程式碼可以看到,我只用到了第一個引數url,後兩個引數是可選的,可以根據自己的需求進行定義的,也可以不指定,這時使用的是預設的引數。
返回值:
返回一個類似檔案物件的物件(file_like) object
該物件擁有的方法為:
info()返回從伺服器傳回的MIME標籤頭,即網頁的頭部資訊。
geturl()返回真實的URL,之所以稱為真實,是因為對於某些重定向的URL,將返回被重定後的,大部分情況下可以認為就是我們輸入的網址
getcode():獲取網頁的狀態碼,200是正常訪問,301是重定向,404是網頁不存在,403是禁止訪問(有可能網頁不存在,也可能是此網站有反爬蟲機制,無法爬取;500是網站正忙)。
其它的函式如 read()、readline()、 readlines()、fileno()、close()則和我們的檔案物件類似了。
下面我們來展示下info()的用法:#coding:utf-8
from urllib.request import urlopen
html=urlopen("http://tieba.baidu.com/")
print(html.info())
程式執行的結果為:
Content-Type: text/html; charset=UTF-8
Date: Sat, 05 Nov 2016 07:54:57 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: Apache
Set-Cookie: TIEBAUID=cb23caae14130a0d384a57f1; expires=Thu, 31-Dec-2020 15:59:59 GMT; path=/; domain=tieba.baidu.com
Set-Cookie: TIEBA_USERTYPE=6a1c7afddb7bc564bf21c11e; expires=Thu, 31-Dec-2020 15:59:59 GMT; path=/; domain=tieba.baidu.com
Set-Cookie: BAIDUID=071A5C2537394FD906AA0DDCDC3E138D:FG=1; expires=Sun, 05-Nov-17 07:54:57 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Tracecode: 32974281920539063562110515
Tracecode: 32974281920790459658110515
Vary: Accept-Encoding
Vary: Accept-Encoding
X-Bd-Id: 12371245289908688739
X-Bd-Oc: 0
X-Bd-Ul: 752bcb03d01cc2fed9326fe0daa239d7
Connection: close
Transfer-Encoding: chunked
雖然這個返回的結果是很多的,但都是以鍵值對的形式展現給我們的,還是比較清晰易於理解的。
我們看看這句:Content-Type: text/html; charset=UTF-8,它告訴我們這個網頁的文字格式是text/html,字符集是utf-8,後面的一些資訊大家有興趣的可以自己去查查資料,這裡就不一一說明了。
下面我們來看看網頁的狀態碼:
#coding:utf-8
from urllib.request import urlopen
html=urlopen("http://tieba.baidu.com/")
print(html.getcode())
執行這個程式我們得到的結果是:200,這就說明我們的訪問的網頁是正常的,我們可以安心解析自己需要的東西了。
好了,這一次就介紹到這裡,還有很多好玩的就留給大家自己去體驗了。