日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用selenium解决12306的登录问题

發布時間:2023/12/20 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用selenium解决12306的登录问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近接觸了一些selenium模塊的相關知識,覺得還挺有意思的,于是決定親自嘗試寫一些爬蟲程序來強化selenium模塊(一定要多嘗試、多動手、多總結)。本文主要使用python爬蟲來模擬登錄鐵路12306官網。這兒得吐槽一句,鐵路12306網站的反爬機制做的還是比較好。特別是12306的驗證碼很是令人很頭疼的事,有時候自己去驗證都不一定能通過。接下來就使用selenium模塊解決驗證碼。

實現過程

首先通過selenium創建一個瀏覽器,并通過向頁面嵌入js代碼去掉webdriver控件(我前面有講過,不懂的大神們可以去看我寫的文章)如果不嵌入js代碼就會被webdriver控件檢測出,不管你怎么滑動滑塊都是失敗的。

# 繞過window.navigator.webdriver控件檢測 option = Options() option.add_experimental_option('excludeSwitches', ['enable-automation']) option.add_argument('--disable-blink-features=AutomationControlled')driver = webdriver.Chrome(options=option) driver.maximize_window()# 切換到賬號密碼登錄窗口 driver.get('https://kyfw.12306.cn/otn/resources/login.html') time.sleep(3) driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click() time.sleep(2)

?嵌入js代碼這樣就不會被12306檢測到是使用selenium自動化登錄了。

我們先解決最難的驗證碼。為了實現自動化登錄我們使用超級鷹打碼平臺。

  • 注冊并登錄超級鷹賬號:點擊鏈接進行注冊https://www.chaojiying.com/user/login/;
  • 點擊購買題分,并進行充值;
  • 點擊軟件id,創建一個軟件Id(程序中會用到);

自動去幫我們去識別驗證碼。

# 初始化超級鷹 chaojiying = Chaojiying_Client('超級鷹賬號', '超級鷹密碼', '軟件ID') # 沒有軟件ID的可以去自己在超級鷹平臺生成# 處理驗證碼 code_img_element = driver.find_element_by_xpath('//*[@id="J-loginImg"]') # 定位到驗證碼的位置 # 用超級鷹去識別驗證碼 dic = chaojiying.PostPic(code_img_element.screenshot_as_png, 9004) # 定位驗證碼并截圖,調用chaojiying里的PostPic類;9004是驗證碼類型 result = dic['pic_str'] # x1,y1|x2,y2;超級鷹返回回來的數據是json格式的 rs_list = result.split("|") for rs in rs_list:p_temp = rs.split(",")x = int(p_temp[0]) # 拿到的是"x"而不是xy = int(p_temp[1])# 要讓鼠標移動到某一個位置,然后進行點擊ActionChains(driver).move_to_element_with_offset(code_img_element, x, y).click().perform() # 提交事件;以element為原點移動鼠標去點擊驗證碼

?驗證碼有可能需要我們點擊多個,所以通過打碼平臺會得到多個坐標,就比如這種,需要點擊兩次,通過超級鷹就會得到兩個坐標。如下圖。我們發現有兩個坐標會有一個“|”,有三個坐標就有兩個“|”,所以我們就把他們split下,讓每個坐標嵌套再一個列表里。我們得到了驗證碼的坐標,下一步就是去點擊驗證碼。但是,這個坐標是相對于驗證碼的圖片的坐標,我們必須用ActionChains來移動一下動作鏈的位置。詳細的輸出過程如下圖

?最最后就是比較簡單的傳輸賬號密碼登錄了

# 輸入用戶名和密碼 driver.find_element_by_xpath('//*[@id="J-userName"]').send_keys('賬號') driver.find_element_by_xpath('//*[@id="J-password"]').send_keys('密碼') # 點擊登錄按鈕 driver.find_element_by_xpath('//*[@id="J-login"]').click() time.sleep(4)# 移動滑塊 btn = driver.find_element_by_xpath('//*[@id="nc_1_n1z"]') ActionChains(driver).drag_and_drop_by_offset(btn, 300, 0).perform() # 拖拽滑塊向右移動300像素

?這個代碼是超級鷹提供的接口。我封裝成一個類了。

#!/usr/bin/env python # coding:utf-8import requests from hashlib import md5class Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword = password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def PostPic(self, im, codetype):"""im: 圖片字節codetype: 題目類型 參考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()def ReportError(self, im_id):"""im_id:報錯題目的圖片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()if __name__ == '__main__':chaojiying = Chaojiying_Client('超級鷹賬號', '超級鷹密碼', '96001') #用戶中心>>軟件ID 生成一個替換 96001im = open('a.jpg', 'rb').read() # 本地圖片文件路徑來替換 a.jpg 有時WIN系統須要//print(chaojiying.PostPic(im, 1902)) # 1902 驗證碼類型 官方網站>>價格體系 3.4+版 print 后要加()

下面是selenium登錄的代碼

from selenium import webdriver import time from chaojiying import Chaojiying_Client from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.chrome.options import Options# 初始化超級鷹 chaojiying = Chaojiying_Client('超級鷹賬號', '超級鷹密碼.', '軟件ID')# 繞過window.navigator.webdriver控件檢測 option = Options() option.add_experimental_option('excludeSwitches', ['enable-automation']) option.add_argument('--disable-blink-features=AutomationControlled')driver = webdriver.Chrome() driver.maximize_window()driver.get('https://kyfw.12306.cn/otn/resources/login.html') time.sleep(3) driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click() time.sleep(2) # 處理驗證碼 code_img_element = driver.find_element_by_xpath('//*[@id="J-loginImg"]') # 用超級鷹去識別驗證碼 dic = chaojiying.PostPic(code_img_element.screenshot_as_png, 9004) result = dic['pic_str'] # x1,y1|x2,y2 rs_list = result.split("|") for rs in rs_list:p_temp = rs.split(",")x = int(p_temp[0]) # 拿到的是"x"而不是xy = int(p_temp[1])# 要讓鼠標移動到某一個位置,然后進行點擊ActionChains(driver).move_to_element_with_offset(code_img_element, x, y).click().perform() # 提交事件# 輸入用戶名和密碼 driver.find_element_by_xpath('//*[@id="J-userName"]').send_keys('12306賬號') driver.find_element_by_xpath('//*[@id="J-password"]').send_keys('12306密碼') # 點擊登錄按鈕 driver.find_element_by_xpath('//*[@id="J-login"]').click() time.sleep(4)# 移動滑塊 btn = driver.find_element_by_xpath('//*[@id="nc_1_n1z"]') ActionChains(driver).drag_and_drop_by_offset(btn, 300, 0).perform()

總結

以上是生活随笔為你收集整理的使用selenium解决12306的登录问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。