文章目录
0. 数据来源
数据分析、数据挖掘的前提是有数据。数据地三大来源:数据库、爬虫、其他平台(API)
Spider:蜘蛛 -> 爬虫:可以在互联网的任意位置获取数据
1. 爬虫概念
爬虫,别名(网页蜘蛛、蠕虫),学名:网络数据采集
根据程序员的自定义规则(想法)在互联网中自动地爬取数据(图片、音频、视频、文字等都叫做数据)
2. 爬虫步骤概述
2.1 爬虫对谁做操作
a. 表面:爬虫对网页做操作
b. 深层次:爬虫对服务器做操作
2.2 对网页操作
a. 需要有HTML、CSS、JavaScript的知识,需要理解某个页面的结构
b. 浏览器页面F12或者FN+F12或者右键检查或者浏览器设置(Ctrl+Shift+I)都可以打开开发人员工具
c. 网页还分为静态页面和动态页面
2.3 使用三方模块requests
a. requests向目标网站的服务器发起请求,服务器根据请求返回响应结果response(对象)
b. 对response响应结果处理完得到的是字符串(HTML页面源代码)
2.4 从页面源代码中得到所需内容
a. 方法一:正则表达式匹配
b. 方法二:使用三方模块Beautifulsoup4对页面源码进行解析,解析完使用CSS选择器拿到所需内容
c. 方法三:使用三方模块lxml对页面源码解析,使用XPath语法拿到所需内容
2.5 数据持久化
将RAM中的结果存储到磁盘或者数据库中
2.6 反爬机制
(写爬虫会遇到各种反爬机制,使用指定的反反爬措施破解)
a. 将爬虫伪装成浏览器
b. 封禁IP地址的网站一般使用代理IP:站大爷、芝麻代理、极光代理等
c. 文字反扒
d. AJAX异步加载
etc
2.7 rpa(机器人流程自动化)
使用拖拉拽(实现了某些功能的模块)的形式实现流程自动化(爬虫等)
如:八爪鱼、影刀等
3. 爬虫知识点预备
3.1 静态页面和动态页面
(1)静态页面:网页一旦生成,里面的内容不会自动地发生变化。页面中包含:html(展示页面内容)、CSS样式(渲染html)、JavaScript(渲染html)
(2)动态页面:网页生成后,页面内容还会自动发生变化。页面内容和数据库进行联通,数据库中变,页面就变。一般动态页面都会应用AJAX异步加载
3.2 HTTP和HTTPS
HTTP协议(超文本传输协议),Web服务器和客户端之间进行数据传输都是明文形式
发展历史:网景公司->谋智->火狐浏览器。网景公司根据HTTP协议做了改进->HTTPS
https = http + ssl
SSL加密协议->将Web服务器和客户端的数据进行加密
3.3 cookie
(1)作用:将用户的账号密码以某些形式保存在本地
(2)性质:时效性
(3)在爬虫中cookie的作用:将本地的请求和远程服务器中保存的账号密码做对比
3.4 GET和POST
两种和服务器对话的方式
(1)GET:requests利用GET请求方式向服务器发送需求(加密机制很简单甚至不加密)
(2)POST:向服务器发送内容,例如账号密码(某个网站注册登录账号密码)
4. requests的基础用法
requests是Python实现的简单易用的能够请求网页的三方模块
4.1 模块安装
4.1.1 安装三方模块准备
(1)如果Terminal中显示的ps,安装三方模块会直接安装到本机主环境。使用venv\Scripts\activate激活虚拟环境
(2)修改微软的powershell策略组:Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
4.1.2 修改镜像源
镜像源:存储python三方模块的仓库,python的三方模块所有人都可以制作发布
输入代码:pip config set global.index-url https://pypi.douban.com/simple
4.1.3 requests模块安装
Windows:pip install requests
Mac、linux:pip3 install requests
RIGHT Result:
Successfully installed certifi-2021.10.8 charset-normalizer-2.0.12 idna-3.3 requests-2.27.1 urllib3-1.26.9
4.2 模块使用
4.2.1 请求网址
RIGHT Example:
URL = 'http://www.baidu.com/'
# 请求百度服务器+获取百度服务器响应结果
resp = requests.get(url=URL) # 最好使用关键字参数传参,以免有的网址过长看起来不方便
print(resp)
4.2.2 查看状态码
告诉我们现在服务器的状态:status_code
RIGHT Example:
print(resp.status_code) # 200
常见状态码:
200:爬虫可用
403:爬虫被服务器拒绝了
404:资源丢失
500:服务器崩溃
完整状态码列表见附录
4.2.3 查看cookie
RIGHT Example:
print(resp.cookies) # <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
4.2.4 页面源码中的乱码
响应结果使用的编码方式默认是ASCII(ISO-8859-1),它不支持中文
具体是哪个编码方式由网页源码决定(腾讯系网站喜欢用gbk)
RIGHT Example:
resp.encoding = 'utf-8'
4.2.5 查看页面源代码(字符串形式)
RIGHT Example:
print(resp.text)
注意:如果页面是动态页面,开发人员工具显示的代码一定是异步加载完之后的代码
4.2.6 查看页面源代码(二进制形式)
用于图片、音频、视频等
二进制形式:b’xxxxx’
RIGHT Example:
print(resp.content)
5. 爬虫伪装
User-Agent作用:将爬虫伪装成浏览器
RIGHT Example:
Headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
}
URL = 'https://www.baidu.com/'
resp = requests.get(url=URL, headers=Headers)
if resp.status_code == 200:
resp.encoding = 'utf-8'
print(resp.text)
else:
print(resp.status_code)
6. 使用API
RIGHT Example:
import requests
import json
# api接口中的数据是使用json进行传输的
content = input('请输入一个垃圾:')
# api接口请求地址和参数之间使用?连接,参数以key=value的形式传入,参数和参数之间使用&连接
URL = f'http://api.tianapi.com/lajifenlei/index?key=76677c3f312f8aa299d587fd52deaf84&word={content}'
# 大部分API接口没有反爬机制
resp = requests.get(url=URL)
print(resp.text, type(resp.text))
# 序列化:loads()
data = json.loads(resp.text)
print(data, type(data))
# 获取json数据中有用信息
for i in data['newslist']:
print(i['explain'])
APPLICATION 获取周公解梦的数据:
num = 10
word = '操场'
URL = f'http://api.tianapi.com/dream/index?key=76677c3f312f8aa299d587fd52deaf84&num={num}&word={word}'
resp = requests.get(url=URL)
data = json.loads(resp.text)
for i in data['newslist']:
print(i['result'], end='\n')
7. 图片、视频、音频的数据持久化
RIGHT Example:
URL = 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'
resp = requests.get(url=URL)
print(resp.content)
with open('baidu.png', 'wb') as f3:
f3.write(resp.content)