前言
一直对爬虫比较感兴趣,网络爬虫不仅能获取自己想要的数据,还能做到一些有趣的事情。例如破解影视VIP。。图书馆座位自动预约脚本等。。咳咳,主要还是可以做一些好事情!下面跟着b站的视频做一些相应的学习记录,不断更新,视频链接如下:
一、爬虫核心
- 爬取网页:通过程序(模拟浏览器),根据url爬取整个网页的内容
- 解析数据:将网页中的所有信息进行解析,抓取想要的数据
- 关键难点:爬虫和反爬虫之间的博弈
二、爬虫的分类
- 通用网络爬虫(Scalable Web Crawler):主要为门户站点搜索引擎和大型Web服务提供商采集数据。缺点是抓取到的数据大多是无用的,并且因为其商业性,例如百度就可以进行竞价排名,影响用户需求的精准度。
- 聚焦网络爬虫(Focused Crawler):根据需求,实现爬虫程序,抓取需要的数据。和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求。这也是程序员主要学习的类型。
设计思路:
- 确定要爬的url
- 模拟浏览器通过http协议访问url,获取服务器返回的html页面
- 解析html字符串
三、反爬手段
- User-Agent
- 代理IP
- 验证码
- 动态加载网页
- 数据加密
四、urllib库的简单使用
urllib是python自带的一个库,无需手动下载。我们可以用urllib.request.urlopen()方法爬取某个url。
这里做一个小提醒,是我做的一件很蠢的事情,大神请忽略。。我首先创建了一个项目,然后在项目下创建了一个py文件,想着是学习urllib库,干脆就起名urllib.py吧。因为urllib是python自带的库,直接import urllib.request。咦!怎么回事,怎么导入语句老是报错!拼写明明没有问题。找了很久才发现问题,这里记录下来避免再犯同样的蠢问题:py文件的命名一定不要和库重名,这样程序不知道导入哪一个会起冲突。
言归正传,具体步骤为:
- 拿到url,即要爬取的地址,以百度为例
import urllib.request
url = "http://www.baidu.com"
- 模拟浏览器向服务器发送请求
res = urllib.request.urlopen(url)
- 使用read()方法获取响应中页面的源码
content = res.read()
- 打印数据(页面源码)
print(content)
结果如下,发现问题,根本不是人能读懂的东西。。
可以发现打印的内容中以’b’开头。在python里,以b开头的字符串是字节(bytes)类型,这是因为read()方法返回的就是字节形式的二进制数据,很明显不是我们想要的,我们需要改变她的编码格式,从而可读。
处理方法很简单,在read()函数后再添加一个decode(‘utf-8’)即可。及将二进制字符串解码为‘utf-8’编码形式。
完整代码如下:
import urllib.request
url = "http://www.baidu.com"
res = urllib.request.urlopen(url)
content = res.read().decode('utf-8')
print(content)
最终结果如下图,也有了中文,是我们需要的页面源码,之后就可以进行解析了。
总结
爬虫的应用十分广泛,给自己立个flag,坚持学习做到日更。本节主要是简单总结了爬虫的基础知识,还有使用urllib库完成了爬虫的第一步——爬取页面,继续加油!