国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

selenium+requests 實現(xiàn)網(wǎng)頁跳轉(zhuǎn)登錄及爬取

這篇具有很好參考價值的文章主要介紹了selenium+requests 實現(xiàn)網(wǎng)頁跳轉(zhuǎn)登錄及爬取。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

項目背景

  • 本項目設(shè)立目的是為了通過腳本,實現(xiàn)學(xué)校體育場館的“秒約”。便于同學(xué)瞬間搶到熱門時間段的體育場。
  • 服務(wù)器工作峰值時瀏覽器可能會卡死,因此例如selenium等需要加載瀏覽器界面的庫可能會降低效率。
  • 采用requests庫直接向服務(wù)器發(fā)送請求,效率更高。

項目的組成部分

通過selenium庫模擬登錄獲取cookies

如果在預(yù)約界面,點擊“預(yù)約”按鈕。然后抓包獲取headers、cookies等參數(shù),很有可能只獲取的一部分cookies。
如果傳遞的cookies參數(shù)不夠全面,很有可能重新跳轉(zhuǎn)至登錄界面。requests.post()返回的內(nèi)容如下:
(返回跳轉(zhuǎn)到登錄網(wǎng)址的代碼,而不是原網(wǎng)址內(nèi)容)
selenium登錄后訪問其他頁面,selenium,python,爬蟲

而如果通過requests庫,走正常流程登錄時,登錄系統(tǒng)用戶名及密碼通常進(jìn)行過加密。使得我們不知道如何向系統(tǒng)傳遞參數(shù)進(jìn)行登錄。(如圖)
selenium登錄后訪問其他頁面,selenium,python,爬蟲

因此我們可以通過用selenium模擬用戶成功登錄后,通過selenium獲取cookies傳遞給requests,借殼上市,實現(xiàn)requests對頁面的成功訪問。同時也不會影響在搶預(yù)約時的效率。
此外需要注意的是,建議采用requests.Session()來進(jìn)行訪問。Session對象可以獲取響應(yīng)的cookies值并自動進(jìn)行記錄,可以保持一個持續(xù)會話的狀態(tài),避免后面訪問網(wǎng)址需要多次傳遞cookies
具體代碼如下:

print('開始自動化操作')

# 繞過人機檢查
options = webdriver.EdgeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

# 采用Edge驅(qū)動
wb = webdriver.Edge(options = options,service=Service(r'D:\軟件\PyCharm Community Edition 2023.1.3\edgedriver_win64\msedgedriver.exe'))

# 繞過人機檢查
wb.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})

# 直接獲取預(yù)約界面,隨后跳轉(zhuǎn)至登錄界面。完成登錄后,會再跳轉(zhuǎn)至預(yù)約界面。
wb.get(r'http://XXX.XXX.edu.cn/eduplus/order/initOrderIndex.do?sclId=1')
# 設(shè)置隱式等待5秒
wb.implicitly_wait(5)

# 在登錄界面,找到用戶名和密碼框
user = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[1]/input')
password = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[2]/input[1]')
login = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[5]')

# 輸入用戶名及密碼完成登錄
user.send_keys('XXX')
password.send_keys('XXXX')
login.click()

time.sleep(3)

# 打印wb中所有的cookies
print(wb.get_cookies())

# 設(shè)置訪問頭
headers = {...
}


# 創(chuàng)建session對話對象
se = requests.Session()

# 將wb中所有的cookies傳遞給session對象
for co in wb.get_cookies():
    requests.utils.add_dict_to_cookiejar(se.cookies, {co['name']: co['value']})

# 撤銷wb對象內(nèi)存
wb.close()

# 打印session對象中所有的cookies
print(se.cookies)

# 訪問預(yù)約網(wǎng)址
r1 = se.get(r'http://.XXX.edu.cn/eduplus/order/initOrderIndex.do?sclId=1', headers=headers)
# 打印預(yù)約網(wǎng)址源碼,打印成功即成功登錄
print(r1.text)

向服務(wù)器發(fā)送請求獲取驗證碼并識別

至此,即將進(jìn)入本項目第二個難點。獲取驗證碼及識別
在選好場地和時間后,需要輸入手機號及驗證碼才能點擊預(yù)約。(如圖)
selenium登錄后訪問其他頁面,selenium,python,爬蟲

