python day90

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值