最近都沒啥時間,很久沒更新了。 今天分享一下,如何用selenium識別驗證碼,實現自動登錄以及獲取數據。 目標:某東 話不多說直接開始 準備工作 環境 Python 3.10 Pycharm 模塊使用 import random import time from selenium import w ...
最近都沒啥時間,很久沒更新了。
今天分享一下,如何用selenium識別驗證碼,實現自動登錄以及獲取數據。
目標:某東
話不多說直接開始
準備工作
環境
- Python 3.10
- Pycharm
模塊使用
- import random
- import time
- from selenium import webdriver
- import pyautogui
- import base64
- import ddddocr
- import csv
win + R 輸入cmd 輸入安裝命令 pip install 模塊名 (如果你覺得安裝速度比較慢, 你可以切換國內鏡像源)
selenium: 自動化測試模塊,模擬人的行為去操作瀏覽器 (獲取網頁相關數據內容)
正常瀏覽網站流程
- 打開瀏覽器 訪問網站
- 輸入商品名稱, 回車/點擊搜索
- 輸入賬號密碼
- 瀏覽器商品數據信息 (第一頁)
- 繼續瀏覽下一頁
瀏覽器
- webdriver.Chrome() # 谷歌
- webdriver.Edge() # Edge
- webdriver.Firefox() # 火狐
建議大家用谷歌
打開瀏覽器可能會出現問題
- 報錯大概率原因是因為瀏覽器驅動問題
- 驅動路徑
I. 當你驅動文件和你代碼放在一起 / 你驅動文件在python目錄下麵 (可以不用寫路徑)
II. 給驅動文件路徑
- 驅動版本
瀏覽器可能自動更新 --> 驅動文件版本也要更新
大版本一樣, 小版本最相近的即可 - 打開瀏覽器之後閃退
原因: 你的selenium版本是4.0的 需要加阻塞
運行完成程式之後, 自動結束程式…
代碼展示
獲取數據部分
selenium自動操作瀏覽器
# 打開瀏覽器 driver = webdriver.Chrome() # 谷歌 # 最大化瀏覽器視窗 driver.maximize_window() # 訪問網站 driver.get('https://www.jd.com/')
輸入商品名稱, 回車/點擊搜索按鈕
通過元素定位, 找到搜索框/輸入框, 然後輸入內容
driver.find_element_by_id() 按 ID 查找元素 driver.find_element_by_class_name() 按類名查找元素 driver.find_element_by_css_selector() 通過 CSS 選擇器查找元素 driver.find_element_by_xpath() 通過 XPath 查找元素 driver.find_element_by_id('key').send_keys('口紅') # 輸入關鍵字 driver.find_element_by_class_name('button').click() # 點擊搜索按鈕 # 設置等待元素載入 driver.implicitly_wait(10) # 文章不理解的話,我還專門錄製了視頻講解 # 和源碼一起打包好了,都放在這個摳裙了:708525271
輸入賬號密碼, 登陸
driver.find_element_by_id('loginname').send_keys(account) # 輸入賬號 driver.find_element_by_id('nloginpwd').send_keys(password) # 輸入密碼 driver.find_element_by_id('loginsubmit').click() # 點擊登陸
獲取商品的數據信息
找到商品數據對應標簽位置
- find_element 定位獲取一個
- find_elements 定位獲取多個
執行頁面滾動的操作
def drop_down(): """執行頁面滾動的操作""" # javascript for x in range(1, 12, 2):# 1 3 5 7 9 在你不斷的下拉過程中, 頁面高度也會變的 time.sleep(1) j = x / 9 # 1/9 3/9 5/9 9/9 # document.documentElement.scrollTop 指定滾動條的位置 # document.documentElement.scrollHeight 獲取瀏覽器頁面的最大高度 js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j driver.execute_script(js) #設置等待元素載入過程 driver.implicitly_wait(10) #下滑網頁頁面操作 通過selenium執行JS代碼 drop_down() # 返回列表 lis = driver.find_elements_by_class_name('gl-item') # for迴圈遍歷, 提取列表裡面元素 for li in lis: title = li.find_element_by_css_selector('.p-name em').text price = li.find_element_by_css_selector('.p-price strong i').text commit = li.find_element_by_css_selector('.p-commit strong a').text shop = li.find_element_by_css_selector('.p-shop span a').text dit = { '標題': title, '價格': price, '評價': commit, '店鋪': shop, } print(dit)
驗證碼識別
模塊
from selenium import webdriver import base64 import time import ddddocr import pyautogui import random from password import account, password
模擬登錄
driver = webdriver.Edge(r'D:\自游\京東商品\msedgedriver.exe') driver.get('https://passport.jd.com/new/login.aspx') driver.maximize_window() driver.find_element_by_id('loginname').send_keys(account) # 輸入賬號 driver.find_element_by_id('nloginpwd').send_keys(password) # 輸入密碼 driver.find_element_by_id('loginsubmit').click() # 點擊登陸 time.sleep(1)
獲取驗證碼圖片
# 滑塊 img_base6_1 = driver.find_element_by_css_selector('.JDJRV-smallimg img').get_attribute('src').split(',')[-1] # 缺口 img_base6_2 = driver.find_element_by_css_selector('.JDJRV-bigimg img').get_attribute('src').split(',')[-1] img_content_1 = base64.b64decode(img_base6_1) with open('yzm_1.png', mode='wb') as f: f.write(img_content_1) img_content_2 = base64.b64decode(img_base6_2) with open('yzm_2.png', mode='wb') as f: f.write(img_content_2)
識別驗證碼 滑塊到缺口距離
det = ddddocr.DdddOcr(det=False, ocr=False) res = det.slide_match(img_content_1, img_content_2, simple_target=True) target = res['target'][0] * 0.67
滑動滑塊識別驗證
pyautogui.click(x=1502, y=482, button='left') # 按住滑鼠 pyautogui.dragTo(x=1502+target, y=482, duration=1.5) print(res) # 代碼自取扣裙 708525271
文章不理解的話,我還專門錄製了視頻講解,和源碼一起打包好了,上方自取
今天的分享就到這裡,溜了溜了~