异常处理
报错结构
文件名.py, 行数,
出错行内容
出错类型
异常处理:处理异常(报错,Error)
# # # 1/0
# x = 10
# y = input('数字:') #输入字符串类型给y,y被计算机识别为字符串类型
# y += 10
# print(y + 10)
#异常处理
#语句格式 try: ... except Error: ...
# try:
# print(1/0) #判断try至except之间的语句是否出错,类似于 if ...: else: 双分支结构
# except ZeroDivisionError:
# pass
# #如try至except之间的语句没出错则正常执行,如果出错则判断except后面的错误类型,如果符合该错误,则执行except冒号后的语句,如果不符合则报错
# try:
# dic = {'a': 1}
# dic['b'] #判断try至except之间的语句是否出错,类似于 if ...: else: 双分支结构
# except ZeroDivisionError:
# pass
#如try至except之间的语句没出错则正常执行,如果出错则判断except后面的错误类型,如果符合该错误,则执行except冒号后的语句,如果不符合则报错
# try:
# 1/0
# dic = {'a': 1}
# dic['b'] #判断try至except之间的语句是否出错,类似于 if ...: else: 双分支结构
# except ZeroDivisionError:
# print('捕捉到了ZeroDivisionError这个错误')
# except KeyError:
# print('捕捉到了KeyError这个错误')
#如try至except之间的语句没出错则正常执行,如果出错则判断except后面的错误类型,如果符合该错误,则执行except冒号后的语句,如果不符合则报错
#输入函数input的用法
# key = input('输入一个key获取字典中的值')
# try:
# dic = {'a':1}
# dic[key]
# except KeyError:
# print('捕捉到了KeyError这个错误')
#对于可能多个错误的语法结构
# try:
# key = input('输入一个key获取字典中的值')
# dic = {'a': 1}
# dic[key]
# 1/0
# lt=[1, 2, 3]
# lt['a']
# except Exception as e: #把错误信息赋值给变量e,同时一般把该错误记录到日志中
# logging.info(e) #将e记录到日志中,给程序员看
# print(e)
# print('你输入有问题') #给用户看
#机制:预运行(把代码抽离到类似另外一个文件中运行,这样的运行对本文件不会造成任何影响),但是这个过程需要消耗时间,一般能不用则不用
用异常处理提升代码的rubst,撸棒性-->经验搭出来的
fi判断
if一般用于判断/选择的场景
单分支
score = 95
if score > 90:
print('优秀')
双分支
score = 95
if score > 90:
print('优秀')
else:
print('良好')
#三元表达式
print('优秀') if score > 90 else print('良好') #单分支没有,多分钟也没有,只有双分支有
#结果一 条件 结果二
多分支
if ...: elif ...: elif ...: else:
if ...: if ...: if ...: if
两者之间区别
s = 91
if s > 90:
print('优秀')
elif s > 60:
print('良好')
else:
print('不及格')
if s > 90:
print('优秀')
if s > 60 and s < 90:
print('良好')
if s < 60:
print('不及格')
if ...: elif ...: 结构对一个整体顺次判断,后面一步必须要等前面一步结束
if ...: if ...: 结构每次都对同一整体判断,每次判断互相独立
例如: s = 91 时if ...: elif ...: 走一次代码就终止; 而if ...: if ...: 需要走三次;此时if ...: if ...: 结构时间复杂度和空间复杂度都更大.
逻辑运算符
>=
not 非
for循环循环用来干什么:干重复的事
for循环
debug调试-->点出红点-->右键debug-->右键向下箭头调试每次循环运行的具体数据
爬取豆瓣信息
复习
爬虫原理
1.发送请求
2.获取数据
3.解析数据
4.保存数据
requests请求库
response = requests.get(url='目标网站地址')
response.content #二进制流
response.rext #文本
re正则模块
data_list = re.findall('正则匹配规则','解析的数据','匹配模式')
贪婪匹配:
.*? #过来任何内容
非贪婪匹配 :
(.*?) #提取内容
with open()
昨日
爬取图片
爬取视频
找到视频或图片链接
res = requests.get(链接地址)
爬取豆瓣电影信息
---url:
解析提取:
电影名称电影详情页电影评分评价人数
今日
爬虫三部曲
1.发送请求
2.解析数据
3.保存数据
爬虫精髓
1.分析网站的通信流程
2.分析查找数据从何而来
3.目标网站的反爬策略
4.根据目标网站的反爬策略编写攻击手段,获取数据.
爬取豆瓣电影top250信息
根据每页电影url地址规律使用for循环爬取全部top250信息
for i in range(10):
u = f'https://movie.douban.com/top250?start={num}&filter='
num += 25
后面代码整体缩进即可整体放入for循环中
for循环控制爬取豆瓣电影全部top205
复习
爬虫原理
1.发送请求
2.获取数据
3.解析数据
4.保存数据
requests请求库
response = requests.get(url='目标网站地址')
response.content #二进制流
response.rext #文本
re正则模块
data_list = re.findall('正则匹配规则','解析的数据','匹配模式')
贪婪匹配:
.*? #过来任何内容
非贪婪匹配 :
(.*?) #提取内容
with open()
昨日内容
爬取图片
爬取视频
找到视频或图片链接
res = requests.get(链接地址)
爬取豆瓣电影信息
---url:
解析提取:
电影名称电影详情页电影评分评价人数
今日内容
爬虫三部曲
1.发送请求
2.解析数据
3.保存数据
爬虫精髓
1.分析网站的通信流程
2.分析查找数据从何而来
3.目标网站的反爬策略
4.根据目标网站的反爬策略编写攻击手段,获取数据.
爬取豆瓣电影top250信息
爬取异步请求接口信息
同步异步
同步请求:发送方发送数据包后,等待接收方发回响应之后,才能发送下一个数据包的通信方式。通过单线程服务,该线程发送请求,在服务器运行时阻塞,并且等待响应。
异步请求:发送方发送数据包后,不用等待接收方发回响应,就可以发送下一个数据包的通信方式。通过两个线程来调用服务,一个线程发送请求,另一个单独的线程接收响应。
同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭
同步请求在等待响应时不能继续使用浏览器、而异步请求,不用等待响应,可继续使用浏览器。对客户没用影响。
分析目标网站的异步请求返回的数据(接口)
F12-->Network(网络监听工具)-->刷新页面(默认获取的是同步+异步数据)-->点XHR(只获取异步请求)
异步请求数据
一块块小数据(不包含前端代码),该数据为字典类型,想批量获取,分析规律
json
第三方数据格式
json.dumps() #把python数据格式转成json数据格式
json.loads() #把json数据格式换成python数据格式
爬取黄页88网手机号
反爬策略:通过User-agent判断是否是浏览器
user agent
用户代理凭证
以字典形式取出并赋值给request.get函数