介面實戰:登入古詩文網站(有驗證碼)
阿新 • • 發佈:2022-03-28
一、先找到網頁的介面:使用假的密碼登入,找到登入的介面
2、分析引數:有以下6個引數,經過分析 只需要獲取這兩個引數即可:__VIEWSTATE、code。
__VIEWSTATE引數可以直接獲取擷取:
而code是驗證碼需要去識別:
3、首先獲取 __VIEWSTATE
import requests from lxml import etree import re headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36", } session = requests.Session() # 建立session物件 # 第一次使用session,捕獲請求cookie url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx' page_text = session.get(url = url,headers = headers).text tree = etree.HTML(page_text) # 獲取'__VIEWSTATE (擷取資料兩種辦法)'和'__VIEWSTATEGENERATOR' # VIEWSTATE = tree.xpath('//input[@id="__VIEWSTATE"]/@value')[0] #方法一 html調取 VIEWSTATE=re.findall('id="__VIEWSTATE" value="(.+?)"',page_text)[0] #方法二 擷取 VIEWSTATEGENERATOR = tree.xpath('//input[@id="__VIEWSTATEGENERATOR"]/@value')[0]
4、解析驗證碼
# 解析驗證碼圖片地址 img_src = 'https://so.gushiwen.cn/' + tree.xpath('//*[@id="imgCode"]/@src')[0] # 將驗證碼圖片儲存到本地 img_data = session.get(img_src,headers = headers).content with open('./code.jpg','wb') as fp: fp.write(img_data) # 解析驗證碼圖片 from PIL import Image import pytesseract import os #圖片處理 im=Image.open('./code.jpg') #PIL有九種不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。 im=im.convert('RGBA') im.show tesseract_cmd = 'C:\Program Files (x86)\Tesseract-OCR\\tesseract.exe' #此需下載 code_text = pytesseract.image_to_string(im) code_text = code_text.replace("\n","") #解析了驗證碼 #驗證碼圖片重新命名 src = os.path.join(os.path.abspath("./"), 'code.jpg') dst = os.path.join(os.path.abspath("./"), code_text[0:4] + '.jpg') os.rename(src, dst)
5、模擬登陸
# 流程:1 對點選登入按鈕對應的請求進行傳送(post請求) # 2 處理請求引數: # 使用者名稱 密碼 驗證碼 其他防偽引數 login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx' data = { '__VIEWSTATE': VIEWSTATE, '__VIEWSTATEGENERATOR': 'C93BE1AE', 'from': 'http://so.gushiwen.cn/user/collect.aspx', 'email': '15281619774', # 更換自己的使用者名稱 'pwd': 'luopan', # 更換自己的密碼 'code': code_text, 'denglu': '登入' } # 對點選登入按鈕發起請求,獲取登入成功後對應的頁面原始碼資料,儲存為網頁 page_text_login = session.post(url = login_url,data = data,headers = headers).text with open('./gushiwen.html','w',encoding = 'utf-8') as fp: fp.write(page_text_login) #如果登入成功則刪除圖片 if page_text_login.find(u"已繫結") !=-1: #登入成功 os.remove("./"+ code_text[0:4] + '.jpg') return "登入成功" else : return "登入失敗" os.remove("./" + " .jpg") if __name__ == "__main__": r = 0 while xxxx() == "登入失敗" : r +=1 print(r)
以上的程式碼合起來即可。