Python中免驗(yàn)證跳轉(zhuǎn)到內(nèi)容頁(yè)的實(shí)例代碼
相信很多人在瀏覽網(wǎng)頁(yè)時(shí),經(jīng)常會(huì)碰到需要輸入驗(yàn)證碼才可以繼續(xù)瀏覽的情況吧,遇到這種問題,大多數(shù)人只能進(jìn)行繁瑣的注冊(cè)驗(yàn)證,今天小編教大家只要使用python就可以免驗(yàn)證方法。
以經(jīng)常用到的解答網(wǎng)站——上學(xué)吧為例,在網(wǎng)站里點(diǎn)擊答案頁(yè)面,會(huì)顯示驗(yàn)證后才可以查看提示,下面就使用python實(shí)現(xiàn)跳過驗(yàn)證碼。

我們需要通過python構(gòu)造隨機(jī)的 X-Forwarded-For 信息來繞過 ASP 網(wǎng)站的 IP 檢測(cè),可以實(shí)現(xiàn)對(duì)輸入的網(wǎng)址正確性進(jìn)行檢查、對(duì)驗(yàn)證碼核驗(yàn)不通過時(shí)的處理等等。
python免驗(yàn)證跳轉(zhuǎn)頁(yè)面代碼如下:
# 繞過驗(yàn)證碼無限次獲取上學(xué)吧題目答案
# 上學(xué)吧網(wǎng)址:https://www.shangxueba.com/ask
import os
import random
import requests
import urllib3
urllib3.disable_warnings() # 這句和上面一句是為了忽略 https 安全驗(yàn)證警告,參考:https://www.cnblogs.com/ljfight/p/9577783.html
from bs4 import BeautifulSoup
from PIL import Image
def get_verifynum(session): # 網(wǎng)址的驗(yàn)證碼邏輯是先去這個(gè)網(wǎng)址獲取驗(yàn)證碼圖片,提交計(jì)算結(jié)果到另外一個(gè)網(wǎng)址進(jìn)行驗(yàn)證。
r = session.get("https://www.shangxueba.com/ask/VerifyCode2.aspx", verify=False) # HTTPS 請(qǐng)求進(jìn)行 SSL 驗(yàn)證或忽略 SSL 驗(yàn)證才能請(qǐng)求成功,忽略方式為 verify=False。參考:https://www.cnblogs.com/ljfight/p/9577783.html
with open('temp.png','wb+') as f:
f.write(r.content)
image = Image.open('temp.png')
image.show() # 調(diào)用系統(tǒng)的圖片查看軟件打開驗(yàn)證碼圖片,如果不能打開,可以自己找到 temp.png 打開。
verifynum = input("\n請(qǐng)輸入驗(yàn)證碼圖片中的計(jì)算結(jié)果:")
image.close()
os.remove("temp.png")
return verifynum
def get_question(session):
r = session.get(link)
soup = BeautifulSoup(r.content, "html.parser")
description = soup.find(attrs={"name":"description"})['content'] # 抓取題干內(nèi)容
return description
def get_answer(session, verifynum, dataid):
data1 = {
"Verify": verifynum,
"action": "CheckVerify",
}
session.post("https://www.shangxueba.com/ask/ajax/GetZuiJia.aspx", data=data1) # 核查驗(yàn)證碼正確性
data2 = {
"phone":"",
"dataid": dataid,
"action": "submitVerify",
"siteid": "1001",
"Verify": verifynum,
}
r = session.post("https://www.shangxueba.com/ask/ajax/GetZuiJia.aspx", data=data2)
soup = BeautifulSoup(r.content, "html.parser")
ans = soup.find('h6')
print("\n" + '-'*45)
if(ans): # 只有驗(yàn)證碼核查通過才會(huì)顯示答案
print("\n題目:" + get_question(session))
print(ans.text)
else:
print('\n沒有找到答案!請(qǐng)檢查驗(yàn)證碼或網(wǎng)址是否輸入有誤!\n')
print('-'*45)
if __name__ == '__main__':
s = requests.session()
while True:
s.headers.update({"X-Forwarded-For":"%d.%d.%d.%d"%(random.randint(120,125),random.randint(1,200),random.randint(1,200),random.randint(1,200))}) # 這一句是整個(gè)程序的關(guān)鍵,通過修改 X-Forwarded-For 信息來欺騙 ASP 站點(diǎn)對(duì)于 IP 的驗(yàn)證。
link = input("\n請(qǐng)輸入上學(xué)吧網(wǎng)站上某道題目的網(wǎng)址,例如:https://www.shangxueba.com/ask/8952241.html\n\n請(qǐng)輸入:").strip() # 過濾首尾的空格
if(link[0:31] != "https://www.shangxueba.com/ask/" or link[-4:] != "html"):
print("\n網(wǎng)址輸入有誤!請(qǐng)重新輸入!\n")
continue
dataid = link.split("/")[-1].replace(r".html","") # 提取網(wǎng)址最后的數(shù)字部分
if(dataid.isdigit()): # 根據(jù)格式,dataid 應(yīng)該全部為數(shù)字,判斷字符串是否全部為數(shù)字,返回 True 或者 False
verifynum = get_verifynum(s)
get_answer(s, verifynum, dataid)
else:
print("\n網(wǎng)址輸入有誤!請(qǐng)重新輸入!\n")
continue
注意:其中 requests 和 beautifulsoup 兩個(gè)庫(kù)需要另外安裝,建議使用 pip 方式安裝:
pip install requests
pip install beautifulsoup4
Python 腳本運(yùn)行流程:
首先復(fù)制上學(xué)吧某道題目的網(wǎng)址,類似以下格式:

