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到了吗?
又是一年中秋,月是故乡明,祝大家中秋快乐,家庭幸福。