数据分析、数据挖掘的前提是有数据。数据地三大来源:数据库、爬虫、其他平台(API)
Spider:蜘蛛 -> 爬虫:可以在互联网的任意位置获取数据
爬虫,别名(网页蜘蛛、蠕虫),学名:网络数据采集
根据程序员的自定义规则(想法)在互联网中自动地爬取数据(图片、音频、视频、文字等都叫做数据)
a. 表面:爬虫对网页做操作
b. 深层次:爬虫对服务器做操作
a. 需要有HTML、CSS、JavaScript的知识,需要理解某个页面的结构
b. 浏览器页面F12或者FN+F12或者右键检查或者浏览器设置(Ctrl+Shift+I)都可以打开开发人员工具
c. 网页还分为静态页面和动态页面
a. requests向目标网站的服务器发起请求,服务器根据请求返回响应结果response(对象)
b. 对response响应结果处理完得到的是字符串(HTML页面源代码)
a. 方法一:正则表达式匹配
b. 方法二:使用三方模块Beautifulsoup4对页面源码进行解析,解析完使用CSS选择器拿到所需内容
c. 方法三:使用三方模块lxml对页面源码解析,使用XPath语法拿到所需内容
将RAM中的结果存储到磁盘或者数据库中
(写爬虫会遇到各种反爬机制,使用指定的反反爬措施破解)
a. 将爬虫伪装成浏览器
b. 封禁IP地址的网站一般使用代理IP:站大爷、芝麻代理、极光代理等
c. 文字反扒
d. AJAX异步加载
etc
使用拖拉拽(实现了某些功能的模块)的形式实现流程自动化(爬虫等)
如:八爪鱼、影刀等
(1)静态页面:网页一旦生成,里面的内容不会自动地发生变化。页面中包含:html(展示页面内容)、CSS样式(渲染html)、JavaScript(渲染html)
(2)动态页面:网页生成后,页面内容还会自动发生变化。页面内容和数据库进行联通,数据库中变,页面就变。一般动态页面都会应用AJAX异步加载
HTTP协议(超文本传输协议),Web服务器和客户端之间进行数据传输都是明文形式
发展历史:网景公司->谋智->火狐浏览器。网景公司根据HTTP协议做了改进->HTTPS
https = http + ssl
SSL加密协议->将Web服务器和客户端的数据进行加密
(1)作用:将用户的账号密码以某些形式保存在本地
(2)性质:时效性
(3)在爬虫中cookie的作用:将本地的请求和远程服务器中保存的账号密码做对比
两种和服务器对话的方式
(1)GET:requests利用GET请求方式向服务器发送需求(加密机制很简单甚至不加密)
(2)POST:向服务器发送内容,例如账号密码(某个网站注册登录账号密码)
requests是Python实现的简单易用的能够请求网页的三方模块
(1)如果Terminal中显示的ps,安装三方模块会直接安装到本机主环境。使用venv\Scripts\activate激活虚拟环境
(2)修改微软的powershell策略组:Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
镜像源:存储python三方模块的仓库,python的三方模块所有人都可以制作发布
输入代码:pip config set global.index-url https://pypi.douban.com/simple
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
RIGHT Example:
URL = 'http://www.baidu.com/'
# 请求百度服务器+获取百度服务器响应结果
resp = requests.get(url=URL) # 最好使用关键字参数传参,以免有的网址过长看起来不方便
print(resp)
告诉我们现在服务器的状态:status_code
RIGHT Example:
print(resp.status_code) # 200
常见状态码:
200:爬虫可用
403:爬虫被服务器拒绝了
404:资源丢失
500:服务器崩溃
完整状态码列表见附录
RIGHT Example:
print(resp.cookies) # ]>
响应结果使用的编码方式默认是ASCII(ISO-8859-1),它不支持中文
具体是哪个编码方式由网页源码决定(腾讯系网站喜欢用gbk)
RIGHT Example:
resp.encoding = 'utf-8'
RIGHT Example:
print(resp.text)
注意:如果页面是动态页面,开发人员工具显示的代码一定是异步加载完之后的代码
用于图片、音频、视频等
二进制形式:b’xxxxx’
RIGHT Example:
print(resp.content)
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)
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')
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)