在看網頁源代碼的時候,突然發現裏面有一個跳轉代碼,即遇到移動設備訪問的時候,會自動跳轉到 https://m.shangxueba.com/ask/ 頁面。
模擬移動設備訪問之後,在這個移動端頁面上點擊【查看答案】按鈕,居然不需要輸入驗證碼,直接出答案!!!Amazing~(不過親測仍然有三次查詢限制)
下面是完整的 Python 代碼:
# 繞過驗證碼無限次獲取上學吧題目答案
# 上學吧網址:https://www.shangxueba.com/ask
# by HeXu 2019.05.09
# 新增模擬瀏覽器的 header 來避免查詢失敗
import random
import time
import requests
import urllib3
urllib3.disable_warnings() # 這句和上面一句是爲了忽略 https 安全驗證警告,參考:https://www.cnblogs.com/ljfight/p/9577783.html
from bs4 import BeautifulSoup
import webbrowser
def get_question(session, dataid):
link = "https://m.shangxueba.com/ask/" + dataid + ".html"
r = session.get(link)
soup = BeautifulSoup(r.content, "html.parser")
try:
description = soup.find(attrs={"name":"description"})['content'] # 抓取題幹內容
if(description and description[0:5] != '上學吧提供'): # 頁面錯誤的話,顯示的內容是:上學吧提供考研、公務員、司法、會計、金融等各種資格考試認證學習資料,視頻課程,真題,模擬試題分享下載服務和培訓服務
return description
else:
return "無法獲取題目內容!"
except: # 有的時候網址出錯會彈JavaScript彈框:該問題不存在或未審覈
return "該問題不存在或未審覈!"
def get_answer(session, dataid):
millis = int(round(time.time() * 1000))
data = {
"id": dataid,
"action": "showZuiJia",
"t": millis
}
r = session.post("https://m.shangxueba.com/ask/ask_getzuijia.aspx", data=data) # 覈查驗證碼正確性
soup = BeautifulSoup(r.content, "html.parser")
ans = soup.select('.replyCon')
if(ans):
images = ans[0].select('img') # 有的題目答案中有圖片,例如:https://www.shangxueba.com/ask/9710781.html
if(images): # 有的答案中圖片出錯,鏈接爲:http://www.shangxueba.com/exam/images/onErrorImg.jpg
with open('shangxueba_answer.html','w') as f:
f.write(str(ans[0]))
f.close()
webbrowser.open('shangxueba_answer.html')
return "答案中有圖片,已自動打開答案網頁文件。如沒有自動打開網頁,可以手動打開 shangxueba_answer.html"
return ans[0].text.strip()
else:
return "答案獲取失敗!請檢查鏈接是否正確。"
if __name__ == '__main__':
s = requests.session()
print("*"*45 + "\n上學吧答案神器(繞過驗證碼 + 破解IP限制)\nby HeXu 2019.05.29\n" + "*"*45)
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)), # 這一句是整個程序的關鍵,通過修改 X-Forwarded-For 信息來欺騙 ASP 站點對於 IP 的驗證。
"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1", # 這一句非常重要,不然獲取不了答案,2019.05.09 更新
})
link = input("\n請輸入上學吧網站上某道題目的網址,例如:https://www.shangxueba.com/ask/8952241.html\n\n請輸入:").strip() # 過濾首尾的空格
if(link[0:31] != "https://www.shangxueba.com/ask/" or link[-4:] != "html"):
print("\n網址輸入有誤!請重新輸入!\n")
continue
dataid = link.split("/")[-1].replace(r".html","") # 提取網址最後的數字部分
if(dataid.isdigit()): # 根據格式,dataid 應該全部爲數字,判斷字符串是否全部爲數字,返回 True 或者 False
print('\n' + '-'*45 + '\n題目:' + get_question(s, dataid) + '\n\n' + get_answer(s, dataid) + '\n' + '-'*45 + '\n\n\n')
else:
print("\n網址輸入有誤!請重新輸入!\n")
continue
-------------------------------------------------------------------------------------------------------------------------------------------------------------
運行腳本之後,直接輸入上學吧網站上的題目鏈接,即可自動出答案:
分享下載鏈接:
下載鏈接:https://pan.baidu.com/s/1ysBaExwI2S8iV7h--0dz3g 提取碼:ud6t