鱼C论坛

 找回密码
 立即注册
查看: 9557|回复: 13

[学习笔记] 爬虫学习笔记2-----初识爬虫 New!

[复制链接]
发表于 2021-1-25 23:38:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 极品召唤兽 于 2021-1-25 23:56 编辑

(接上篇)

~~点我返回上文~~

res.content


除了文本内容的下载,爬虫还能下载图片、音频、视频等。我们来看一个下载图片的例子:

下载图片的代码如下
import requests

# 获取图片数据
res = requests.get('https://assets.baydn.com/baydn/public/codetime/xiaobei/info.jpg')
# 以二进制写入的方式打开一个名为 info.jpg 的文件
with open('info.jpg', 'wb') as file:
  # 将数据的二进制形式写入文件中
  file.write(res.content)

可以看出,图片的下载和下载小说的步骤几乎一样。区别在于图片是用二进制写入的方式,将数据的二进制形式写入文件当中,而不是字符串形式。


Tips :
如果你将图片的 res.content 打印出来,结果是像下面这样的一堆看不懂的乱码:
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\......
上面的乱码其实是图片的二进制编码,当我们用错误的方式打开,比如用文本形式打开,就会出现如上所示的乱码。


res.text 和 res.content 的区别是:res.text 用于文本内容的获取、下载,res.content 用于图片、音频、视频等二进制内容的获取、下载。

代码演练
import requests

# 获取图片数据
res = requests.get('https://assets.baydn.com/baydn/public/codetime/xiaobei/info.jpg')
# 以二进制写入的方式打开一个名为 info.jpg 的文件
with open('info.jpg', 'wb') as file:
  # 将数据的二进制形式写入文件中
  file.write(res.content)


编码的发展史




我们都知道,计算机的底层是二进制。也就是说,计算机只认识 0 和 1。既然如此,计算机是如何展示文字、符号等信息的呢?
聪明的计算机科学家们想到了编码,将数字和文字、符号一一对应即可。比如 0000 对应 a,0001 对应 b,0010 对应 c(举个例子,实际上并不是这样对应的)。
因为英文字母比较少,加上常用的符号等,总共也就 100 多个。计算机科学家们用一个字节中的 7 位(总共 8 位)定义了一套编码,总共 128(2 的 7 次方)个字符,这就是 ASCII 编码。
随着科技的发展,计算机进入了欧洲国家。128 个字符对美国来说是够用的,但欧洲一些国家的语言,比如法语中,字母上方有注音符号,128 个字符就不够用了。因此欧洲国家决定将最后一个闲置的位也利用上,这样欧洲的编码就有 256(2 的 8 次方)个字符了。
但是不同的国家有不同的字母,这就导致前 128 个字符是一样的,后 128 个字符在不同的国家是不一样的。
不久后,计算机便来到了中国。中国的汉字可是有 10 万多个,256 个是远远不够的。中国计算机科学家们便重新定义了一套编码,也就是 GB2312,这套编码包含了 6763 个常用汉字和一些常用符号等。之后为了扩展能显示的汉字内容,还推出了 GBK 等编码标准。
你可能也发现问题了,每个国家都有自己的编码,还都不一样。发封电子邮件给外国人,在他们看来就都是乱码,这可怎么行!
于是,Unicode(统一码)便出现了。Unicode 是一个很大的集合,现在的规模可以容纳 100 多万个符号,并且每个符号的编码都不一样。
但是 Unicode 有个缺点,就是占用字节过多。英文字母本来只需要一个字节就够了,现在为了统一得用 3、4 个字节,很是浪费!因此导致 Unicode 在很长一段时间内无法推广,直到互联网的出现。
聪明的计算机科学家又想到了新的方法,推出了 UTF-8 编码,UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用 1~4 个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8 即解决了乱码问题,也解决了字节浪费的问题,是现在最常用的编码方式。





res.encoding


res.encoding 就是爬虫获取到数据的编码格式

requests 库会根据内容推测编码格式是什么,然后将 res.encoding 设成推测的格式,在访问 res.text 时使用该格式解码。

