本文为 Python爬虫的基本知识。
一、爬虫背景与简介
1. 背景
1.1 数据分析定义:
数据分析是用适当的统计分析方法对收集来的大量数据进行分析,将它们加以汇总和理解并消化,以求最大化地开发数据的功能,发挥数据的作用。数据分析是为了提取有用信息和形成结论而对数据加以详细研究和概括总结。
1.2 数据分析过程:
痛点描述 -> 数据获取 -> 数据清洗 -> 数据分析 -> 数据可视化 -> 数据报告
在数据分析分析的任务中,有如下两点需要关注:
- 数据来源:往往是数据分析的痛点,通常的解决方案有:第三方数据平台、用爬虫程序从互联网中提取数据。
- 如何分析:通过对原始数据的处理,使其能够进行数据汇总,分析,有效的操作。
1.3 数据分析四大步骤:
- 数据获取:获取数据,解决从0到1的问题
- 数据清洗:跟分析主题相关指标进行梳理,拆分,合并(预处理)
- 数据分析及可视化:把可分析的、高质量的数据进行汇总,可视化
- 数据报告:把冰冷的、海量的数据转换为易于查看的、会说话的图文呈现
2. 爬虫简介
2.1 什么是爬虫
模拟人的行为访问浏览器获取数据。
2.2 浏览器是如何工作的
- 浏览器获得要访问的地址,并通过网络找寻目标服务器。
- 服务器中安装web服务,根据请求来尝试提取本地文件资源,并以文本模式返回内容。(域名绑定一个ip地址,一个ip地址唯一指定一个服务器)
- 浏览器获得返回的内容(html+css+js),然后对其进行解析,呈献给客户有排版的图文内容
2.3 爬虫步骤
获取数据 -> 解析数据 -> 筛选数据 -> 存储数据
2.4 通用爬虫:搜索引擎用的爬虫
晚上,搜索引擎运行蜘蛛程序(爬虫)批量的访问互联网资源,按照关键字对获取的内容进行分类,存储于数据库中。白天,搜索引擎会响应浏览器者的访问请求,在数据库中迅速匹配关键字相关网址,并返回结果。
2.5 聚焦爬虫:爬虫程序员写的针对某种内容的爬虫
大数据时代,数据获取的方式。
二、爬虫基础
1. requests:获取能够进行url地址访问的对象
get方法,根据url地址返回response资源对象
即请求数据 -> 返回数据:request.get() -> response
status_code:状态码
| 响应状态码 | 说明 | 例子 | 例子说明 |
| :————: | :————: | :—: | :——————: |
| 1xx | 请求接收 | 100 | 继续提出请求 |
| 2xx | 请求成功 | 200 | 请求成功 |
| 3xx | 重定向 | 305 | 应使用代理访问 |
| 4xx | 客户端错误 | 403 | 禁止访问 |
| 5xx | 服务器错误 | 503 | 服务不可用 |content:二进制返回结果
text:文本返回结果
encoding:编码
import requests |
2. BeautifulSoup:解析数据+提取数据
概念:用来对返回的文本形式的网页内容进行解析(打包),对包裹的内容进行解析(浏览器解析),筛选(按照特定语法进行内容的查找)
方法:
① find:返回tag对象,包裹了查找后的单个结果内容
② find_all:返回resultset对象(列表集合对象)
import requests |
属性:[] 获取标签内的属性值
import re |
三、爬虫进阶
1. 伪装头
把爬虫程序伪装为特定版本的浏览器,确保服务器不会排斥我们的爬取
# 添加header访问 |
2. 处理异步加载
有些网页存在异步加载数据的情况,此时获取的内容并不是实际想要的。
例如:在QQ音乐上爬取五月天歌单信息
import requests |
上述代码未能获取到关于五月天的歌曲信息,而是qq音乐官网的通用信息。
查看页面内容的两个角度:(谷歌为例)
- 检查模式:此刻最新的网页正在呈现的内容所需网页标签
- 源代码:页面从服务器初次加载的内容
网页内容加载方式两种:
- 一次性加载,有什么就显示什么(豆瓣网)
- 异步加载:不断地跟服务器进行通信,根据当前页面地需要动态加载内容
异步加载页面获取数据地址的方法:XMLHttpRequest (xhr)
① 谷歌浏览器打开网址
② 开发者工具->network->xhr
③ 逐一检查返回内容(json格式)确定目标地址
此时返回的数据为json格式,需要将其转换为json类型,response对象有json()方法可以将字符串直接转json对象
import requests |
此时即可成功打印歌曲信息。
3. 设置参数实现分页访问
import requests |
4. 以Json格式写入文件
import json |
5. 借助selenium实现浏览器端数据爬取
出现背景:面对各种反爬措施(频繁的读取页面,触发反爬),会大大增加爬虫程序的编写难度和执行效率。
解决方法:借助selenium真的打开浏览器,通过控制浏览器来访问目标地址,爬取数据
特点:
- 真实浏览器访问网站
- 忽略网站数据的加载方式
N个例子:
# 获取元素及属性 |
# 获取元素及属性 |
# 处理窗口 |
# 异常处理 |
# 模拟搜索商品 |
# 拖拽元素及处理警告框 |
# 拉动滚动条及执行警告框 |
# 设置Cookies |
其他
1. 字符集
utf-8:容量65535,英文,中文,日语等
acssic:容量128,对应键盘数字+字符+控制符
gbk:中文简繁体+中英文
gb2312:中文简体+英文
big5:中文繁体+英文
2. CSS的三种选择器
3. Json
对python而言:用列表,字典搭建的数据结构就是json格式
对于网络而言:以json格式字符串的形式进行数据传输是默认约定
我们需要把返回的json格式的字符串转换为json对象,可以通过下标,key,遍历访问指定层次下的数据内容
Json最早来自于JavaScript数组语法
# json字符串与列表-字典互换 |
4. 网站爬取规范
Robots协议是互联网爬虫的一项公认的道德规范,全称是“网络爬虫排除规则”(Robots exclusion protocol),该协议针对爬虫的行为准则声明什么可以爬,什么不可以。例:https://www.douban.com/robots.txt