1. 程式人生 > >python3爬蟲學習筆記(一)初入爬蟲 urllib學習

python3爬蟲學習筆記(一)初入爬蟲 urllib學習

一、爬蟲是什麼

網路爬蟲(也叫做網頁蜘蛛),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。如果把網際網路比做成一個大的蜘蛛網,蜘蛛網上每個節點都有大量的資料,爬蟲就像一隻小蜘蛛通過網頁的地址找到網站並獲取資訊:HTML程式碼/JSON資料/二進位制資料(圖片、視訊)。

二、URL--有了地址爬蟲才知道去哪裡爬

URL的格式:(帶方括號[]的為可選項)protocol :// hostname[:port] / path / [;parameters][?query]#fragment

(1)protocol(協議):指定使用的傳輸協議

(2)hostname(主機名):是指存放資源的伺服器的

域名系統(DNS) 主機名或 IP 地址。有時,在主機名前也可以包含連線到伺服器所需的使用者名稱和密碼(格式:username:password@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其它模組的使用。。。