1. 程式人生 > 其它 >requests:代理池,上傳檔案

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)