通過抓包,我們能夠清楚的知道請求網(wǎng)址及傳遞的參數(shù)。(如圖)
selenium登錄后訪問其他頁面,selenium,python,爬蟲
現(xiàn)在唯一需要做的就是驗證碼的識別。通過開發(fā)者工具確定驗證碼圖片位置,隨后通過Session對象訪問圖片地址,并保存在本地。、
selenium登錄后訪問其他頁面,selenium,python,爬蟲
實現(xiàn)代碼如下:

# 訪問驗證碼地址
r2 = se.get(r'http://yuyue.XXX.XXX.cn/eduplus/validateimage', headers = headers)
image_path = 'test' + str(random.randint(0,99999)) + '.jpg'
with open(image_path, 'wb') as f:
    f.write(r2.content)

隨后通過第三方接口,實現(xiàn)對驗證碼的識別及輸出
(此次我選擇的是圖靈,雖然收費但是十分便宜)
實現(xiàn)代碼如下:

# 圖靈官方提供的API接口
def b64_api(username, password, img_path, ID):
    with open(img_path, 'rb') as f:
        b64_data = base64.b64encode(f.read())
    b64 = b64_data.decode()
    data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
    data_json = json.dumps(data)
    result = json.loads(requests.post("http://www.fdyscloud.com.cn/tuling/predict", data=data_json).text)
    return result

# 通過圖靈官方接口,識別驗證碼
result = b64_api(username="XXX", password="XXX", img_path=image_path, ID="XXXX")
validate_code = result.get('data').get('result')

向服務(wù)器發(fā)送請求,實現(xiàn)預(yù)約

最后匯總參數(shù)向服務(wù)器發(fā)起預(yù)約。以下為項目整體代碼:

import time
import random
import json
import base64

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
import requests

# 圖靈驗證碼識別官方接口
def b64_api(username, password, img_path, ID):
    with open(img_path, 'rb') as f:
        b64_data = base64.b64encode(f.read())
    b64 = b64_data.decode()
    data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
    data_json = json.dumps(data)
    result = json.loads(requests.post("http://www.fdyscloud.com.cn/tuling/predict", data=data_json).text)
    return result


print('開始自動化操作')

# 繞過人機檢查
options = webdriver.EdgeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

# 采用Edge驅(qū)動
wb = webdriver.Edge(options = options,service=Service(r'D:\軟件\PyCharm Community Edition 2023.1.3\edgedriver_win64\msedgedriver.exe'))

# 繞過人機檢查
wb.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})

# 直接獲取預(yù)約界面,隨后跳轉(zhuǎn)至登錄界面。完成登錄后,會再跳轉(zhuǎn)至預(yù)約界面。
wb.get(r'http://XXX.XXX.edu.cn/eduplus/order/initOrderIndex.do?sclId=1')
# 設(shè)置隱式等待5秒
wb.implicitly_wait(5)

# 在登錄界面,找到用戶名和密碼框
user = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[1]/input')
password = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[2]/input[1]')
login = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[5]')

# 輸入用戶名及密碼完成登錄
user.send_keys('XXX')
password.send_keys('XXX')
login.click()


time.sleep(3)

# 打印wb中所有的cookies
print(wb.get_cookies())


headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'Host': 'XXX.XXX.edu.cn',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}


# 創(chuàng)建session對話對象
se = requests.Session()
# 將wb中所有的cookies傳遞給session對象
for co in wb.get_cookies():
    requests.utils.add_dict_to_cookiejar(se.cookies, {co['name']: co['value']})

# 撤銷wb對象內(nèi)存
wb.close()

# 打印session對象中所有的cookies
print(se.cookies)

# 訪問預(yù)約網(wǎng)址
r1 = se.get(r'http://XXX.XXX.edu.cn/eduplus/order/initOrderIndex.do?sclId=1', headers=headers)
# 打印預(yù)約網(wǎng)址源碼,打印成功即成功登錄
print(r1.text)

# 訪問驗證碼網(wǎng)址
r2 = se.get(r'http://XXX.XXX.edu.cn/eduplus/validateimage', headers = headers)
image_path = 'test' + str(random.randint(0,99999)) + '.jpg'
with open(image_path, 'wb') as f:
    f.write(r2.content)

