python3爬蟲學習筆記(一)初入爬蟲 urllib學習
一、爬蟲是什麼
網路爬蟲(也叫做網頁蜘蛛),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。如果把網際網路比做成一個大的蜘蛛網,蜘蛛網上每個節點都有大量的資料,爬蟲就像一隻小蜘蛛通過網頁的地址找到網站並獲取資訊:HTML程式碼/JSON資料/二進位制資料(圖片、視訊)。
二、URL--有了地址爬蟲才知道去哪裡爬
URL的格式:(帶方括號[]的為可選項)protocol :// hostname[:port] / path / [;parameters][?query]#fragment
(1)protocol(協議):指定使用的傳輸協議
(2)hostname(主機名):是指存放資源的伺服器的
(3)port(埠號):整數,可選,省略時使用方案的預設埠,各種傳輸協議都有預設的埠號,如http的預設埠為80。
(4)path(路徑):由零或多個“/”符號隔開的字串,一般用來表示主機上的一個目錄或檔案地址。
三、urllib
在python中,學習爬蟲經常要使用到urllib這個模組,下面結合一些例項來介紹一下urllib。
urllib中包括了四個模組:urllib.request , urllib.error , urllib.parse , urllib.robotparser
urllib.request :用來開啟和讀取URL
urllib.error:包含了urllib.request產生的異常
urllib.parse:用來解析和處理URL
urllib.robotparse:用來解析頁面的robots.txt檔案
(1)urllib.request模組--開啟和讀取網站
簡單的開啟和讀取網站
urllib.request.urlopen(url):用來開啟一個網站(其實還有別的引數,具體可以去查python裡面的help)
返回來的如同一個文字,可以採用read()來讀取
import urllib.request response = urllib.request.urlopen("https://www.baidu.com") html = response.read() print(html)
這個時候的到的結果,但都是二進位制亂碼
b'<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://
","http://"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><meta http-
equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>\r\n</body>\r\n</html>'
>>>
這個時候可以加上decode()將網頁的程式碼進行解析,但是要去網頁程式碼裡面找到編碼格式為utf-8(審查元素,在head點開,charset那裡)
import urllib.request
response = urllib.request.urlopen("https://www.baidu.com")
html = response.read()
html = html.decode("utf-8")
print(html)
<html>
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
<body>
<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>
整個結果就會變得工整很多
額外的問題:獲取編碼方式
這裡遇到了一個問題,關於編碼方式的獲取有點麻煩,這裡查了別的方法來獲取編碼方式:
用第三方庫chardet裡面chardet.detect()就可以的到一個包含了編碼方式的字典
import chardet
import urllib
url="https://www.baidu.com"
content = urllib.urlopen(url).read()
result= chardet.detect(content)#這裡得到的是一個字典
encoding = result['encoding']#得到字典裡面的編碼方式
print(encoding)
除了read()其它讀取網站的方式
geturl():返回URL的一個字串
info():返回的是meta標記的的資訊(html網頁原始碼中一個重要的html標籤,例如作者、日期和時間、網頁描述、關鍵詞、頁面重新整理等)
getcode():返回的是http的狀態碼,如果返回的是200表示請求成功(表示網頁伺服器HTTP響應狀態的3位數字程式碼,由 RFC 2616 規範定義)
import urllib.request
url="https://www.baidu.com"
html = urllib.request.urlopen(url)
print("geturl:%s\n"%(html.geturl()))
print("info:%s\n"%(html.info()))
print("getcode:%s\n"%(html.getcode))
geturl:https://www.baidu.com
info:Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 227
Content-Type: text/html
Date: Sun, 22 Jul 2018 03:01:02 GMT
Etag: "5b3c3650-e3"
Last-Modified: Wed, 04 Jul 2018 02:52:00 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BD_NOT_HTTPS=1; path=/; Max-Age=300
Set-Cookie: BIDUPSID=98CE4FF720D964752DFFF7F8757770E8; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1532228462; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=0
X-Ua-Compatible: IE=Edge,chrome=1
Connection: close
getcode:<bound method HTTPResponse.getcode of <http.client.HTTPResponse object at 0x0415C290>>
用urlopen的data引數向伺服器傳送資料
data是urlopen裡面可選的引數,可以向伺服器傳送資料(根據http的規範,GET用於獲取資訊,POST向伺服器提交資料)。如果你傳遞了這個data引數,它的請求方式就不再 是GET方式請求,而是POST。但是data是位元組流編碼格式的內容,即bytes型別,可以通過接下來學到的urllib.parse.urlencode()函式將字串自動轉換為上述格式。
下一篇繼續介紹urllib其它模組的使用。。。