requests:代理池,上傳檔案
阿新 • • 發佈:2022-05-09
長連結轉短連線,本質重定向,前提有一個短域名。
前端使用者傳送請求生成短連線,服務端收到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)