注意:本网站所有内容为自己学习期间记录的笔记,基本都是原作者那边摘抄过来的,不作商业用途也不插播广告。(如有侵权,请联系我删除,15909440083)
第1章 爬⾍概述
1 什么是爬⾍?
1.1 什么是爬⾍?
不知道各位是否遇到过这样的需求. 就是我们总是希望能够保存互联⽹上的⼀些重要的数据信息为⼰所⽤.
⽐如,
- 在浏览到⼀些优秀的让⼈⾎脉喷张的图⽚时. 总想保存起来留为⽇后做桌⾯上的壁纸
- 在浏览到⼀些重要的数据时(各⾏各业), 希望保留下来⽇后为⾃⼰进⾏各种销售⾏为增光添彩
- 在浏览到⼀些奇奇怪怪的劲爆视频时, 希望保存在硬盘⾥供⽇后慢慢品鉴
- 在浏览到⼀些⼗分优秀的歌声曲⽬时, 希望保存下来供我们在烦闷的⽣活中增添⼀份精彩
那么恭喜你. 本课程将⼗分的适合于你. 因为爬⾍就是通过编写程序来爬取互联⽹上的优秀资源(图⽚, ⾳频, 视频, 数据)
1.2 爬⾍和Python
爬⾍⼀定要⽤Python么? ⾮也~ ⽤Java也⾏, C也可以. 请各位记住,编程语⾔只是⼯具. 抓到数据是你的⽬的. ⽤什么⼯具去达到你的⽬的都是可以的. 和吃饭⼀样, 可以⽤叉⼦也可以⽤筷⼦, 最终的结果都是你能吃到饭. 那为什么⼤多数⼈喜欢⽤Python呢? 答案: 因为Python写爬⾍简单. 不理解? 问: 为什么吃⽶饭不⽤⼑叉? ⽤筷⼦?因为简单! 好⽤!
⽽Python是众多编程语⾔中, ⼩⽩上⼿最快, 语法最简单. 更重要的是, 这货有⾮常多的关于爬⾍能⽤到的第三⽅⽀持库. 说直⽩点⼉. 就是你⽤筷⼦吃饭, 我还附送你⼀个佣⼈. 帮你吃! 这样吃的是不是更爽了. 更容易了~
1.3 爬⾍合法么?
⾸先, 爬⾍在法律上是不被禁⽌的. 也就是说法律是允许爬⾍存在的.但是, 爬⾍也具有违法⻛险的. 就像菜⼑⼀样, 法律是允许菜⼑的存在的. 但是你要是⽤来砍⼈, 那对不起. 没⼈惯着你. 就像王欣说过的,技术是⽆罪的. 主要看你⽤它来⼲嘛. ⽐⽅说有些⼈就利⽤爬⾍+⼀些⿊客技术每秒钟对着bilibili撸上⼗万⼋千次. 那这个肯定是不被允许的.
爬⾍分为善意的爬⾍和恶意的爬⾍
- 善意的爬⾍, 不破坏被爬取的⽹站的资源(正常访问, ⼀般频率不⾼, 不窃取⽤户隐私)
- 恶意的爬⾍, 影响⽹站的正常运营(抢票, 秒杀, 疯狂solo⽹站资源造成⽹站宕机)
综上, 为了避免进局子,我们还是要安分守⼰. 时常优化⾃⼰的爬⾍程序避免⼲扰到⽹站的正常运⾏. 并且在使⽤爬取到的数据时,发现涉及到⽤户隐私和商业机密等敏感内容时, ⼀定要及时终⽌爬取和传播
1.4 爬⾍的⽭与盾
反爬机制 ⻔户⽹站,可以通过制定相应的策略或者技术⼿段,防⽌爬⾍程序进⾏⽹站数据的爬取。
反反爬策略 爬⾍程序可以通过制定相关的策略或者技术⼿段,破解⻔户⽹站中具备的反爬机制,从⽽可以获取⻔户⽹站中相关的数据。
robots.txt协议: 君⼦协议。规定了⽹站中哪些数据可以被爬⾍爬取哪些数据不可以被爬取。
2 本课程使⽤的软件概述
本课程中使⽤的开发⼯具:
- python 3.8 (尽量不要⽤最新版的python)
- pycharm (舒服, 但收费, 联系作者有神秘⼯具为您解忧)
如果有基础或者玩⼉的⽐较6的玩家也可以选择以下⼯具:
- anaconda, jupyter
- Visual Studio Code
- python, IDLE (不推荐)
接下来就是安装了. Python安装过程就不赘述了. 注意安装的时候需要把python添加到环境变量中. 其他的没啥注意的。
⾄于Pycharm的安装. 全程⼀路确定即可.
3 第⼀个爬⾍
⾸先,我们还是需要回顾⼀下爬⾍的概念. 爬⾍就是我们通过我们写的程序去抓取互联⽹上的数据资源. ⽐如, 此时我需要百度的资源. 在不考虑爬⾍的情况下, 我们肯定是打开浏览器, 然后输⼊百度的⽹址,紧接着, 我们就能在浏览器上看到百度的内容了. 那换成爬⾍呢? 其实道理是⼀样的. 只不过, 我们需要⽤代码来模拟⼀个浏览器, 然后同样的输⼊百度的⽹址. 那么我们的程序应该也能拿到百度的内容. 对吧~
在python中, 我们可以直接⽤urllib模块来完成对浏览器的模拟⼯作~,
直接上代码
from urllib.request import urlopen
resp = urlopen("http://www.baidu.com") # 打开 百度
print(resp.read().decode("utf-8")) # 打印 抓取到的内容
是不是很简单呢?
我们可以把抓取到的html内容全部写⼊到⽂件中, 然后和原版的百度进⾏对⽐, 看看是否⼀致
from urllib.request import urlopen
resp = urlopen("http://www.baidu.com") # 打开 百度
# print(resp.read().decode("utf-8")) # 打印 抓取到的内容
with open("baidu.html",mode="w", encoding="utf-8") as f: # 创建⽂件
f.write(resp.read().decode("utf-8")) # 保存在⽂件中
OK ~ 我们成功的从百度上爬取到了⼀个⻚⾯的源代码. 就是这么简单, 就是这么炫酷.
你也试⼀下吧~
4 web请求全过程剖析
上⼀⼩节我们实现了⼀个⽹⻚的整体抓取⼯作. 那么本⼩节, 给各位好好剖析⼀下web请求的全部过程, 这样有助于后⾯我们遇到的各种各样的⽹站就有了⼊⼿的基本准则了.
那么到底我们浏览器在输⼊完⽹址到我们看到⽹⻚的整体内容, 这个过程中究竟发⽣了些什么?
这⾥我们以百度为例. 在访问百度的时候, 浏览器会把这⼀次请求发送到百度的服务器(百度的⼀台电脑), 由服务器接收到这个请求, 然后加载⼀些数据. 返回给浏览器, 再由浏览器进⾏显示. 听起来好像是个废话…但是这⾥蕴含着⼀个极为重要的东⻄在⾥⾯, 注意, 百度的服务器返回给浏览器的不直接是⻚⾯, ⽽是⻚⾯源代码(由html, css, js组成). 由浏览器把⻚⾯源代码进⾏执⾏, 然后把执⾏之后的结果展示给⽤户. 所以我们能看到在上⼀节的内容中,我们拿到的是百度的源代码(就是那堆看不懂的⻤东⻄). 具体过程如图.
接下来就是⼀个⽐较重要的事情了. 所有的数据都在⻚⾯源代码⾥么? ⾮也~ 这⾥要介绍⼀个新的概念
那就是⻚⾯渲染数据的过程, 我们常⻅的⻚⾯渲染过程有两种,
- 服务器渲染
这个最容易理解, 也是最简单的. 含义呢就是我们在请求到服务器的时候, 服务器直接把数据全部写⼊到html中, 我们浏览器就能直接拿到带有数据的html内容. ⽐如,