激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - selenium+超級鷹實現模擬登錄12306

selenium+超級鷹實現模擬登錄12306

2021-08-28 00:43派大星.. Python

這篇文章主要介紹了selenium+超級鷹實現模擬登錄12306,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

最近迷上了用selenium去登陸各大網站,別說selenium真挺好用,可以輕松搞定ajax動態加載的網頁,不用很費勁的去抓包查找。咳咳…跑題了,回歸正題。

這次用selenium去登錄12306網站,聽說比較困難。我就去試了試,發現它的驗證碼實在是那啥…就是這樣的。聽頭疼的。

selenium+超級鷹實現模擬登錄12306

我來說說主要的代碼編寫吧。

過程:

用我們的開發者工具定位到輸入賬號和密碼的窗口,找到并send_keys

  1. driver.find_element_by_id('username').send_keys('用戶名')
  2. time.sleep(0.5)
  3. driver.find_element_by_id('password').send_keys('密碼')

然后復雜的過程就來了。我們想要得到驗證碼的圖片。但是頭疼的是,圖片是再變化的。我們請求一次,就變化一次,不像其他普通網站一樣不會變化,直接保存圖片就行了。但是這是12306誒,哪這么輕松。想了想,我決定把整張頁面截屏保存下來,然后對驗證碼區域裁剪下來,就可以保證一致了。

  1. # 將頁面進行截圖并保存
  2. driver.save_screenshot('12306登錄頁面截圖.png')
  3.  
  4. # 確定驗證碼左上角和右下角的坐標
  5. code_img = driver.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
  6. location = code_img.location # 確定驗證碼圖片左上角的坐標
  7. print('location:', location)
  8. size = code_img.size # 確定驗證碼圖片的長和寬
  9. print('size:', size)
  10. rangle = (int(location['x']), int(location['y']), int(location['x']) + int(size['width']),
  11. int(location['y']) + int(size['height']))
  12. print('rangle:', rangle)
  13. i = Image.open('12306頁面截圖.png')
  14. # 對指定區域裁剪
  15. code_pic = i.crop(rangle)
  16. file_name = 'code_pic.png'
  17. code_pic.save(file_name)
  18. time.sleep(2)
  19. print('驗證碼圖片保存成功!!')

我們識別驗證碼用的是超級鷹,具體如何使用可以去查一查。驗證碼有可能需要我們點擊多個,所以通過打碼平臺會得到多個坐標,就比如這種。有兩個日歷,需要點擊兩次,通過超級鷹就會得到兩個坐標。如下圖。我們發現有兩個坐標會有一個“|”,有三個坐標就有兩個“|”,所以我們就把他們split下,讓每個坐標嵌套再一個列表里。此過程代碼如下:

  1. # 識別驗證坐標
  2. chaojiying = Chaojiying_Client('用戶賬號', '密碼', '開發者賬號') # 用戶中心>>軟件ID 生成一個替換 96001
  3. im = open('code_pic.png', 'rb').read() # 本地圖片文件路徑 來替換 a.jpg 有時WIN系統須要//
  4. result = chaojiying.PostPic(im, 9004)['pic_str'] # 1902 驗證碼類型 官方網站>>價格體系 3.4+版 print 后要加()
  5.  
  6. all_list = [] # 存儲被點擊的坐標
  7. if '|' in result:
  8. list1 = result.split('|')
  9. xy_list = []
  10. count1 = len(list1)
  11. for i in list1:
  12. x = int(list1[i].split(',')[0])
  13. xy_list.append(x)
  14. y = int(list1[i].split(',')[1])
  15. xy_list.append(y)
  16. all_list.append(xy_list)
  17. else:
  18. xy_list = []
  19. x = int(result.split(',')[0])
  20. xy_list.append(x)
  21. y = int(result.split(',')[1])
  22. xy_list.append(y)
  23. all_list.append(xy_list)
  24. print(all_list)

selenium+超級鷹實現模擬登錄12306

selenium+超級鷹實現模擬登錄12306

最后嘛,我們得到了驗證碼的坐標,當然就去點擊啦。但是,這個坐標是相對于驗證碼的圖片的坐標,我們必須用ActionChains來移動一下動作鏈的位置。把他移動到驗證碼圖片的location。,然后點擊就ok了。此步驟的代碼如下:

  1. # 循環遍歷點擊圖片
  2. for i in all_list:
  3. x = i[0]
  4. y = i[1]
  5. action = ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform()
  6. time.sleep(1)
  7. driver.find_element_by_id('loginSub').click()

最后來看看全部代碼吧!!

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

  1. #!/usr/bin/env python
  2. # coding:utf-8
  3.  
  4. import requests
  5. from hashlib import md5
  6.  
  7. class Chaojiying_Client(object):
  8.  
  9. def __init__(self, username, password, soft_id):
  10. self.username = username
  11. password = password.encode('utf8')
  12. self.password = md5(password).hexdigest()
  13. self.soft_id = soft_id
  14. self.base_params = {
  15. 'user': self.username,
  16. 'pass2': self.password,
  17. 'softid': self.soft_id,
  18. }
  19. self.headers = {
  20. 'Connection': 'Keep-Alive',
  21. 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
  22. }
  23.  
  24. def PostPic(self, im, codetype):
  25. """
  26. im: 圖片字節
  27. codetype: 題目類型 參考 http://www.chaojiying.com/price.html
  28. """
  29. params = {
  30. 'codetype': codetype,
  31. }
  32. params.update(self.base_params)
  33. files = {'userfile': ('ccc.jpg', im)}
  34. r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
  35. headers=self.headers)
  36. return r.json()
  37.  
  38. def ReportError(self, im_id):
  39. """
  40. im_id:報錯題目的圖片ID
  41. """
  42. params = {
  43. 'id': im_id,
  44. }
  45. params.update(self.base_params)
  46. r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
  47. return r.json()

