天天看點

python爬蟲之urllib庫學習urllib庫

urllib庫

urllib庫是

Python

中一個最基本的網絡請求庫。可以模拟浏覽器的行為,向指定的伺服器發送一個請求,并可以儲存伺服器返

回的資料。

urllib

庫是python内置的一個http請求庫,不需要額外的安裝。隻需要關注請求的連結,參數,提供了強大的解析。

urllib庫

提供了如下功能:

  • 網頁請求
  • 響應擷取
  • 代理和cookie設定
  • 異常處理
  • URL解析

爬蟲所需要的功能,基本上在

urllib

中都能找到,學習這個标準庫,可以更加深入的了解後面更加便利的

requests

庫。

urllib庫有一下三個子產品:

  • urllb.request 請求子產品
  • urllib.error 異常處理子產品
  • urllib.parse 解析子產品

urllib庫中的urlopen函數:

Python3

urllib

庫中,所有和網絡請求相關的方法,都被集到

urllib.request

子產品下面了,首先來講一下urlopen函數:

實際上,使用浏覽器通路百度,右鍵檢視源代碼。你會發現,跟我們剛才列印出來的資料是一模一樣的。也就是說,上面的三行代碼就已經幫我們把百度的首頁的全部代碼爬下來了。一個基本的url請求對應的python代碼真的非常簡單。 以下對

urlopen

函數的進行詳細講解:

1.url:請求的url。

2.data:請求的

data

,如果設定了這個值,那麼将變成

post

請求。

3.傳回值:傳回值是一個

http.client.HTTPResponse

對象,這個對象是一個類檔案句柄對象。有

read(size)

readline

readlines

以及

getcode

等方法。

     read()方法:讀取整個頁面的全部代碼。

     readline()方法:讀取某一行的代碼,預設是第一行的代碼。

     readlines()方法:按行來讀取整個頁面的代碼存放在數組中。

     getcode()方法:讀取整個頁面的狀态碼。

(1)簡單的get請求

from urllib.request import urlopen
 
# if has Chinese, apply decode()
html = urlopen(
    "http://www.baidu.com/"
).readline().decode('utf-8')
print(html)
           

(2)簡單的post請求

import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'hello':'world'}),encoding='utf-8')
reponse = urllib.request.urlopen('http://httpbin.org/post',data=data)
print(reponse.read())
           

(3)逾時處理

import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'hello':'world'}),encoding='utf-8')
reponse = urllib.request.urlopen('http://httpbin.org/post',data=data)
print(reponse.read())
           

 參考連結:https://blog.csdn.net/qq_27524749/article/details/105119634 網易爬蟲工程師

urlretrieve函數:

urlretrieve() 方法直接将遠端資料下載下傳到本地。

這個函數可以友善的将網頁上的一個檔案儲存到本地。檔案類型可以是網頁的html檔案、圖檔、視訊等媒體檔案。

函數原型:urlretrieve(url, filename=None, reporthook=None, data=None)

  • 參數 url 指定了要下載下傳的檔案的url
  • 參數 finename 指定了儲存本地路徑(如果參數未指定,urllib會生成一個臨時檔案儲存資料。)
  • 參數 reporthook 是一個回調函數,當連接配接上伺服器、以及相應的資料塊傳輸完畢時會觸發該回調,我們可以利用這個回調函數來顯示目前的下載下傳進度。
  • 參數 data 指 post 到伺服器的資料,該方法傳回一個包含兩個元素的(filename, headers)元組,filename 表示儲存到本地的路徑,header 表示伺服器的響應頭。
from urllib import request
 
request.urlretrieve("https://blog.csdn.net/sereasuesue/category_10790248.html",'csdn.html')
 
#前面參數是url,後面是儲存的路徑以及檔案名
           
python爬蟲之urllib庫學習urllib庫

下載下傳圖檔見https://blog.csdn.net/sereasuesue/article/details/113730274

編碼urlencode或者quote

urlencode()函數原理就是首先把中文字元轉換為十六進制,然後在每個字元前面加一個辨別符%。

在url中如果出現一些中文或者字元,url不識别的,則需要進行轉換,使用urllib庫中的urlencode函數,可以把key-value這樣的

鍵值對轉換成我們想要的格式,傳回的是a=1&b=2這樣的字元串,比如:

from urllib import request
from urllib import parse
 
params={'name':'Demo',"age":18}
qs=parse.urlencode(params)
print(qs)


#name=Demo&age=18
           
python爬蟲之urllib庫學習urllib庫

解碼unquote()或者parse_qs函數

unquote()函數與urlencode()函數原理相反,用于解碼已編碼的 URL 字元串,其原理就是把十六進制字元串轉換為中文字元

當urlencode之後的字元串傳遞過來之後,接受完畢就要解碼了——urldecode。urllib提供了unquote()這個函數,可沒有urldecode()函數!

n='%E8%BF%AA%E4%B8%BD%E7%83%AD%E5%B7%B4'
print(parse.unquote(n))
#迪麗熱巴
           

parse_qs函數:

可以将經過編碼後的url參數進行解碼。示例代碼如下:

from urllib import parse
qs = "name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100"
print(parse.parse_qs(qs))

#{'name': ['爬蟲基礎'], 'greet': ['hello world'], 'age': ['100']}
           

URL解析函數urlparse

url='https://baike.baidu.com/item/%E8%BF%AA%E4%B8%BD%E7%83%AD%E5%B7%B4/1180418?fr=aladdin#3'
result = parse.urlparse(url)
print(result)
print('scheme:',result.scheme)  #網絡協定
print('netloc:',result.netloc)  #域名
print('path:',result.path)      #檔案存放路徑
print('query:',result.query)    #查詢字元
print('fragment:',result.fragment)  #拆分文檔中的特殊貓
           

分割函數urlsplit

python爬蟲之urllib庫學習urllib庫

urlparse

urlsplit

基本上是一模一樣的。唯一不一樣的地方是,

urlparse

裡面多了一個

params

屬性,而

urlsplit

沒有這個

params

屬性。比如有一個

url

為:

url = '

https://www.baidu.com/s;index.php?tn=78040160_14_pg&ch=16#1

'

, 那麼

urlparse

可以擷取到

index.php

,而

urlsplit

不可以擷取到。

url

中的

params

也用得比較少。