requests简介
requests是python中原生的一款基于网络请求的模块
作用:模拟浏览器发送请求
浏览器发请求步骤:
1 指定网址url
2 发送请求
3 获取响应数据
4对数据的持久化操作
requests模块基础
导入requests模块
import requests
指定url(网址)
url='https://www.sogou.com/'
get 发送请求
a=requests.get(url)
text获取响应数据
page_text=a.text
字符串形式的响应数据
响应数据的持久化储存
with open(r'C:\Users\33494\Desktop\ghgh.html','w',encoding='utf-8') as af:
af.write(page_text)
过程
json是字典一行 从Response判断
response:响应数据
案列一:简易网页采集器(可搜关键字)
requests的get方法的三个参数
a=requests.get(url,params,headers)
url:网址
params:参数,可拼接到url上
header:头信息,可以用来伪装载体(伪装为浏览器)
UA反爬机制及伪装
ua:指的是use-Agent请求载体的身份标识
门户网站的浏览器会检测对应请求载体的身份标识 如果为某一正常浏览器 则正常响应
反之 可能拒绝请求
如何抓包网页获取UA
1打开搜索页面输入内容搜索
2鼠标右击点击 检查 并刷新
3.点击network后 下面随便点一个 点击header
4向下翻找到
UA伪装
1定义一个字典 键 user...... 值用你上面获取到的后半部分
hears={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/103'}
2在进行爬虫发送请求get操作时
把第三个参数定义为这个字典即可
requests.get(url,params,headers=hears)
简单可搜索网页采集器制作(第二个参数)
打开一个搜索网页随便搜 我们发现网页的网址很长
缩短网页 删到如图 我们发现此网址与长网址效果一样 已经成功把网址缩短
而=号的后面(55)显示的正好是我们搜索的内容
复制前半段
url='https://www.sogou.com/web?'
将后半段创建一个字典
shu=input('输入你要查找的内容')
param={'query':shu}
head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/103'}
page=requests.get(url,param,headers=head)
字典相当于 (query=shu)
通过get的第二个参数实现拼接
page=requests.get(url,param,headers=head)
剩下的按原操作
import requests
url='https://www.sogou.com/web?'
shu=input('输入你要查找的内容')
param={'query':shu}
head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/103'}
page=requests.get(url,param,headers=head)
page_text=page.text#text不加括号
with open(r'C:\Users\33494\Desktop\kk.html','w',encoding='utf-8') as fp:
fp.write(page_text)
实战案例 破解某度翻译
分析过程
打开翻译 发现是部分页面进行刷新(ajkr请求)
搜索dog
检查抓包 Network
输入单词发现抓包
因为是ajks 点击XHR
抓到几个包 一个个点击看 找到最后一个是dog的 (你搜索的单词)
(右下角 :dog)
观察
发现这是一个post请求(响应数据应该是json数据)
post
post请求 :提交数据(向服务器)
get请求:获取数据
实战
获取url
post请求用post不用get
发请求
fan=input('输入你要翻译的内容')
data={'kw':fan}
url_post=requests.post('https://fanyi.baidu.com/sug',data=data)
第二个参数data表示要传入服务器的内容
UA伪装
获取响应数据
可以用text 也可以用json(必须返回的是json对象)
shu=url_post.json()
返回一个字典对象
储存
用json特有的方法jdump
json. dump(shu,fp,ensure_ascii=False)
将shu写入fp文件
先import json
全部
import requests
import json
fan=input('输入你要翻译的内容')
data={'kw':fan}
head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/103'}
url_post=requests.post('https://fanyi.baidu.com/sug',data=data,headers=head)
shu=url_post.json()
fp=open(r'C:\Users\33494\Desktop\kk','w',encoding='utf-8')
json.dump(shu,fp,ensure_ascii=False)
实例:某豆电影
分析
获取数据 发送请求 url不变:ajkx
抓包 net。。。。 刷新 打开 XHR
get
json
获取url
参数的理解
start:从第几个开始
limit:获取几个
实战代码
import requests
import json
url='https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action='
head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/103'}
data={'type': '5',
'interval_id':'100:90',
'action':'',
'start': '0',
'limit': '20'}
xin=requests.post(url,data=data,headers=head)
shu=xin.json()
fp=open(r'C:\Users\33494\Desktop\kk','w',encoding='utf-8')
json.dump(shu,fp,ensure_ascii=False)
肯某
import requests
import json
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/103'}
data={'cname':'',
'pid':'',
'keyword': '北京',
'pageIndex': '1',
'pageSize': '10'}
xin=requests.post(url,data=data,headers=head)
shu=xin.json()
fp=open(r'C:\Users\33494\Desktop\kk','w',encoding='utf-8')
json.dump(shu,fp,ensure_ascii=False)
药监
1从json中获取数据(json是一个字典)
定义一个列表用于存储,根据字典的键获取并存储
2多个json的存储
for 循环 覆盖前面的 包含 用一个列表存储所有字典
再把此字典存储
3多个页面 有个参数 page 定为动态 ’page‘:a
for循环覆盖 获取的获取几页的所有id page要转化为字符串
进阶
cookie登陆
有一些网站内容是登陆后才能看的
简介
用户登陆 网站返回cookie 下次登陆带着cookie 返回网页内容
session请求 会话 一连串请求
import requests
session=requests.session()#会话
a->b b->a a->b session会记录会话内容
操作
在登陆页
检查 network
选上
登陆 点击这个
登录页面url 同时发现是post请求
url='https://passport.17k.com/ck/user/login'#这是抓包里 login里的
date={'loginName':'15093795129',
'password':'www12131415'}
resp=session.post(url,data=date)#登陆
post 第二个参数是账号 密码
login里面
拿书架上书
书架 检查 network 刷新页面 抓包
一个个找包 看
看有无
书架上书的信息
找到有的 获取url 用session(他知道cookie)获取get
(拿不用text用json)
也可直接(另一种方法)
cookie是login,等包中的 (实际操作麻烦)
import requests
session=requests.session()#会话
resp=session.post('https://passport.17k.com/ck/user/login',data={'loginName':'15093795129'
,'password':'www12131415'})
print(resp.text)
resp2=session.get('https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919')
print(resp2.text)
防盗链
图片<img> 视频<video>
视频真地址
爬取视频 发现源代码里没有 检查有
(后期通过js 页面脚本生成的)
不在源代码里
页面源代码运行完 是视频里一样的
不在页面源代码里 一定是二次请求到的
检查 是实时的
检查出的scrurl(无效地址)
子视频界面上 检查选出 视频地址
刷新抓包选XHR
点出来的一个
预览
这个地址(预览里的srcurl)与视频地址有很大关系(但输入链接找不到网页)
对比两个链接地址
scrurl
只有中间不同
有地址的
网页防盗把下面的替换为上面的
替换
16613......替换为 cont-1741837
原页面url里 刚好有 这一串数字
所以 原视频 取数字 替换 srcurl
步骤:
scrurl二次可以请求到 检查得到的网址源代码里无
原网页 拿到 cont_id
用原网页抓包来的网址(二次请求)拿到scrurl
替换scrurl
referer防盗链
request完发现 拿不到
发现 里面有
解决方法
headers 请求头里加上 Referer这个字典
防盗链原理
抓包得到的url 上一级网址是原网址
网站会检查 上一级网址是啥 如果凭空出现 二级网址 就会返回错误信息
操作:
json 多重字典 拿srcurl
下载视频用content
代码
import requests
url='https://www.pearvideo.com/video_1094945'#原网址
cont_id=url.split('_')[1]#拿到cont_id
#抓包网址 用来拿 srcurl
url_two='https://www.pearvideo.com/videoStatus.jsp?contId=1094945&mrd=0.36961951608801336'
hears={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Fire'
'fox/103.0','Referer':url}#加上源地址 处理防盗链
#返回的json字典 拿数据
resp=requests.get(url_two,headers=hears).json()
scrurl=resp["videoInfo"]["videos"]["srcUrl"]
systemTime=resp['systemTime']#scrurl中要被替换的数据
#替换 拿到真网址
vid_url=scrurl.replace(systemTime,'cont-'+cont_id)
#下载视频
with open('a.mp4','wb') as fp:
fp.write(requests.get(vid_url).content)
代理
原理
通过第三方机器发送请求
一个机器 多次 访问一个网址 会被封ip
一个机器 运用多个代理去访问 请求网址 则不会
借用他人ip
使用
网站上找一个ip
例子:218.60.8.83:3129
request get的 proxies参数使用代理
proxies={'http':'http://218.60.8.83:3129'}
import requests
url='http://www.baidu.com'
proxies={'http':'http://218.60.8.83:3129'}
reps=requests.get(url,proxies=proxies)
print(reps.text)