最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python模擬登陸、POST/GET請(qǐng)求方式

 更新時(shí)間:2024年02月24日 09:59:50   作者:Thomas_Lean  
這篇文章主要介紹了python模擬登陸、POST/GET請(qǐng)求方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

python模擬登陸、POST/GET請(qǐng)求

通常我們?cè)谠L問網(wǎng)頁時(shí),都會(huì)通過某個(gè)輸入框輸入數(shù)據(jù),網(wǎng)頁就會(huì)發(fā)出POST、GET或者其他形式向服務(wù)器發(fā)起請(qǐng)求,成功后并返回?cái)?shù)據(jù)到前臺(tái)展示。以下針對(duì)python的requests庫做簡(jiǎn)單介紹。

前提先安裝python以及requests庫

安裝requests:

pip install requests

請(qǐng)求測(cè)試url = http://www.test.com

一、GET請(qǐng)求

1、無請(qǐng)求參數(shù):直接訪問某url鏈接即可獲取數(shù)據(jù)

result = requests.get(url=url)
print(result.status_code) # 請(qǐng)求狀態(tài)
print(result.url)# 請(qǐng)求url
print(result.text) # 請(qǐng)求結(jié)果

2、有請(qǐng)求參數(shù):鍵值對(duì)形式表示參數(shù)

result = requests.get(url=url, params={'keyword1':'val1','keyword2':'val2'})
#或者可以直接先拼接url
#new_url = url + '?keyword1=' + val1 + '&keyword1=' +val2
#result = requests.get(url=new_url)

print(result.status_code) # 請(qǐng)求狀態(tài)
print(result.url)# 請(qǐng)求url
print(result.text) # 請(qǐng)求結(jié)果

3、有請(qǐng)求頭部參數(shù):鍵值對(duì)形式表示參數(shù)

result = requests.get(url=url, params={'keyword1':'val1','keyword2':'val2'})
#或者可以直接先拼接url
#new_url = url + '?keyword1=' + val1 + '&keyword1=' +val2
#result = requests.get(url=new_url)

print(result.status_code) # 請(qǐng)求狀態(tài)
print(result.url)# 請(qǐng)求url
print(result.text) # 請(qǐng)求結(jié)果

二、POST請(qǐng)求

1、請(qǐng)求的結(jié)果集是application/x-www-form-urlencoded

result = requests.post(url=url,data={'keyword1':'val1','keyword2':'val2'},headers={'Content-Type':'application/x-www-form-urlencoded'})
print(result.status_code) # 請(qǐng)求狀態(tài)
print(result.url)# 請(qǐng)求url
print(result.text) # 請(qǐng)求結(jié)果

2、請(qǐng)求的結(jié)果集是multipart/form-data

result = requests.post(url=url,data={'keyword1':'val1','keyword2':'val2'},headers={'Content-Type':'multipart/form-data'})
print(result.status_code) # 請(qǐng)求狀態(tài)
print(result.url)# 請(qǐng)求url
print(result.text) # 請(qǐng)求結(jié)果

3、請(qǐng)求的結(jié)果集是application/json

import json
data = {'keyword1':'val1','keyword2':'val2'}
json_data = json.dumps(data)
result = requests.post(url=url,data=json_data,headers={'Content-Type':'application/json'})
print(result.status_code) # 請(qǐng)求狀態(tài)
print(result.url)# 請(qǐng)求url
print(result.text) # 請(qǐng)求結(jié)果

如下圖:


下來來說一下之前自己遇到的坑,請(qǐng)求方式為POST,且為Request Payload形式的請(qǐng)求。

一開始自以為跟form-data一樣,只傳一個(gè)url跟data,且data沒有格式化成JSON,導(dǎo)致請(qǐng)求回來的狀態(tài)為415:服務(wù)器無法處理請(qǐng)求附帶的媒體格式,經(jīng)查閱后來改個(gè)格式以及請(qǐng)求頭就順利返回?cái)?shù)據(jù)。

完整demo如下:

import json
import requests
import datetime
import re, urllib.request, lxml.html, http.cookiejar

url = 'http://test.com/products'
# payloadData數(shù)據(jù)
payload_data = {'keyword1': "val1", 'keyword2': "val2"}
# 請(qǐng)求頭設(shè)置
payload_header = {
'Host': 'test.com',
'Content-Type': 'application/json; charset=UTF-8',
}
# 下載超時(shí)
timeout = 30
# 代理IP
# proxy_list = {"HTTP":'http://210.22.5.117"3128',"HTTP":'http://163.172.189.32:8811',"HTTP":'http://180.153.144.138:8800'}
json_data = json.dumps(payload_data)
# allow_redirects 是否重定向
# result = requests.post(url=url, data=json_data, headers=payloadHeader, timeout=timeout, proxies=proxy_list, allow_redirects=True)

