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)

截屏2022-05-08 下午2.58.24

此时我们不使用代理访问。

# 不使用代理访问
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

下载项目之后的第一步安装依赖。

截屏2022-05-08 下午3.57.39

按照官网方法走即可。

发送get请求,到Redis中随机去一个IP返回

截屏2022-05-08 下午4.12.50

超时设置

#超时设置
#两种超时: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)

举例:

截屏2022-05-08 下午4.30.13

抽屉自动点赞

分析:

点击获取更多内容:

截屏2022-05-08 下午6.17.34

可以看到发送了一个ajax请求。

截屏2022-05-08 下午6.18.13

截屏2022-05-08 下午6.20.46

我们再点赞试一下,可以看到请求体中,携带了id:

截屏2022-05-08 下午6.19.52

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)
posted @ 2022-05-09 15:28  谢俊杰  阅读(642)  评论(0编辑  收藏  举报