Python獲取爬蟲數據, r.text 與 r.content 的區別


1.簡單粗暴來講:

text 返回的是unicode 型的數據,一般是在網頁的header中定義的編碼形式。

content返回的是bytes,二級制型的數據。

如果想要提取文本就用text

但是如果你想要提取圖片、文件,就要用到content

2.詳細一點來講:

用了request.get方法后,返回一個response對象,這個對象里面存的是服務器返回的所有信息,包括響應頭,響應狀態碼等。

其中返回的網頁部分會存在.content和.text兩個對象中。如果需要獲得這些網頁原始數據,我們可以通過r.text 或 r.content來獲取數據。

  • .text 存的是.content 編碼后的字符串
  • .content中間存的是字節碼

一般來說 .text直接用比較方便,返回的是字符串,但是有時候會解析不正常,導致返回的是一堆亂碼。這時需要用.content.decode('utf-8'),使其正常顯示。

總的來說.text是現成的字符串,.content還要編碼,但是.text不是所有時候顯示都正常(需要用.content.decode()進行手動編碼)

3.舉栗子

3.1 例一 r.text

輸入:

import requests
response = requests.get("http://m.news.cctv.com/2019/09/12/ARTI80tyFZxlGernTG2Wljf7190912.shtml")
print(response.text)
print("Finish!")

輸出結果:

   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="filetype" content="1"> 
<meta name="publishedtype" content="1"> 
<meta name="pagetype" content="1"> 

<meta name="author" content="å¼ æ…§å½¬"> 
<meta name="source" content="央视新闻客户端"> 
<title>时政新闻眼丨庆祝新中国成立70å‘¨å¹´å‰å¤•ï¼Œä¹ è¿‘å¹³ä¸ºä½•è§†å¯Ÿè¿™ä¸ªåœ°æ–¹ï¼Ÿ_央视新闻客户端_央视网(cctv.com)</title>    
	var commentTitle = "时政新闻眼丨庆祝新中国成立70å‘¨å¹´å‰å¤•ï¼Œä¹ è¿‘å¹³ä¸ºä½•è§†å¯Ÿè¿™ä¸ªåœ°æ–¹ï¼Ÿ"; //è¯„è®ºæ ‡é¢˜
	/* 评论对象ID 20位以内的字符串 每个被评论对象不同20120420------ */(此處省略一萬字)  </script>
<!--Gridsum tracking code end. -->
</body>
</html>
Finish!

明顯看到有亂碼出現,在例三解決。

3.2 例二 r.content

輸入:

import requests
response = requests.get("http://m.news.cctv.com/2019/09/12/ARTI80tyFZxlGernTG2Wljf7190912.shtml")
print(response.content)
print("Finish!")

輸出結果:

b'   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n<html xmlns="http://www.w3.org/1999/xhtml">\r\n<head>\r\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r\n<meta name="filetype" content="1"> \r\n<meta name="publishedtype" content="1"> \r\n<meta name="pagetype" content="1"> \r\n\r\n<meta name="author" content="\xe5\xbc\xa0\xe6\x85\xa7\xe5\xbd\xac"> \r\n<meta name="source" content="\xe5\xa4\xae\xe8\xa7\x86\xe6\x96\xb0\xe9\x97\xbb\xe5\xae\xa2\xe6\x88\xb7\xe7\xab\xaf"> \r\n\r\n\r\n<title>\xe6\x97\xb6\xe6\x94\xbf\xe6\x96\xb0\xe9\x97\xbb\xe7\x9c\xbc\xe4\xb8\xa8\xe5\xba\x86\xe7\xa5\x9d\xe6\x96\xb0\xe4\xb8\xad\xe5\x9b\xbd\xe6\x88\x90\xe7\xab(此處省略一萬字)ript type=\'text/javascript\'>\r\n    (function () {\r\nvar s = document.createElement(\'script\');\r\ns.type = \'text/javascript\';\r\ns.async = true;\r\ns.src = (location.protocol == \'https:\' ?\'https://ssl.\' : \'http://static.\') + \'gridsumdissector.com/js/Clients/GWD-002757-56B3A5/gs.js\';\r\nvar firstScript = document.getElementsByTagName(\'script\')[0];\r\nfirstScript.parentNode.insertBefore(s, firstScript);\r\n    })();\r\n</script>\r\n<!--Gridsum tracking code end. -->\r\n</body>\r\n</html>'
Finish!

與r.text相比,多了b開頭,這是bytes的標志喲(字節字符串),要用的話還要編碼一下。

3.3 例三 r.text出現亂碼,怎么解決(例一作亂碼示范)

輸入:

import requests
response = requests.get("http://m.news.cctv.com/2019/09/12/ARTI80tyFZxlGernTG2Wljf7190912.shtml")
print(response.content.decode('utf-8'))
print("Finish!")

輸出結果:

   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="filetype" content="1"> 
<meta name="publishedtype" content="1"> 
<meta name="pagetype" content="1"> 

<meta name="author" content="張慧彬"> 
<meta name="source" content="央視新聞客戶端"> 


<title>時政新聞眼丨慶祝新中國成立70周年前夕,xxx為何視察這個地方?_央視新聞客戶端_央視網(cctv.com)</title>
<meta name="catalogs" content="PAGE137(此處省略一萬字)
</script>
<!--Gridsum tracking code end. -->
</body>
</html>
Finish!

與例一對比,這里用了.content.decode('utf-8')后就沒有亂碼啦,get到了嗎?

3.4 例四 r.content() 打開圖片,寫入相關數據

輸入:

import requests
response = requests.get("http://b-ssl.duitang.com/uploads/item/201707/20/20170720111208_EHX2K.jpeg")
with open("love_img.jpeg","wb") as f: 
     f.write(response.content)
print(response.content)
print("Finish!")

輸出結果:

b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x03\x02\x02\x03\x02\x02\x03\x03\x03\x03\x04\x03\x03\x04\x05\x08\x05\x05\x04\x04\x05\n\x0(省略一萬字)\xdf\x93\xff\x00Cj(\xa6#\xa7P6t\xedQ\x1e\xa6\x8a(\x01(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00(\xa2\x8a\x00\xff\xd9'
Finish!

3.4 例四 用r.text() 看圖片,將出現亂亂亂碼

輸入:

import requests
response = requests.get("http://b-ssl.duitang.com/uploads/item/201707/20/20170720111208_EHX2K.jpeg")
print(response.text)
print("Finish!")

輸出結果:

�����JFIF���������C�


�����"��������������	
�������}�!1AQa"q2���#B��R��$3br�	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�����������������������������������������������������������������������������������	
������w�!1AQaq"2�B����	#3R�br�(此處省略一萬字)
?ߓ��Cj(�#�P6t�Q��((���(���(���(���(���(���(���(���(���(���(���(���(���(�����
Finish!

好的,你get到了嗎?
又是一年中秋,月是故鄉明,祝大家中秋快樂,家庭幸福。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM