Python爬蟲first day之urllib庫

onlywishes 2022-01-07 05:41:02 阅读数:804

python day urllib

 urllib庫的認識


1.urllib.request——請求模塊



1.1 urlopen

urlopen是urllib.request模塊提供的最基本的構造HTTP請求的方法,可以模擬瀏覽器的一個請求發起過程


1.1.1 獲取一個get請求

import urllib.request
#獲取一個get請求
response = urllib.request.urlopen("http://www.baidu.com")
print(response.read().decode("utf-8"))

1.1.2 獲取一個post請求

import urllib.request
import urllib.parse
data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8")
response = urllib.request.urlopen("http://httpbin.org/post",data=data )
print(response.read().decode("utf-8"))
  • bytes 是一個類,調用它的構造方法,也就是 bytes(),可以將字符串按照指定的字符集轉換成 bytes;如果不指定字符集,那麼默認采用 UTF-8。
  • 字符串本身有一個 encode() 方法,該方法專門用來將字符串按照指定的字符集轉換成對應的字節串;如果不指定字符集,那麼默認采用 UTF-8。

1.1.3 data參數
data參數是可選的,並且是字節流編碼格式(可以用urllib.parse.urlencode()和bytes()方法將參數轉化為字節流編碼格式的內容)。如果要使用data參數,則請求方式為POST


1.1.4 urlopen返回的response對象是http.client. HTTPResponse類型


1.1.5 Timeout參數

timeout參數用於設置超時,單比特為秒,若不指定timeout,則使用全局默認時間。若請求超時,則會拋出urllib.error.URLError异常,可以通過try except處理异常。

import urllib.request
import urllib.error
try:
response = urllib.request.urlopen("http://httpbin.org/get", timeout=0.01)
print (response.read().decode("utf-8"))
except urllib.error.URLError as e:
print("timt out!")

 2.1 request

用來傳遞更多的請求參數,如 url,headers,data, method
import urllib.request
import urllib.error
url = "https://www.douban.com"
headers = {"User-Agent":" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.6241 SLBChan/11"
}
req = urllib.request.Request(url=url,headers=headers) #此處傳遞參數有兩個
response = urllib.request.urlopen(req) #response 接收響應
print(response.read().decode("utf-8"))

另一種方法添加headers
from urllib import request, parse
url = 'http://baidu.com/post'
dict = {
'name': 'asd'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, method='POST')
req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

打印出響應類型,狀態碼等

import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(type(response)) #響應類型
print(response.status) # 狀態碼 判斷請求是否成功
print(response.getheaders()) # 響應頭 得到的一個元組組成的列錶
print(response.getheader('Server')) #得到特定的響應頭
print(response.read().decode('utf-8')) #獲取響應體的內容,字節流的數據,需要轉成utf-8 格式


2.urllib.error——异常處理模塊

 HTTPError是URLError的子類,他的异常有3個屬性:

code:返回狀態碼 404錶示不存在,500錶示服務器錯誤....

reason:返回錯誤原因

headers:返回請求頭 


因為HTTPError是URLError的子類,先檢查是不是HTTPError,如果不是再檢查是不是URLError,如果都不是,說明請求成功

from urllib import request, error
try:
response = request.urlopen('http://baid.com/index.htm')
except error.HTTPError as e:
print(e.reason,'\n' ,e.code,'\n' ,e.headers,'\n' )
except error.URLError as e:
print(e.reason)
else:
print('Request Successfully')

第二種寫法

from urllib.request import Request,urlopen
#請求某一個地址
req = Request("http://xx.baidu.com")
try:
response = urlopen(req)
except urllib.error.URLError as e:
if hasattr(e,'reason'):
print("We failed to reach a server")
elif hasattr(e,'code'):
print("The server couldn\'t ful fill the request.")
else:
print("everything is fine")

hasattr判斷是否擁有這個屬性,如果有的話就打印,如果沒有判斷下一個

 try    except   用就完了


3.urllib.parse——url解析模塊

URL解析功能側重於將URL字符串拆分為其組件,或者將URL組件組合為URL字符串。

urllib.parse.urlparse(urlstring,scheme ='',allow_fragments = True )


使用 urlencode() 函數可以將一個 dict 轉換成合法的查詢參數:

看到特殊字符也被正確地轉義了。相對的,可以使用 parse_qs() 來將查詢參數解析成 dict。

from urllib.parse import urlencode
query_args = {
'name': 'dark sun',
'country': '中國'
}
query_args = urlencode(query_args)
print(query_args)
from urllib.parse import parse_qs
print(parse_qs(query_args))

 小記

I have to say that what I have learned today is the thing which makes my head big.At first, I felt OK. Later, I felt more and more confused and thought what happened.Today's content is not very clear and needs to be improved.

版权声明:本文为[onlywishes]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201070541021021.html