下面是自己寫的,也就六七十行。

  1. from selenium import webdriver
  2. from chaojiying_Python.chaojiying import Chaojiying_Client
  3. import time
  4. from PIL import Image
  5. from selenium.webdriver import ActionChains
  6. from selenium.webdriver.chrome.options import Options
  7.  
  8. # 實現無可視化界面的操作
  9. # chrome_options = Options()
  10. # chrome_options.add_argument('--headless')
  11. # chrome_options.add_argument('--disable-gpu')
  12. driver = webdriver.Chrome('D:\software\studySoftware\chromedriver_win32\chromedriver.exe')
  13. driver.get('https://kyfw.12306.cn/otn/login/init')
  14. # driver.maximize_window()
  15. time.sleep(1)
  16. driver.find_element_by_id('username').send_keys('用戶名')
  17. time.sleep(0.5)
  18. driver.find_element_by_id('password').send_keys('密碼')
  19. # 將頁面進行截圖并保存
  20. driver.save_screenshot('12306登錄頁面截圖.png')
  21.  
  22. # 確定驗證碼左上角和右下角的坐標
  23. code_img = driver.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
  24. location = code_img.location # 確定驗證碼圖片左上角的坐標
  25. print('location:', location)
  26. size = code_img.size # 確定驗證碼圖片的長和寬
  27. print('size:', size)
  28. rangle = (int(location['x']), int(location['y']), int(location['x']) + int(size['width']),
  29. int(location['y']) + int(size['height']))
  30. print('rangle:', rangle)
  31. i = Image.open('12306頁面截圖.png')
  32. # 對指定區域裁剪
  33. code_pic = i.crop(rangle)
  34. file_name = 'code_pic.png'
  35. code_pic.save(file_name)
  36. time.sleep(2)
  37. print('驗證碼圖片保存成功!!')
  38. # 識別驗證坐標
  39. chaojiying = Chaojiying_Client('用戶賬號', '密碼', '開發者賬號') # 用戶中心>>軟件ID 生成一個替換 96001
  40. im = open('code_pic.png', 'rb').read() # 本地圖片文件路徑 來替換 a.jpg 有時WIN系統須要//
  41. result = chaojiying.PostPic(im, 9004)['pic_str'] # 1902 驗證碼類型 官方網站>>價格體系 3.4+版 print 后要加()
  42.  
  43. all_list = [] # 存儲被點擊的坐標
  44. if '|' in result:
  45. list1 = result.split('|')
  46. xy_list = []
  47. count1 = len(list1)
  48. for i in list1:
  49. x = int(list1[i].split(',')[0])
  50. xy_list.append(x)
  51. y = int(list1[i].split(',')[1])
  52. xy_list.append(y)
  53. all_list.append(xy_list)
  54. else:
  55. xy_list = []
  56. x = int(result.split(',')[0])
  57. xy_list.append(x)
  58. y = int(result.split(',')[1])
  59. xy_list.append(y)
  60. all_list.append(xy_list)
  61. print(all_list)
  62. # 循環遍歷點擊圖片
  63. for i in all_list:
  64. x = i[0]
  65. y = i[1]
  66. action = ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform()
  67. time.sleep(1)
  68. driver.find_element_by_id('loginSub').click()

到此這篇關于selenium+超級鷹實現模擬登錄12306的文章就介紹到這了,更多相關selenium 模擬登錄12306內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_48657881/article/details/113061626

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产在线欧美日韩 | 激情久久免费视频 | www.99热视频| 久操福利视频 | 免费在线观看成年人视频 | 国产亚洲精品久久久久婷婷瑜伽 | 日本68xxxx | 噜噜噜躁狠狠躁狠狠精品视频 | 国产精品久久久久久久久粉嫩 | 99视频有精品 | 媚药按摩痉挛w中文字幕 | 久久久中文 | 全网免费毛片 | 久久精品久久精品国产大片 | 九九热免费精品视频 | 免看黄大片aa | 成人一区二区三区在线 | 一区二区三区欧美在线观看 | 国产精品一品二区三区四区18 | 亚洲最新无码中文字幕久久 | 久国产精品视频 | chengrenyingshi| 国产国语毛片 | 久久资源总站 | 视频一区二区三区免费观看 | 精品xxxx户外露出视频 | 久久精品综合视频 | 久久综合伊人 | 91一区二区在线观看 | 国产色91 | 日韩视频一二区 | 久久精品亚洲成在人线av网址 | 欧美日韩精品一区二区三区不卡 | 亚洲精华液久久含羞草 | h视频免费在线 | 亚洲九草 | 欧美激情视频一区二区免费 | 91系列在线观看 | 久久久精品视频在线观看 | 国产免费看| 久久精品av|