当推测的格式错误时,即出现乱码时,就需要我们手动给 res.encoding 赋值成正确的编码

我们来看下面的例子:


import requests

res = requests.get('https://www.baidu.com')
print(res.text)

输出结果是:

<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>&#231;&#153;&#190;&#229;o|&#228;&#184;&#128;&#228;&#184;&#139;&#239;&#188;&#140;&#228;&#189; &#229;°±&#231;&#159;¥é&#129;&#147;</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=&#231;&#153;&#190;&#229;o|&#228;&#184;&#128;&#228;&#184;&#139; class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>&#230;&#150;°é&#151;&#187;</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>&#229;&#156;°&#229;&#155;&#190;</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>è§&#134;é¢&#145;</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è′′&#229;&#144;§</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>&#231;&#153;&#187;&#229;&#189;&#149;</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">&#231;&#153;&#187;&#229;&#189;&#149;</a>');
                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">&#230;&#155;′&#229;¤&#154;&#228;o§&#229;&#147;&#129;</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>&#229;&#133;3&#228;o&#142;&#231;&#153;&#190;&#229;o|</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&#169;2017 Baidu <a href=http://www.baidu.com/duty/>&#228;&#189;&#191;&#231;&#148;¨&#231;&#153;&#190;&#229;o|&#229;&#137;&#141;&#229;&#191;&#133;èˉ&#187;</a>  <a href=http://jianyi.baidu.com/ class=cp-feedback>&#230;&#132;&#143;è§&#129;&#229;&#143;&#141;é|&#136;</a> &#228;o&#172;ICPèˉ&#129;030173&#229;&#143;·  <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>



我们可以看到类似 &#230;&#155;′&#229;¤&#154;&#228;o§&#229; 的乱码,它们其实是中文被错误解码导致的。我们来看看 requests 库推测的编码格式是什么:
import requests

res = requests.get('https://www.baidu.com')
print(res.encoding)
# 输出:ISO-8859-1

我们可以看到,requests 库将编码错误地推测成了 ISO-8859-1 格式。国内网站的编码格式一般都是 UTF-8、GBK 或 GB2312。

上述代码中网站的正确编码格式其实是 UTF-8,我们需要手动将编码修改成 UTF-8,便能显示正确的内容了。


代码演练
import requests

res = requests.get('https://www.baidu.com')
res.encoding = 'utf-8'
print(res.text)

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*


应用总结



1.import requests  
# 导入 requests 模块


2.res = requests.get('网址')
#将获取数据储存在res变量中


3.print(res.status_code)
#反馈获取状态信息


4.with open('孔乙己.txt', 'w') as file:
# 以写入的方式打开一个名为孔乙己的 txt 文档
   file.write(res.text)
# 将数据的字符串形式写入文件中
#下载文字信息


5.with open('info.jpg', 'wb') as file:
# 以二进制写入的方式打开一个名为 info.jpg 的文件
file.write(res.content)
# 将数据的二进制形式写入文件中
#下载图片信息

6.res.encoding = 'utf-8'
#手动设置编码格式


*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*


(第一节结束啦)
  

                               
登录/注册后可看大图

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-25 23:47:23 | 显示全部楼层

回帖奖励 +1 鱼币

大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-26 10:16:20 | 显示全部楼层

回帖奖励 +1 鱼币

甩手就是一个赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-1 10:38:41 | 显示全部楼层

回帖奖励 +1 鱼币

厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-21 22:22:07 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-26 23:36:32 | 显示全部楼层
非常感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-27 07:05:15 | 显示全部楼层
新人初来乍到,学习中啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-29 18:39:00 | 显示全部楼层
.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-24 20:55:06 | 显示全部楼层
不错,小伙子很棒呀,哥哥看好你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-3 15:54:43 | 显示全部楼层
清晰明了,非常有助于初学者!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-5 18:05:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-7 22:33:15 | 显示全部楼层
感谢大佬分享,大佬牛逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-8 09:47:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-17 07:29:33 | 显示全部楼层
今日学习+2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 23:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表