python day90
爬虫基本原理
爬虫流程
-(Request,selenium)使用请求库请求数据(http请求),网页,app--》很多反扒
-(bs4,lxml)html格式解析,json格式---》数据清洗 ----》有反扒
-入库(mysql,redis,mongodb,文件,excel)
爬虫协议:https://www.cnblogs.com/robots.txt
百度,谷歌,搜索引起都是爬虫
-百度一刻不停的取互联网上爬取页面----》存到自己库中
-使用百度搜索---》百度库中搜(全文检索es,分词,打分)---》返回
-百度快照(百度爬取那一刻的数据),点击标题---》去了原链接
requests模块介绍
1 模拟发送http请求的模块—》不仅仅用来做爬虫,服务之间的调用也使用它
2 http请求请求头,请求体,请求地址都可以使用这个模块
3 requests是基于python urllib2模块封装的,这个模块用起来比较繁琐
4 安装:pip3 install requests
requests模块发送get请求
import requests
1 发送get请求
# res是响应对象,http响应封装了,响应体
# res=requests.get('https://www.cnblogs.com/xiaoyuanqujing/p/11805679.html')
# # 把响应体的数据转成了字符串
# print(res.text)
2 向百度发送请求
# res=requests.get('https://www.baidu.com/')
# # print(res.text)
# with open('baidu.html','wb') as f:
# f.write(res.content) # 响应体二进制内容
3 请求地址中携带数据
# 拼在路径中
# 没有带请求头:客户端类型
# 如果你发送请求去一个地址,拿的数据不对的原因是什么?你模拟的不像浏览器,把请求头的数据该带的带上
# user-agent,referer
# header={
# 'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
# }
# # res=requests.get('https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3',headers=header)
# # 使用params来传递get请求参数
# res=requests.get('https://www.baidu.com/s',params={'wd':'帅哥'},headers=header)
# # print(res.text)
# with open('baidu.html','wb') as f:
# f.write(res.content) # 响应体二进制内容
4 请求头的使用
'''
user-agent,
referer
Cookie:未认证的cookie,认证过的cookie
'''
5 中文转码和编码
# from urllib.parse import urlencode,unquote
# 把中文转成%的形式
# params={'wd':'帅哥'}
# res=urlencode(params)
# print(res)
#
# # 把%形式转成中文
# res2=unquote(res)
# print(res2)
6 cookie的使用,正常是在请求头中
# cookie经常用,作者把cookies当作一个参数使用
# header={
# 'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
#
# }
# # Dict or CookieJar:是一个对象,登录成功以后拿cookie得到的就是一个cookieJar对象
# res=requests.get('https://www.baidu.com/s',params={'wd':'帅哥'},headers=header,cookies={''})
# # print(res.text)
# with open('baidu.html','wb') as f:
# f.write(res.content) # 响应体二进制内容
requests模块发送post请求
1 模拟登录某网站
# import requests
#
# data = {
# 'username': 'xxx@qq.com',
# 'password': '123',
# 'captcha': '9eee',
# 'ref': 'http://www.aa7a.cn/',
# 'act': 'act_login',
# }
# res = requests.post('http://www.aa7a.cn/user.php', data=data)
# print(res.text)
# # {"error":0,"ref":"http://www.aa7a.cn/"} 登录成功
# # 取到cookie--》登录成功的cookie
#
# # CookieJar 对象
# print(res.cookies.get_dict())
#
# res1 = requests.get('http://www.aa7a.cn/', cookies=res.cookies.get_dict())
#
# print('xxx@qq.com' in res1.text)
2 如何携带data数据,如何携带cookies:CookieJar或者字典
3 requests.session()
# import requests
# # 拿到一个session对象,发送请求时,跟使用reqesuts一样,只不过它自动处理了cookie
# session=requests.session()
# data = {
# 'username': '616564099@qq.com',
# 'password': 'lqz123',
# 'captcha': '9eee',
# 'ref': 'http://www.aa7a.cn/',
# 'act': 'act_login',
# }
# res = session.post('http://www.aa7a.cn/user.php', data=data)
# # print(res.text)
# # {"error":0,"ref":"http://www.aa7a.cn/"} 登录成功
# # 取到cookie--》登录成功的cookie
#
# # CookieJar 对象
# # print(res.cookies.get_dict())
#
# res1 = session.get('http://www.aa7a.cn/')
#
# print('616564099@qq.com' in res1.text)
## 携带json格式数据(自己回去尝试)
# import requests
# requests.post(url='',
# json={'':1,},
# ) #默认的请求头:application/json
requests模块响应对象
1 响应对象
import requests
respone=requests.get('http://www.jianshu.com')
# respone属性
print(respone.text) # 把body体中数据转成字符串格式
print(respone.content) # body体中的二进制格式
print(respone.status_code) # 响应状态码
print(respone.headers) # 响应头
print(respone.cookies) # 响应的cookie,如果登录了,这个cookie就是登录的cookie
print(respone.cookies.get_dict()) # cookiejar对象---》字典对象
print(respone.cookies.items()) # 跟字典一样
print(respone.url) # 请求的地址
print(respone.history) # 列表,访问一个网址,重定向了,列表中放这两个地址
print(respone.encoding) # 响应的编码格式(一般都是utf-8)
# 如果是图片,视频,保存到本地
# response.iter_content(): 可以循环它,而不是循环response.content,循环它一点点存
# res=requests.get('xxx')
# for line in res.iter_content():
# f.write(line)
2 编码问题(一般不存在,如果存在)
# response.encoding='gb2312' # 改成网站编码方式即可
# import requests
# response=requests.get('http://www.autohome.com/news')
# response.encoding='gbk' #汽车之家网站返回的页面内容为gb2312编码的,而requests的默认编码为ISO-8859-1,如果不设置成gbk则中文乱码
# print(response.text)
3 获取二进制内容
# import requests
#
# response=requests.get('https://wx4.sinaimg.cn/mw690/005Po8PKgy1gqmatpdmhij309j070dgj.jpg')
#
# with open('a.jpg','wb') as f:
# # f.write(response.content)
# # 推荐用这个
# for line in response.iter_content():
# f.write(line)
4 json格式解码
# import requests
# # import json
# res=requests.get('https://api.luffycity.com/api/v1/course/actual/?category_id=1')
# # print(json.loads(res.text))
# print(res.json()['code'])
爬取视频
# 分析出爬取的地址是
https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0
import requests
import re
res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0')
# print(res.text)
video_ids = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
# print(video_ids)
for video_id in video_ids:
video_url = 'https://www.pearvideo.com/' + video_id
# print(video_url)
real_video_id = video_id.split('_')[-1]
# print(real_video_id)
# print(video_url)
# res_detail=video_detail=requests.get(video_url)
# print(res_detail.text)
# break
# 直接发送ajax请求,拿到json格式数据--》json格式数据中就有mp4
header = {
'Referer': video_url
}
res_json = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s' % real_video_id, headers=header)
# print(res_json.json())
mp4_url = res_json.json()['videoInfo']['videos']['srcUrl']
mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % real_video_id)
print(mp4_url)
video_res = requests.get(mp4_url)
name=mp4_url.split('/')[-1]
with open('video/%s'%name, 'wb') as f:
for line in video_res.iter_content():
f.write(line)
# https://video.pearvideo.com/mp4/third/20210509/ cont-1728918 -15454898-094108-hd.mp4 能播放
# https://video.pearvideo.com/mp4/third/20210509/ 1621312234758 -15454898-094108-hd.mp4