result = requests.post(url, data=json_data, headers=payload_header, timeout=timeout, allow_redirects=True)
# 下面這種直接填充json參數(shù)的方式也OK
# result = requests.post(url, json=json_data, headers=payload_header)
print("請(qǐng)求耗時(shí):{0}, 狀態(tài)碼:{1}, 結(jié)果:{2}".format(datetime.datetime.now(),res.status_code,res.text))

三、需要模擬登陸后再發(fā)送Post請(qǐng)求

有時(shí)候就想模擬頁面上的某些細(xì)微的操作,例如登錄后需要在前端利用ajax請(qǐng)求修改數(shù)據(jù)。

如果只是極個(gè)別數(shù)量修改的話,那還是前端直接操作快一點(diǎn)。

如果是大批量的修改那還是得借住程序遍歷修改即可。

登錄頁面:


先打開F12進(jìn)入開發(fā)者模式,然后隨便在上面的表單輸入框數(shù)據(jù),點(diǎn)擊登錄,雖然是錯(cuò)誤的登錄數(shù)據(jù),我們只是為了查看登錄請(qǐng)求提交的數(shù)據(jù)格式,如下圖:

其中的某些不是我們輸入的隱藏值,我們需要到頁面源碼中的表單獲取,右鍵查看頁面源碼,把那些非自己輸入的 “__VIEWSTATE",”__VIEWSTATEGENERATOR","__EVENTVALIDATION" 的值到原頁面中查找,例如:

也就是說我們得事先先訪問該頁面頁面源碼并解析獲取以上屬性值:

import requests, string
import re, urllib.request, lxml.html, http.cookiejar

login_url = "http://test.com/Login.aspx"
response = urllib.request.urlopen(login_url)
f = response.read()
doc = lxml.html.document_fromstring(f)

VIEWSTATE = doc.xpath("http://input[@id='__VIEWSTATE']/@value")
VIEWSTATEGENERATOR = doc.xpath("http://input[@id='__VIEWSTATEGENERATOR']/@value")
EVENTVALIDATION = doc.xpath("http://input[@id='__EVENTVALIDATION']/@value")

獲取到這些之后,得把這些值放回到Form-Data(表單數(shù)據(jù)中):

from urllib.parse import quote
login_data = urllib.parse.urlencode({
       '__EVENTTARGET' : '',
       '__EVENTARGUMENT' : '',
       '__VIEWSTATE' : VIEWSTATE[0],
       '__VIEWSTATEGENERATOR' : VIEWSTATEGENERATOR[0],
       '__EVENTVALIDATION' : EVENTVALIDATION[0],
       'TextCustomerID' : "真實(shí)商戶號(hào)",
       'TextAdminName' : '真實(shí)用戶名',
       'TextPassword' : '真實(shí)密碼',
       'btnLogin.x' : 40,
       'btnLogin.y' : 10
    }).encode('utf-8')

登錄參數(shù)的編碼很重要,如果沒有進(jìn)行utf-8編碼會(huì)報(bào)以下錯(cuò)誤:

Traceback (most recent call last):
  File "c:\users\user\appdata\local\programs\python\python38\lib\http\client.py", line 965, in send
    self.sock.sendall(data)
  File "c:\users\user\appdata\local\programs\python\python38\lib\ssl.py", line 1201, in sendall
    with memoryview(data) as view, view.cast("B") as byte_view:
TypeError: memoryview: a bytes-like object is required, not 'str'

表單數(shù)據(jù)有了,接下來就是把請(qǐng)求頭也要獲取出來:

header = {
   'Host': 'www.test.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Accept-Encoding': 'gzip, deflate',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Origin': 'http://www.test.com',
    'Connection': 'keep-alive',
    'Referer': 'http://www.test.com/Login.aspx',
    'Upgrade-Insecure-Requests': 1
}

模擬登陸并保存cookie:

#模擬登錄請(qǐng)求
login_request = urllib.request.Request(login_url, login_data, Headers)
#創(chuàng)建cookie,利用cookie實(shí)現(xiàn)持久化登錄
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
login_result = opener.open(login_request)

最后模擬登陸后,如果是要采集某頁面數(shù)據(jù)的話也可以通過urllib.request.urlopen訪問頁面鏈接讀取頁面源碼進(jìn)行數(shù)據(jù)采集。

如果有批量數(shù)據(jù)需要進(jìn)行Post/Get處理,那么就可以把待處理的數(shù)據(jù)獲取好,然后遍歷發(fā)起Post或Get請(qǐng)求即可:

import time, random

var datas = {.....}
for data in datas:
    response = requests.get(url, headers = headers, data=json_data, cookies = cj)
    # 或
    response = requests.post(url, headers = headers, data=json_data, cookies = cj)
    time.sleep(random.randint(3, 5))

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python Pillow Image Invert

    Python Pillow Image Invert

    今天小編就為大家分享一篇關(guān)于Python Pillow Image Invert,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • python運(yùn)行腳本文件的三種方法實(shí)例

    python運(yùn)行腳本文件的三種方法實(shí)例

    在計(jì)算中,腳本一詞用于指代包含訂單邏輯序列的文件或批處理文件,下面這篇文章主要給大家介紹了關(guān)于python運(yùn)行腳本文件的三種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Python迭代器的應(yīng)用場(chǎng)景分析

    Python迭代器的應(yīng)用場(chǎng)景分析

    這篇文章給大家介紹Python迭代器的應(yīng)用場(chǎng)景分析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2026-02-02
  • python 同時(shí)運(yùn)行多個(gè)程序的實(shí)例

    python 同時(shí)運(yùn)行多個(gè)程序的實(shí)例

    今天小編就為大家分享一篇python 同時(shí)運(yùn)行多個(gè)程序的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • pytest參數(shù)化:@pytest.mark.parametrize詳解

    pytest參數(shù)化:@pytest.mark.parametrize詳解

    pytest.mark.parametrize裝飾器能夠?qū)y(cè)試函數(shù)進(jìn)行參數(shù)化處理,使得一個(gè)測(cè)試函數(shù)可以用多組數(shù)據(jù)執(zhí)行多次,這有助于檢查不同輸入下的期望輸出是否匹配,提高測(cè)試的效率和覆蓋率,裝飾器可以應(yīng)用于函數(shù)、模塊或類,支持多個(gè)裝飾器組合使用,增強(qiáng)測(cè)試的靈活性和綜合性
    2024-10-10
  • Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解

    Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解

    這篇文章主要介紹了Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解,argparse?是?Python?的一個(gè)標(biāo)準(zhǔn)庫,用于命令行參數(shù)的解析,這意味著我們無需在代碼中手動(dòng)為變量賦值,而是可以直接在命令行中向程序傳遞相應(yīng)的參數(shù),再由變量去讀取這些參數(shù),需要的朋友可以參考下
    2023-08-08
  • python文本數(shù)據(jù)相似度的度量

    python文本數(shù)據(jù)相似度的度量

    這篇文章主要為大家詳細(xì)介紹了python文本數(shù)據(jù)相似度的度量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python算法測(cè)試結(jié)果自動(dòng)保存到excel表格的實(shí)現(xiàn)步驟

    python算法測(cè)試結(jié)果自動(dòng)保存到excel表格的實(shí)現(xiàn)步驟

    我們?cè)谶M(jìn)行算法評(píng)估是通常會(huì)針對(duì)每個(gè)樣本的算法處理結(jié)果進(jìn)行統(tǒng)計(jì),例如每個(gè)樣本正確預(yù)測(cè)數(shù)量、漏檢數(shù)量和誤檢數(shù)量、精度等,本文小編將給大家介紹python算法測(cè)試結(jié)果自動(dòng)保存到excel表格的實(shí)現(xiàn)步驟,感興趣的朋友可以參考下
    2023-12-12
  • python使用pygame實(shí)現(xiàn)笑臉乒乓球彈珠球游戲

    python使用pygame實(shí)現(xiàn)笑臉乒乓球彈珠球游戲

    這篇文章主要為大家詳細(xì)介紹了python使用pygame實(shí)現(xiàn)笑臉乒乓球彈珠球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Python解析MySQL Binlog日志分析情況

    Python解析MySQL Binlog日志分析情況

    文章介紹了如何使用Python解析MySQL的binlog日志,并通過分析binlog來了解數(shù)據(jù)庫的變動(dòng)情況,如大事務(wù)、頻繁更新的表等,文章詳細(xì)描述了binlog的結(jié)構(gòu)、事件類型以及如何通過解析這些事件來獲取所需的信息,最后,文章提供了一個(gè)示例代碼
    2025-01-01

最新評(píng)論

凤山市| 淮北市| 瓮安县| 临邑县| 古田县| 安溪县| 增城市| 息烽县| 玛曲县| 且末县| 通辽市| 黑龙江省| 赤水市| 凤翔县| 华池县| 西乡县| 宁强县| 文登市| 武平县| 如东县| 唐山市| 麻城市| 清新县| 平安县| 公安县| 柳林县| 安化县| 辉南县| 志丹县| 锡林浩特市| 阳山县| 竹北市| 宝丰县| 繁峙县| 阳春市| 偏关县| 嘉善县| 潢川县| 浙江省| 绥阳县| 贡觉县|