requests:代理池,上传文件
长链接转短连接,本质重定向,前提有一个短域名。
前端用户发送请求生成短连接,服务端收到post请求,将长链接存入数据库,返回一个随机字符串拼接在短域名后面给用户,用户下次那个短连接来登录,发送get请求,服务端收到用户输入地址,拿着长链接到后端比较取到长链接地址并重定向。
requests高级用法:
1、SSL Cert Verification-->证书验证
#证书验证(大部分网站都是https)
import requests
respone=requests.get('https://www.12306.cn') #如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端
#改进1:去掉报错,但是会报警告
import requests
respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200
print(respone.status_code)
#改进2:去掉报错,并且去掉警报信息
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get('https://www.12306.cn',verify=False)
print(respone.status_code)
#改进3:加上证书
#很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
#知乎\百度等都是可带可不带
#有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
import requests
respone=requests.get('https://www.12306.cn',
# 指定证书路径,加上证书的key
cert=('/path/server.crt',
'/path/key'))
print(respone.status_code)
2、使用代理
官网链接: http://docs.python-requests.org/en/master/user/advanced/#proxies
代理设置:先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)
import requests
proxies={
'http':'http://egon:123@localhost:9743',#带用户名密码的代理,@符号前是用户名与密码
'http':'http://localhost:9743',
'https':'https://localhost:9743',
}
respone=requests.get('https://www.12306.cn',
proxies=proxies)
print(respone.status_code)
举例:
import requests
# 往上找到免费代理,
proxies = {
"HTTP":'http://80.93.213.214:3137'
}
res = requests.get("https://www.baidu.com",
proxies=proxies)
# 200
print(res.status_code)
现在我们来写一个Django,客户端访问,取出客户端的IP地址,并打印。
app01/views.py
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
# META中可以拿到请求的所有参数
ip = request.META.get('REMOTE_ADDR')
return HttpResponse(ip)
此时我们不使用代理访问。
# 不使用代理访问
res = requests.get("http://127.0.0.1:8000/",)
res2 = {"code":res.status_code,"text":res.text}
# 200
print(res2)
如果使用代理访问则报错访问不到,原因就是项目在本地,换个ip访问等同于让你朋友在它电脑上访问你本地的项目,无法访问成功。
现在我们借助于第三方自己搭建代理池。
github地址:https://github.com/jhao104/proxy_pool
下载项目之后的第一步安装依赖。
按照官网方法走即可。
发送get请求,到Redis中随机去一个IP返回
超时设置
#超时设置
#两种超时:float or tuple
#timeout=0.1 #代表接收数据的超时时间
#timeout=(0.1,0.2)#0.1代表链接超时 0.2代表接收数据的超时时间
import requests
respone=requests.get('https://www.baidu.com',
timeout=0.0001)
认证设置
#官网链接:http://docs.python-requests.org/en/master/user/authentication/
#认证设置:登陆网站是,弹出一个框,要求你输入用户名密码(与alter很类似),此时是无法获取html的
# 但本质原理是拼接成请求头发送
# r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
# 一般的网站都不用默认的加密方式,都是自己写
# 那么我们就需要按照网站的加密方式,自己写一个类似于_basic_auth_str的方法
# 得到加密字符串后添加到请求头
# r.headers['Authorization'] =func('.....')
#看一看默认的加密方式吧,通常网站都不会用默认的加密设置
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)
异常处理
#异常处理
import requests
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 RequestException:
print('Error')
上传文件
一般用于第三方服务上传文件会用到.
import requests
files={'file':open('a.jpg','rb')}
respone=requests.post('http://httpbin.org/post',files=files)
print(respone.status_code)
举例:
抽屉自动点赞
分析:
点击获取更多内容:
可以看到发送了一个ajax请求。
我们再点赞试一下,可以看到请求体中,携带了id:
import requests
header = {
"Cookie":'deviceId=web.eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiI5OTc4MTE0ZS1jZDRlLTQ0YWEtOTMzMS04YmJjZTU2YTljZmMiLCJleHBpcmUiOiIxNjU0NDI3NjIzMjI4In0.RDFMfFm9PlMQQbXB91knucnn2ULfL-TO1ymLhbbmjWQ; __snaker__id=r9q6WZAENXErIczY; gdxidpyhxdE=cev%2B4O872OVnz6lamLJyWUeS5ff8V%5CIO4KTlb9MdTtDaY4UaEUKBEMaU6Q7waoeh6n0I8Sr4Q8KCOJuVjKeocEdcsTOPO3N6xsbNbRHBwNo4E3YQfYlcKQHaM73%2FdmJRb1nB0nti1kWIMW7LAvMiEhAD1Iw5%5CTGvOtKfQOOzV0SD8ICy%3A1651836524953; _9755xjdesxxd_=32; YD00000980905869%3AWM_NI=TjVihGAe%2BWLNC2lHcJxCYV6n5OePF1B%2BvEXmc%2Fw51U3TShYaeSW9tfEgy%2Ft3nBch0Q6Jk2pjnyWKH9RiWrxooc00SkNLu0Z2JOeWH4hd9O0B7iZHjWE7Tl0i%2FT0fvaYGdEo%3D; YD00000980905869%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee89cf79b0f1ffa7d37ef69a8ea3d85e868e9fb0d54aa8bf8ca3ea79aeaea6d5c42af0fea7c3b92a98b69a8aeb4d83bbe5b8cf4681eea4a9e242bc9d97b7b566f791abb1c53b82f5baa6db67a1f1b9d6b45ff18c9d89dc6ba78d99daf76e87b9b7d0f739ae9ead89b35bf696a5d3f362aea799accb3392b79993fb65adbd00d1d2618e94bbd1d93a8a91abb8cb40acbcf7b0b34af5b796a9e95d87e99c8db363ed8c0087f56b9b99aca6ee37e2a3; YD00000980905869%3AWM_TID=WY%2BAISARxQxFURREVAPAEIOHA0p2qn9B; token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiJjdHVfNjUxODM1NjAyMTEiLCJleHBpcmUiOiIxNjU0NDI3NjM1NjM5In0.5RDSo94xZigmibnPGic5g1RdYVNmn5avmj3y2bc1s0M; Hm_lvt_03b2668f8e8699e91d479d62bc7630f1=1651835624,1651999964; Hm_lpvt_03b2668f8e8699e91d479d62bc7630f1=1651999982',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36',
'Referer':'https://dig.chouti.com/'
}
res = requests.get("https://dig.chouti.com/link/hot?afterTime=1651928181091000&_=1651999982305",headers=header).json()
# print(res)
for i in res['data']:
id = i['id']
res1 = requests.post('https://dig.chouti.com/link/vote',data={'linkId':'%s' % id},headers=header)
print(res1.text)