天天看點

Python模拟登入青果教務系統

Python模拟登入青果教務系統

找了本書:《python網絡資料采集》準備學一點 python 爬蟲,記錄一下學到的東西吧

詳細知識就不說了,主要記錄一下後面使用 webdriver 模拟登陸

需要有以下環境準備:

1、requests庫

2、selenium庫(版本在3.8.0,高了不支援phantonjs)

3、chromedriver(對應好谷歌浏覽器版本,放在谷歌浏覽器安裝目錄,然後把這個目錄添加到環境變量)

Python模拟登入青果教務系統

代碼部分:

from bs4 import BeautifulSoup
from selenium import webdriver
import requests
import time
from selenium.webdriver.common.keys import Keys
#這個庫主要是用來模拟按鍵的

#browser=webdriver.PhantomJS(executable_path='D:/software/phantomjs-2.1.1-windows/bin/phantomjs')
#browser.get("http://jwxt.sdaeu.edu.cn/jwweb/home.aspx")
#為了驗證,暫時不用無界

#chromeOptions = webdriver.ChromeOptions()
#chromeOptions.add_argument("--proxy-server=http://127.0.0.1:8080")
#給chrome設定代理

#browser = webdriver.Chrome(chrome_options = chromeOptions)
browser = webdriver.Chrome()
browser.get('http://jwxt.sdaeu.edu.cn/jwweb/home.aspx')
#打開chrome

time.sleep(2)
browser.switch_to_frame('frm_login')
#跳轉表單,因為網頁上有多個frame,每個都是獨立的
#是以需要先找到登入用的那一個frame

browser.find_element_by_id("txt_sdertfgsadscxcadsads").click()
#要點一下才能出現更換驗證碼的連結

jpg=browser.find_element_by_id('imgCode')
img_src=jpg.get_attribute("src")
#拿到更換驗證碼url

#在這裡應該使用browser的ASP.NET_SessionId的值
cookie_bro = browser.get_cookies()
#擷取browser的cookie字典
#print(cookie_bro)
cookie1=cookie_bro[0]['value']
print("\n目前cookie為: "+cookie1)

headers1={
  'Host':'jwxt.sdaeu.edu.cn',
  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
  'Accept':'image/webp,image/apng,image/*,*/*;q=0.8',
  'Referer':'http://jwxt.sdaeu.edu.cn/jwweb/_data/login_home.aspx',
  'Accept-Encoding':'gzip, deflate',
  'Accept-Language':'zh-CN,zh;q=0.9',
  'Cookie':'myCookie=;'+'ASP.NET_SessionId='+cookie1,
  'Connection':'close'
}
#header頭要全一些,之前隻用cookie請求還是不行

#proxy1={"http":"http://127.0.0.1:8080"}
#r=requests.get(img_src,headers=headers1,proxies=proxy1)
#requests使用代理

r=requests.get(img_src,headers=headers1)
img_content=r.content
print("[*]正在下載下傳驗證碼...\n")
with open('check.jpg','wb') as f:
  f.write(img_content)

#提前填寫學号和密碼
browser.find_element_by_id("txt_asmcdefsddsd").send_keys("學号")
browser.find_element_by_id("txt_asmcdefsddsd").send_keys(Keys.TAB)
browser.find_element_by_id("txt_pewerwedsdfsdff").send_keys("密碼")

#暫時需要手動輸入
code = input("[*]請輸入驗證碼: ")
browser.find_element_by_id("txt_sdertfgsadscxcadsads").send_keys(code)
browser.find_element_by_id("btn_login").click()

#browser.close()
#關閉浏覽器           

複制

最後說一下驗證碼的事情:

當去通路教務處網站(簡稱網站)的時候,是沒有 cookie 的

Python模拟登入青果教務系統

這時候會傳回一個 cookie,“set_cookie”,伺服器就是靠這個 cookie 知道是你的

Python模拟登入青果教務系統

當你去請求更換驗證碼的時候也是要帶着這個 cookie 去請求,浏覽器才能知道是你更換驗證碼,而不是一個新的通路者

Python模拟登入青果教務系統
Python模拟登入青果教務系統

而且 url 後面那個 ?t=208 參數,即使是相同的,傳回的驗證碼也不是相同的

是以當你帶着 cookie 去請求驗證碼的時候,實際上你應該輸入的驗證碼,已經從浏覽器上顯示的,變成了請求之後下載下傳下來的了

其實使用 webdriver 直接去請求連結也就不用管什麼 cookie 了,畢竟一直就是那個浏覽器,但是儲存圖檔的時候有點編碼之類的問題,也沒解決就直接用 requests 了

Python模拟登入青果教務系統

另外,使用在 github 上其他人訓練好的驗證碼識别子產品整合了一下,但是識别率實在有點低

使用的識别子產品

https://github.com/bieberg0n/jwgl-ocr           

複制

整理好的可以自動識别的代碼:

https://github.com/yichen115/python-qgjwxt           

複制