requests模块介绍
requests模块发送get请求
# 所有语言都可以做爬虫---》python简单一些---》库多 # 模拟发送http请求的库,requests库----》大佬基于python内置库 urllib(麻烦) 封装--》requests # 安装 pip3 install requests # 模拟发送get请求 import requests res=requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html') print(res.text) # 响应体的内容打印出来了
get请求中携带参数
## 2 get 请求中携带参数 # res=requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html', # params={'name':'lqz','age':18} # ) # # ?name=lqz&age=18拼到路径后面 # print(res.text) # 响应体的内容打印出来了 # url编码和解码 # https://www.baidu.com/baidu?wd=python%20url%E7%BC%96%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81 # 把字段中文编码后转成 name=%E5%88%98%E6%B8%85%E6%94%BF&age=18 # from urllib.parse import urlencode # d={'name':'刘清政','age':18} # res=urlencode(d) # print(res) # 只想单独对中文编码和解码 from urllib.parse import quote, unquote # 编码 # name='刘清政' # res=quote(name) # print(res) # 解码 # s='python%20url%E7%BC%96%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81' # print(unquote(s))
携带请求头
# 3 携带请求头 # 携带请求头-->重要的key: # User-Agent:客户端浏览器的类型版本信息,操作系统版本---》django中如何取出请求头--》META---》中间件--》存到数据库--》饼形图--》统计你们网站近一个月客户端类型 # referer:图片防盗链 Referer: https://www.lagou.com/wn/zhaopin # 记录的是上一个访问的地址---》反扒:如果上一个访问的地址不是自己的地址,认为不是正常请求就禁止 # header = { # 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36', # # 'Accept-Encoding': 'gzip, deflate, br', # } # res = requests.get('https://dig.chouti.com/',headers=header) # with open('chouti.html','wb') as f: # f.write(res.content) # print(res.text)
携带cookie
## 本身cookie是请求头中的值,那么就可以执行放在请求头中,但是cookie经常用,也可以单独是一个参数 # 模拟点赞 header = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36', # 'Cookie': "" } data={ 'linkId': '34934736' } # res = requests.post('https://dig.chouti.com/link/vote',data=data,headers=header) res = requests.post('https://dig.chouti.com/link/vote',data=data,headers=header,cookies={'key':'value'}) print(res.text)
发送post请求模拟登录
#5 模拟登陆某网站 # data = { # 'username': '616564099@qq.com', # 'password': 'lqz123', # 'captcha': 'kyca', # 'remember': 1, # 'ref': 'http://www.aa7a.cn/', # 'act': 'act_login', # } # res = requests.post('http://www.aa7a.cn/user.php',data=data) # print(res.text) # print(res.cookies) # 登陆成功返回的cookie,这个cookie是登陆过后的,以后拿着这个cookie就可以模拟登陆后操作 # # res2=requests.get('http://www.aa7a.cn/',cookies=res.cookies) # print('616564099@qq.com' in res2.text) # 每次都要手动携带cookie,麻烦,使用requests提供的session 方法 # session=requests.session() # # 以后需所有请求都用session对象发送,不需要手动处理cookie # data = { # 'username': 'ee@qq.com', # 'password': 'lqz123', # 'captcha': 'kyca', # 'remember': 1, # 'ref': 'http://www.aa7a.cn/', # 'act': 'act_login', # } # res = session.post('http://www.aa7a.cn/user.php',data=data) # print(res.text) # print(res.cookies) # 登陆成功返回的cookie,这个cookie是登陆过后的,以后拿着这个cookie就可以模拟登陆后操作 # # res2=session.get('http://www.aa7a.cn/') # print('616564099@qq.com' in res2.text)
响应对象
## 6 响应对象 import requests respone=requests.get('http://www.jianshu.com') # respone属性 print(respone.text) # 返回响应体的文本内容 print(respone.content)# 返回响应体的二进制内容 print(respone.status_code)# 响应状态码 print(respone.headers)# 响应头 print(respone.cookies)# 响应的cookie print(respone.cookies.get_dict())# 响应的cookie转成字典 print(respone.cookies.items()) print(respone.url) # 请求地址 print(respone.history) # 了解---》如果有重定向,列表,放着重定向之前的地址 print(respone.encoding) # 页面的编码方式:utf-8 gbk # response.iter_content() # content迭代取出content二进制内容,一般用它存文件
编码问题
# 请求回来的数据,res.text 打印的时候乱码 ,因为没有指定编码,默认已utf-8编码 # 解决 response.encoding='gbk'
获取二进制数据
# 下载图片,视频 # 下载图片 header={ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36' } res=requests.get('https://tva1.sinaimg.cn/mw2000/9d52c073gy1h1v6lmny8nj20j60pjtdh.jpg',headers=header) with open('mv.jpg','wb') as f: # f.write(res.content) for line in res.iter_content(100): f.write(line)
解析json
## 8 json格式解析 import json data = { 'cname': '', 'pid': '', 'keyword': '上海', 'pageIndex': 1, 'pageSize': 10, } # res = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword',data=data) # j = json.loads(res.text) # print(j['Table'][0]['rowcount']) res= requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword',data=data).json() print(res['Table'][0]['rowcount'])
ssl认证
# 之前网站,有些没有认证过的ssl证书,我们访问需要手动携带证书 # 跳过证书直接访问 import requests respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200 print(respone.status_code) # 手动携带 import requests respone=requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key')) print(respone.status_code)
搭建代理池
# https://github.com/jhao104/proxy_pool -python的爬虫+flask写的 -本质使用爬虫技术爬取免费的代理,验证--》requests模块验证---》存到redis中 -起一个web服务器,只要访问一个地址,他就随机给你一个ip地址 # 步骤: 第一步:git clone git@github.com:jhao104/proxy_pool.git 第二步:安装依赖:pip install -r requirements.txt 第三步: 修改代码,修改配置 # setting.py 为项目配置文件 # 配置API服务 HOST = "0.0.0.0" # IP PORT = 5000 # 监听端口 # 配置数据库 DB_CONN = 'redis://:pwd@127.0.0.1:8888/0' # 配置 ProxyFetcher PROXY_FETCHER = [ "freeProxy01", # 这里是启用的代理抓取方法名,所有fetch方法位于fetcher/proxyFetcher.py "freeProxy02", # .... ] 第四步:启动爬虫 python3 proxyPool.py schedule 第五步:启动服务 # 启动webApi服务 python proxyPool.py server
使用代理
proxies = { 'http': '39.103.217.44:59886', # http或https代理 } respone=requests.get('https://www.baidu.com',proxies=proxies) print(respone.status_code)
# # 代理测试 import requests # http://127.0.0.1:5010/get/ ip="http://"+requests.get('http://139.155.237.73:5010/get/').json()['proxy'] print(ip) proxies = { 'http': ip, } res=requests.get('http://47.104.165.24:8001/check/',proxies=proxies) print(res.text)
超时设置
import requests # http://127.0.0.1:5010/get/ ip="http://"+requests.get('http://139.155.237.73:5010/get/').json()['proxy'] print(ip) proxies = { 'http': ip, } res=requests.get('http://47.104.165.24:8001/check/',proxies=proxies,timeout=1) print(res.text)
认证设置
# 这种很少见,极个别公司内部可能还用这种 import requests from requests.auth import HTTPBasicAuth r=requests.get('xxx',auth=HTTPBasicAuth('user','password')) print(r.status_code) #HTTPBasicAuth可以简写为如下格式 import requests r=requests.get('xxx',auth=('user','password')) print(r.status_code)
异常处理
from requests.exceptions import * #可以查看requests.exceptions获取异常类型 try: r=requests.get('http://www.baidu.com',timeout=0.00001) except ReadTimeout: print('===:') # except ConnectionError: #网络不通 # print('-----') # except Timeout: # print('aaaaa') except Exception: print('Error')
上传文件
# 上传文件--》爬虫一般不会用,但是咱们服务会用 import requests files={'file':open('a.jpg','rb')} respone=requests.post('http://httpbin.org/post',files=files) print(respone.status_code) # 咱们django项目 -你们公司项目,使用了第三方服务,第三放服务提供了api接口,没提供sdk -就要使用request发送请求,获取数据 # 前端提交一个长链地址 www.cnblogs.com/liuqingzheng/p/233.html--->转成短链--》x.com/asdf--->存到自己数据库中 # 专门服务,处理长连转短链(go,java)---》接口--》post,带着地址---》返回json,短链地址
使用request爬取梨视频
# re 解析想要的数据 # import requests # res=requests.get("https://www.pearvideo.com/") # print(res.text) https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=130&start=72&mrd=0.04420865436910293&filterIds=1761413,1761302,1761419,1756340,1756343,1756342,1756344,1756346,1756345,1756349,1756348,1756350,1756352,1756351,1756354 # https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=24 import requests import re res=requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=24') # print(res.text) # 解析出页面中所有的视频地址 /html/body/div[2]/div[1]/div[1]/div[1]/div[1] video_list=re.findall('<a href="(.*?)" class="vervideo-lilink actplay">',res.text) # print(video_list) for video in video_list: video_url='https://www.pearvideo.com/'+video video_id=video_url.split('_')[-1] header={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36', 'Referer': video_url } # 第一层反扒是加refer res_video=requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.7113776105084832'%video_id,headers=header) mp4_url=res_video.json()['videoInfo']['videos']['srcUrl'] # 第二层反扒是把不能播放地址变成能播放地址 mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % video_id) print(mp4_url) # 下载到本地 res_video_detail=requests.get(mp4_url) with open('./video/%s.mp4'%video_id,'wb') as f: for line in res_video_detail.iter_content(1024): f.write(line) # 单线程下载,速度不快,全是io操作,开启多线程能够显著提高速度---》使用多线程全站下载视频 # 线程池整站爬取 # 不能播放的地址 # https://video.pearvideo.com/mp4/third/20220314/1652060493892-10097838-231626-hd.mp4 # https://video.pearvideo.com/mp4/third/20220314/ cont-1754713 -10097838-231626-hd.mp4 # mp4_url='https://video.pearvideo.com/mp4/third/20220314/ 1652060493892 -10097838-231626-hd.mp4' # mp4_url=mp4_url.replace(mp4_url.split('/')[-1].split('-')[0],'cont-%s'%video_id)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)