selenium模拟登录12306
生活随笔
收集整理的這篇文章主要介紹了
selenium模拟登录12306
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用selenium模擬登錄12306,但是12306的登陸要想模擬還挺難的,需要先進行坐標識別,識別出來之后還要在進行滑塊拖動驗證識別,這里做一下記錄.
這里的坐標識別是用的超級鷹,有時也會坐標識別出錯,最后的一步滑動驗證碼識別現在做不了,不論是模擬滑動還是手動滑動都有問題。源代碼如下(其中超級鷹的識別代碼就不貼了)
from selenium import webdriver from time import sleep from PIL import Image from selenium.webdriver import ChromeOptions # 檢測規避 from spider_basic.expand.chaojiying import verify_text# 檢測規避 options = ChromeOptions() options.add_experimental_option('excludeSwitches', ['enable-automation'])brow = webdriver.Chrome(executable_path='./chromedriver.exe', options=options) # 瀏覽器最大化操作,這里需要執行這個操作才能精確定位 brow.maximize_window()brow.get('https://kyfw.12306.cn/otn/resources/login.html') login_account_bnt = brow.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a') # 選擇賬號密碼登錄 login_account_bnt.click() sleep(2) # 這里需要停頓保證選擇驗證碼已刷新出來# 填寫用戶名和密碼 user = brow.find_element_by_xpath('//*[@id="J-userName"]') user.send_keys('user') pwd = brow.find_element_by_xpath('//*[@id="J-password"]') pwd.send_keys('pwd') brow.save_screenshot('./login.png')# 確定驗證碼圖片區域 verifycode_elem = brow.find_element_by_id('J-loginImg') location = verifycode_elem.location # 驗證碼圖片左上角的坐標 print('location:', location) size = verifycode_elem.size print('size:', size)# 剛開始把location_range寫成了下面這樣,我吐了 # range = ( # int(location['x']) * 1.25, int(location['y']) * 1.25, int((location['x']) + size['width']) * 1.25, # int((location['x']) + size['width']) * 1.25 # ) location_range = (int(location['x']) * 1.25, int(location['y']) * 1.25, int((location['x']) + size['width']) * 1.25,int((location['y']) + size['height']) * 1.25 )# crop根據指定區域進行圖片裁剪 i = Image.open('./login.png') verifycode_img_name = 'verify.png' frame = i.crop(location_range) # 接受一個4元素的元組,分別是左上角坐標和右下角坐標 frame.save(verifycode_img_name)verify_data = verify_text(image_path=verifycode_img_name, type=9004) # verify_text這里的這個函數就是超級鷹識別然后返回結果的函數 print(verify_data)pos = [] # if '|' in verify_data: # 超過一個滿足條件圖片 total_list = verify_data.split('|') for item_list in total_list:# x = int(item.split(',')[0])# y = int(item.split(',')[0])tmp_list = item_list.split(',')for item in tmp_list:val = int(item)pos.append(val)for i in range(len(pos) // 2):x = pos[i*2]y = pos[i*2+1]webdriver.ActionChains(brow).move_to_element_with_offset(verifycode_elem, x, y).click().perform()sleep(0.5)login_btn = brow.find_element_by_id('J-login') login_btn.click()# 加入動作鏈 # div_tag = brow.find_element_by_xpath('//*[@id="nc_1_n1z"]') # # # 對div_tag進行滑動操作 # action = webdriver.ActionChains(brow) # action.click_and_hold(div_tag) # # for i in range(6): # # perform 讓動作鏈立即執行 # action.move_by_offset(20,0).perform() #偏移x20像素,y0像素 # sleep(0.1) # action.release()- 剛開始元組location_range 中右下角的坐標寫錯了,造成截圖偏離,被搞了很長時間。后面更正了,截出來了但還是有些歪,后面查資料發現要讓頁面最大化就行了。
- 有時會出錯說登陸按鈕定位有問題,這個不知道是啥原因。
- 最終有一次識別成功,但后面的滑塊驗證過不了,這個是反爬機制的原因,因為即使最后手動拖動也會提示出錯
總結
以上是生活随笔為你收集整理的selenium模拟登录12306的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序开发里面的profile 是什么意思
- 下一篇: 物联网前景