然后運(yùn)行python腳本,復(fù)制粘貼網(wǎng)址。

按Enter鍵,自動(dòng)下載驗(yàn)證碼圖片存為 temp.png,然后自動(dòng)讀取圖片并展示,也可以手動(dòng)打開同目錄下的 temp.png 圖片。

最后在命令行窗口輸入驗(yàn)證碼圖片中的計(jì)算結(jié)果即可獲取題目詳情以及正確答案。

到此這篇關(guān)于Python中免驗(yàn)證跳轉(zhuǎn)到內(nèi)容頁(yè)的實(shí)例代碼的文章就介紹到這了,更多相關(guān)Python如何免驗(yàn)證跳轉(zhuǎn)到內(nèi)容頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)Linux監(jiān)控的方法
本文通過實(shí)例代碼給大家介紹了Python實(shí)現(xiàn)Linux監(jiān)控的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
matplotlib subplots 設(shè)置總圖的標(biāo)題方法
今天小編就為大家分享一篇matplotlib subplots 設(shè)置總圖的標(biāo)題方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
用Python進(jìn)行行為驅(qū)動(dòng)開發(fā)的入門教程
這篇文章主要介紹了用Python進(jìn)行行為驅(qū)動(dòng)開發(fā)的入門教程,本文也對(duì)BDD的概念做了詳細(xì)的解釋,需要的朋友可以參考下2015-04-04
棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu)的基本概念及其相關(guān)的Python實(shí)現(xiàn)
這篇文章主要介紹了棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu)的基本概念及其相關(guān)的Python實(shí)現(xiàn),先進(jìn)先出和后進(jìn)先出的知識(shí)也已經(jīng)成為了計(jì)算機(jī)學(xué)習(xí)中的老生常談了:D需要的朋友可以參考下2015-08-08
一文輕松掌握python語(yǔ)言命名規(guī)范規(guī)則
這篇文章主要介紹了一文輕松掌握python語(yǔ)言命名規(guī)范規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Python基于遞歸算法求最小公倍數(shù)和最大公約數(shù)示例
這篇文章主要介紹了Python基于遞歸算法求最小公倍數(shù)和最大公約數(shù),結(jié)合實(shí)例形式分析了Python使用遞歸算法進(jìn)行數(shù)值計(jì)算的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07