# 通過圖靈官方接口,識別驗證碼
result = b64_api(username="XXX", password="XXX", img_path=image_path, ID="XXX")
validate_code = result.get('data').get('result')

# 相關(guān)預(yù)約參數(shù)
data={
    'useTime': 'XXX',    # 預(yù)約時段
    '預(yù)約項目': 'XXX',                        #  時段項目, 10 為九龍湖羽毛球
    'allowHalf': '2',
    'validateCode': validate_code,            # 驗證碼
    'phone': 'XXX',                  # 手機號
    'remark': ''                           # 備注
}


# 向網(wǎng)站發(fā)出預(yù)約
r3 = se.post('http://XXX.XXX.edu.cn/eduplus/order/order/getOrderInfo.do?sclId=1', headers=headers, data=data)

input('結(jié)束')

新人項目,歡迎指教交流!文章來源地址http://www.zghlxwxcb.cn/news/detail-764963.html

到了這里,關(guān)于selenium+requests 實現(xiàn)網(wǎng)頁跳轉(zhuǎn)登錄及爬取的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • selenium爬取網(wǎng)頁內(nèi)容,對網(wǎng)頁內(nèi)容進(jìn)行點擊

    selenium爬取網(wǎng)頁內(nèi)容,對網(wǎng)頁內(nèi)容進(jìn)行點擊

    所需要的庫 首先明確所要爬取的網(wǎng)頁,選擇調(diào)用方法,增加無界面模式的無頭參數(shù),然后調(diào)用,獲取網(wǎng)址,使頁面放大,為最大化窗口 獲取數(shù)據(jù)運用XPATH函數(shù),將獲取的數(shù)據(jù)作為item,運用XPATH函數(shù)獲取, ? 模仿人點擊下一頁,運用 for語句,每10個一點,停留5秒 同樣尋找下一

    2024年01月17日
    瀏覽(27)
  • 【爬蟲】5.5 Selenium 爬取Ajax網(wǎng)頁數(shù)據(jù)

    【爬蟲】5.5 Selenium 爬取Ajax網(wǎng)頁數(shù)據(jù)

    目錄 ? AJAX 簡介 任務(wù)目標(biāo) 創(chuàng)建Ajax網(wǎng)站 創(chuàng)建服務(wù)器程序 編寫爬蟲程序 ????????AJAX(Asynchronous JavaScript And XML,異步 JavaScript 及 XML) Asynchronous 一種創(chuàng)建 交互式 、 快速動態(tài) 網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù) 通過在后臺與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,無需重新加載整個網(wǎng)頁的情況下

    2024年02月10日
    瀏覽(51)
  • Python實戰(zhàn):用Selenium爬取網(wǎng)頁數(shù)據(jù)

    網(wǎng)絡(luò)爬蟲是Python編程中一個非常有用的技巧,它可以讓您自動獲取網(wǎng)頁上的數(shù)據(jù)。在本文中,我們將介紹如何使用Selenium庫來爬取網(wǎng)頁數(shù)據(jù),特別是那些需要模擬用戶交互的動態(tài)網(wǎng)頁。 Selenium是一個自動化測試工具,它可以模擬用戶在瀏覽器中的操作,比如點擊按鈕、填寫表

    2024年02月06日
    瀏覽(42)
  • python基于Selenium方法爬取網(wǎng)頁圖片

    python基于Selenium方法爬取網(wǎng)頁圖片

    selenium是一個用于web應(yīng)用程序的自動化測試工具,通過Selenium可以寫出自動化程序,擬人在瀏覽器對網(wǎng)頁進(jìn)行操作。selenium可以編寫出自動化程序,簡化手動保存的部分。 requests庫可以向第三方發(fā)送http請求,是一個用于網(wǎng)絡(luò)請求的模塊,通常以GET方式請求特定資源,請求中不應(yīng)

    2024年02月03日
    瀏覽(26)
  • Python爬蟲|使用Selenium輕松爬取網(wǎng)頁數(shù)據(jù)

    Python爬蟲|使用Selenium輕松爬取網(wǎng)頁數(shù)據(jù)

    1. 什么是selenium? Selenium是一個用于Web應(yīng)用程序自動化測試工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作瀏覽器一樣。支持的瀏覽器包括IE,F(xiàn)irefox,Safari,Chrome等。 Selenium可以驅(qū)動瀏覽器自動執(zhí)行自定義好的邏輯代碼,也就是可以通過代碼完全模擬成人類使用

    2024年02月04日
    瀏覽(32)
  • python爬蟲實戰(zhàn) scrapy+selenium爬取動態(tài)網(wǎng)頁

    python爬蟲實戰(zhàn) scrapy+selenium爬取動態(tài)網(wǎng)頁

    最近學(xué)習(xí)了scrapy爬蟲框架,想要找個目標(biāo)練練手。由于現(xiàn)在很多網(wǎng)頁都是動態(tài)的,因此還需要配合selenium爬取。本文旨在記錄這次學(xué)習(xí)經(jīng)歷,如有疑問或不當(dāng)之處,可以在評論區(qū)指出,一起學(xué)習(xí)。 對scrapy不了解的同學(xué)可以閱讀這篇文章 爬蟲框架 Scrapy 詳解,對scrapy框架介紹的

    2024年02月07日
    瀏覽(51)
  • Python使用Selenium Webdriver爬取網(wǎng)頁所有內(nèi)容

    Python使用Selenium Webdriver爬取網(wǎng)頁所有內(nèi)容

    有時候,我們在用urllib或者requests庫抓取頁面時,得到的html源代碼和瀏覽器中看到的不一樣。這將是我們面臨的一個非常常見的問題?,F(xiàn)在網(wǎng)頁越來越多地采用Ajax、前端模塊化工具來構(gòu)建,整個網(wǎng)頁可能都是由JavaScript渲染出來的,也就是說原始的HTML代碼可能就是一個空殼,

    2023年04月08日
    瀏覽(31)
  • 用selenium去爬取大麥網(wǎng)頁面的演唱會信息

    用selenium去爬取大麥網(wǎng)頁面的演唱會信息

    利用selenium.webdriver爬取大麥網(wǎng)頁面演唱會信息,信息包括: 演唱會標(biāo)題、時間、價錢、地點、圖片、網(wǎng)址。 操作環(huán)境: 1. Window10;? 2. python3.9;? ?3. PycharmIDE 第三方庫版本: 1. selenium 4.1.1 2. requests 2.28.1 本實驗主要利用Goggle chrome瀏覽器進(jìn)行,其中 瀏覽器版本為118開頭 ,可在設(shè)

    2024年02月02日
    瀏覽(54)
  • 華納云:Python中如何使用Selenium爬取網(wǎng)頁數(shù)據(jù)

    這篇文章主要介紹“Python中如何使用Selenium爬取網(wǎng)頁數(shù)據(jù)”,在日常操作中,相信很多人在Python中如何使用Selenium爬取網(wǎng)頁數(shù)據(jù)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python中如何使用Selenium爬取網(wǎng)頁數(shù)據(jù)”的疑惑有所幫助!接下

    2024年02月07日
    瀏覽(27)
  • Python網(wǎng)絡(luò)爬蟲逆向分析爬取動態(tài)網(wǎng)頁、使用Selenium庫爬取動態(tài)網(wǎng)頁、?編輯將數(shù)據(jù)存儲入MongoDB數(shù)據(jù)庫

    Python網(wǎng)絡(luò)爬蟲逆向分析爬取動態(tài)網(wǎng)頁、使用Selenium庫爬取動態(tài)網(wǎng)頁、?編輯將數(shù)據(jù)存儲入MongoDB數(shù)據(jù)庫

    目錄 逆向分析爬取動態(tài)網(wǎng)頁 了解靜態(tài)網(wǎng)頁和動態(tài)網(wǎng)頁區(qū)別 1.判斷靜態(tài)網(wǎng)頁 ?2.判斷動態(tài)網(wǎng)頁 ?逆向分析爬取動態(tài)網(wǎng)頁 使用Selenium庫爬取動態(tài)網(wǎng)頁 安裝Selenium庫以及下載瀏覽器補丁 頁面等待 ?頁面操作 1.填充表單 2.執(zhí)行JavaScript 元素選取 Selenium庫的find_element的語法使用格式如下

    2024年02月15日
    瀏覽(65)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包