python3中request.urlopen()和requests.get()方法的區別

爬蟲裏面,我們不可避免的要用urllib中的urlopen()和requests.get()方法去請求或獲取一個網頁的內容,這裏面的區別在於urlopen打開URL網址,url參數可以是一個字符串url或者是一個Request對象,返回的是http.client.HTTPResponse對象.http.client.HTTPResponse對象大概包括read()、readinto()、getheader()、getheaders()、fileno()、msg、version、status、reason、debuglevel和closed函數,其實一般而言使用read()函數後還需要decode()函數,返回的網頁內容實際上是沒有被解碼或的,在read()得到內容後通過指定decode()函數參數,可以使用對應的解碼方式。 

requests.get()方法請求了站點的網址,然後打印出了返回結果的類型,狀態碼,編碼方式,Cookies等內容


我在剛學到他們的時候也很懵逼,自己慢慢的琢磨,然後用個笨辦法寫了個這個來做區別

使用方法和他們區別的代碼如下:

from lxml import etree
import requests
from urllib import request

url = "http://www.baidu.com/"
req = request.Request(url)
response1 = request.urlopen(req)
html1 = etree.HTML(response1.read())
print("這個是response1: ", response1)#打印出response1是什麼鬼
print("這個是type(response1: " , type(response1))#打印出response1的類型
print("這個是type(html1): " , type(html1)) #打印html1的類型
print("這個是html1: " , html1)#打印出response1的用etree解析爲html網頁元素
#打印網頁的文本信息,由於這個response1只能調用一次所以這裏會打印出空
print(response1.read().decode())#打印出網頁源碼的文本信息

print('*'*70)

response2 = requests.get(url)
html2 = etree.HTML(response2.text)
print("這個是response2: ",response2)#打印出response2的內容
print("這個是type(response2): " , type(response2))#打印出response2的類型
print("這個是type(response2.text): " , type(response2.text))#打印出response2用text輸出是的類型
print(type(response2.content.decode()))#打印出內容解碼的類型
print("這個是type(html2): ", type(html2))#打印出response2用etree解析爲網頁元素信息的html2的類型
print("這個是html2 :", html2)#打印出response2用etree解析爲網頁元素信息的html2
#打印網頁的文本信息,用resquests有三種方法可以打印出網頁的信息,這三種方法打印出來的都一樣的
response2.encoding = 'utf-8'#給網頁指定編碼信息,是爲了用text輸出網頁文本信息的
print(response2.text)#打印出網頁的文本信息
print(response2.content.decode())#打印出網頁源碼的文本信息,這樣寫是爲了避免出現中文亂碼
print(str(response2.content,"utf-8"))#打印出網頁源碼的文本信息,這樣寫是爲了避免出現中文亂碼

結果如下:

123.png

requests對象的get和post方法都會返回一個Response對象,這個對象裏面存的是服務器返回的所有信息,包括響應頭,響應狀態碼等。其中返回的網頁部分會存在.content和.text兩個對象中。兩者區別在於,content中間存的是字節碼,而text中存的是Beautifulsoup根據猜測的編碼方式將content內容編碼成字符串。直接輸出content,會發現前面存在b'這樣的標誌,這是字節字符串的標誌,而text是',沒有前面的b,對於純ascii碼,這兩個可以說一模一樣,對於其他的文字,需要正確編碼才能正常顯示。大部分情況建議使用.text,因爲顯示的是漢字,但有時會顯示亂碼,這時需要用.content.decode('utf-8'),中文常用utf-8和GBK,GB2312等。這樣可以手工選擇文字編碼方式。.text是現成的字符串,.content還要編碼,但是.text不是所有時候顯示都正常,這是就需要用.content進行手動編碼

簡而言之:

text返回的是Unicode型的數據 
content返回的是是二進制的數據。 
也就是說,如果你想取文本,可以通過r.text。 
如果想取圖片,文件,則可以通過r.content


再附上一張requests的圖:

hrrp.png

圖來自:

https://www.cnblogs.com/puresoul/p/7488488.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章