requests模块使用
爬虫介绍
https://www.cnblogs.com/xiaoyuanqujing/p/11805679.html
#爬虫简单来说指,网络蜘蛛
#爬虫本质,;模拟浏览器发送请求(使用的模块requests,selenium)>>>下载网页>>>提取需要的数据(使用的模块bs4,xpath,re)>>>保存数据(文件,excel,mysql,redis,mongodb)
#发送请求,请求地址(使用浏览器,抓包工具),请求头,请求体,请求方法
#拿到响应,拿到响应体(格式:json,xml,html(bs4,xpath)),加密的未知格式(需要解密)
#保存数据,Mongodb(json格式数据)
#性能高一些(多线程、多进程、协程),只针对python语言的cpython解释器(GIL,同一时刻只能有一个线程在执行)
io 密集型:用线程
计算密集型:用进程
#scrapy框架处理了性能
requests模块使用
#安装 pip install requests
#图片防盗链 referer
#使用
import requests
#常用的请求方式,request.get()和request.post()
#基于GET请求
#1基本请求
res = requests.get('https://www.cnblogs.com/linqiaobao/')
# print(res.text)#打印出返回的文本内容
#2带参数的GET请求->params
#在?后自己拼接参数,请求头将自己伪装成浏览器,否则百度不会返回正常的页面内容
res = requests.get('https://www.baidu.com/s?ie=UTF-8&wd=python',
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'})
# print(res.text)
#如果查询关键字有中文或其他特殊符号,需要进行url编码
from urllib.parse import urlencode
wd='妹子图'
encode_res = urlencode({'k':wd},encoding='utf-8')
keyword = encode_res.split('=')[1]
# print(keyword)
#拼接url
url = f'https://www.baidu.com/s?wd={wd}&pn=1'
res = requests.get(url,
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'})
# print(res.text)
#3带参数的GET请求->headers
#通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常用的有用的的请求头有:
# HOST
# Referer #根据该参数判断请求来源
# User_Agent #客户端信息
# Cookie #包含了Cookie信息,但requests模块有单独的参数来处理它,headers={}内不要放它
#4带参数的GET请求->cookies
# 如登录gitee,登录后就可以从浏览器获取cookies,使用cookies就可以无需用户名和密码了
Cookies ={'gitee-session-n':'am1vZGMwQStYKzBSV2VqNkV3Y2ExYWlSbEp3aXd1YUFZWFYrcE5OY01jcEtaUEVQSjN1RnpwTkVYdU5DakNYSnVydWlpMHlyd0wxbVpBd3lueGZheG1mcW5CQ1VBTkJyZVVJZnlveFJEYmptZHhURVNUOWNFSzZHdVhyVjY0M3NxUm1LZG54U0ZlditjdkJKVi9mUGliYkErMzdlamd2dDR1SFNyYmN5NENKMTZZdzJvdXZmSGVSaXkrUGtCQVZ1eFhEUU9nMkVoZ0ZmbmpQNGwydHBYMFZjSzBmTkR1bjNDZkc4RHhCUGhtUGlwaVVZMVJmUW01NGt5dlRicnBLWFRIRW9HVUhMSmVZZnM5c0hkamo4VlM0dXB5bmdoZlFXeENFRnpUN2JGeVRjZjdRWEFQSkVwaUFVbE9vNkdwdndYMmFQaElseHZRZCs4clR3VVRTSnN4YXRsc2lEUTFGd0dKZitMbk5HNUQ0PS0teDlQYWs2WllXUHhpTVIzdVhwNjcxQT09--d441f4ee1d62ddd98f9db1ff1446b271ff036494 '}
res = requests.get('https://gitee.com/',cookies=Cookies)
# print('个人主页' in res.text)#主页
#基于POST请求
#发送post请求,携带数据(urlencoded和json)
res=requests.post('http://127.0.0.1:8000/index/',data={'name':'lqz'})
print(res.text)
res=requests.post('http://127.0.0.1:8000/index/',json={'age':1,},)
print(res.text)
# 5 自动携带cookie
session=requests.session()
res=session.post('http://127.0.0.1:8000/index/') # 假设这个请求登录了
res1=session.get('http://127.0.0.1:8000/order/') # 现在不需要手动带cookie,session会帮咱处理
# 6 response对象
respone=requests.post('http://127.0.0.1:8000/index/',data={'name':'lqz'})
# print(respone.text) # 响应的文本
# 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()) # key和value
print(respone.url) # 请求的url
print(respone.history) #[]放重定向之前的地址
print(respone.encoding) # 响应的编码方式
respone.iter_content() # 图片,视频,大文件,一点一点循环取出来
for line in respone.iter_content():
f.write(line)
# 7 编码问题
res=requests.get('http://www.autohome.com/news')
# 一旦打印出来出现乱码问题
# 方式一
res.encoding='gb2312'
# 方式二
res.encoding=res.apparent_encoding
print(res.text)
# 8 解析json
import json
respone=requests.post('http://127.0.0.1:8000/index/',data={'name':'lqz'})
print(type(respone.text)) # 响应的文本
print(json.loads(respone.text))
print(respone.json()) # 相当于上面那句话
print(type(respone.json())) # 相当于上面那句话
# 9 高级用法之ssl(了解)
import requests
respone=requests.get('https://www.12306.cn') #不验证证书,报警告,返回200
print(respone.status_code)
# 使用证书,需要手动携带
import requests
respone=requests.get('https://www.12306.cn',
cert=('/path/server.crt',
'/path/key'))
print(respone.status_code)
# 9 高级用法之ssl(了解)
import requests
respone=requests.get('https://www.12306.cn') #不验证证书,报警告,返回200
print(respone.status_code)
# 使用证书,需要手动携带
import requests
respone=requests.get('https://www.12306.cn',
cert=('/path/server.crt',
'/path/key'))
print(respone.status_code)
# 10 高级用法:使用代理
respone=requests.get('http://127.0.0.1:8000/index/',proxies={'http':'代理的地址和端口号',})
# 代理,免费代理,收费代理花钱买
# 代理池:列表放了一堆代理ip,每次随机取一个,再发请求就不会封ip了
# 高匿和透明代理?如果使用高匿代理,后端无论如何拿不到你的ip,使用透明,后端能够拿到你的ip
# 后端如何拿到透明代理的ip, 后端:X-Forwarded-For
respone=requests.get('https://www.baidu.com/',proxies={'http':'27.46.20.226:8888',})
print(respone.text)
# 11 超时设置
import requests
respone=requests.get('https://www.baidu.com',
timeout=0.0001)
# 12 认证设置(你见不到了)
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)
# 13 异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型
try:
r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
print('===:')
except Exception as e:
print(e)
# 14 上传文件
res=requests.post('http://127.0.0.1:8000/index/',files={'myfile':open('a.jpg','rb')})
print(res.text)
模拟登录网站
#网站地址http://www.aa7a.cn/
import requests
session=requests.session()
data = {
'username': '616564099@qq.com',
'password': 'lqz123',
'captcha': 'zdu4',#验证码
'remember': 1,
'ref': 'http://www.aa7a.cn/user.php?act=logout',
'act': 'act_login',
}
rest = session.post('http://www.aa7a.cn/user.php',data=data)
print(rest.text)
# 拿到cookie
cookie=rest.cookies
print(cookie)
# 携带着cookies,表示登录了,页面中会有我们的用户信息616564099@qq.com
rest1=session.get('http://www.aa7a.cn/index.php')
print('616564099@qq.com' in rest1.text)
爬取梨视频
#网站地址https://www.pearvideo.com/
import requests
import re
res=requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0')
# print(res.text)
re_video='<a href="(.*?)" class="vervideo-lilink actplay">'#正则匹配视频地址
video_urls=re.findall(re_video,res.text)#去res.text找视频地址
# https://www.pearvideo.com/
# print(video_urls)
for video in video_urls:
url='https://www.pearvideo.com/'+video
print(url)
# 向视频详情发送get请求
res_video=requests.get(url)
# print(res_video.text)
# break
re_video_mp4='hdUrl="",sdUrl="",ldUrl="",srcUrl="(.*?)",vdoUrl=srcUrl,skinRes'
video_url=re.findall(re_video_mp4,res_video.text)[0]
print(video_url)
video_name=video_url.rsplit('/',1)[-1]
print(video_name)
res_video_content=requests.get(video_url)
with open(video_name,'wb') as f:
for line in res_video_content.iter_content():
f.write(line)
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步