前言
? ? 前面我已經(jīng)安裝好了Selenium并模擬成功了一下打開百度頁面并進行查詢,讓我這個python初學者信心倍增,今天再來試一試百度登錄
正文
把打開百度的代碼放到構(gòu)造方法中
ps:那個文件目錄是用于后面滑塊驗證圖片保存的。
def __init__(self):
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.maximize_window()
self.page = driver
self.filename = 'G:\\scroll\\'
點擊右上角的“登錄”按鈕,打開登錄框,
代碼如下:
driver = self.page
driver.find_element(By.ID, 's-top-loginbtn').click()
?效果是這樣:
?輸入用戶名和密碼,點擊登錄
driver.find_element(By.ID, 'TANGRAM__PSP_11__userName').send_keys('用戶名')
driver.find_element(By.ID, 'TANGRAM__PSP_11__password').send_keys('密碼')
driver.find_element(By.ID, 'TANGRAM__PSP_11__submit').click()
運行之后,竟然出現(xiàn)了一個滑塊驗證窗口:
?打算用selenium的鼠標事件,模擬拖拽滑塊的功能
先獲取滑塊的id,發(fā)現(xiàn)id竟然是動態(tài)變化的,后面有個隨機變化的數(shù)字
沒辦法,只能使用xpath獲取頁面元素
/html/body/div[11]/div[1]/div/div[2]/div[2]
?再獲取滑塊要滑動的框的xpath
/html/body/div[11]/div[1]/div/div[2]/div[1]
并獲取這個div元素的寬度,進行移動,代碼如下
flybutton = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[2]')
ActionChains(driver).move_to_element(flybutton).perform()
flybutton_div = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[1]')
print(flybutton_div.size['width'], flybutton_div.size['height'])
huakuia = ActionChains(driver)
huakuia.click_and_hold(flybutton).perform()
huakuia.move_by_offset(flybutton_div.size['width'], 0).perform()
huakuia.release()
運行了一下,效果是閃了一下,并沒有滑動
思考良久,并查資料后看到一篇設置鼠標移動軌跡的文章,遂獲得靈感,可能是移動的太快,被百度反爬工具發(fā)現(xiàn)了,于是每次5px循環(huán)的移動,
flybutton = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[2]')
ActionChains(driver).move_to_element(flybutton).perform()
flybutton_div = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[1]')
print(flybutton_div.size['width'], flybutton_div.size['height'])
huakuia = ActionChains(driver)
huakuia.click_and_hold(flybutton).perform()
x = flybutton_div.size['width']
i = 0
step = 5
while i < x:
i = i + step
huakuia.move_by_offset(step, 0).perform()
time.sleep(3)
huakuia.release()
效果很好,哈哈~,我設置的移動一次休眠3秒,這個可以調(diào)快一些,不然心急的可能就認為沒有生效。
?滑動滑塊是生效了,可是依然沒有登錄成功,因為系統(tǒng)要求的是把圖片放正,并不是把滑塊移動最右邊
又進行了大量資料的查詢,搜到一篇文章,是用python實現(xiàn)圖片方向變換的功能,最關鍵的是里面實現(xiàn)了計算圖片傾斜角度的計算,
地址是:python實現(xiàn)圖片歪斜糾正+代碼和注釋
關鍵代碼如下:
繼續(xù)進行代碼改進
保存圖片:
def save_pic(self, file): pic_url = self.page.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[1]/img').get_attribute('src') headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36' } res_s = requests.get(pic_url, headers=headers) data_s = res_s.content 保存圖片 with open(file, 'wb') as f: f.write(data_s)
獲得圖片傾斜角度
def get_angle(self, file): # 讀取圖像 img = cv2.imread(file) # 二值化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 邊緣檢測 edges = cv2.Canny(gray, 50, 150, apertureSize=3) # 霍夫變換,摘自https://blog.csdn.net/feilong_csdn/article/details/81586322 lines = cv2.HoughLines(edges, 1, np.pi / 180, 0) for rho, theta in lines[0]: a = np.cos(theta) b = np.sin(theta) x0 = a * rho y0 = b * rho x1 = int(x0 + 1000 * (-b)) y1 = int(y0 + 1000 * (a)) x2 = int(x0 - 1000 * (-b)) y2 = int(y0 - 1000 * (a)) if x1 == x2 or y1 == y2: return 0 t = float(y2 - y1) / (x2 - x1) # 得到角度后 rotate_angle = math.degrees(math.atan(t))
改進后的滑塊驗證的代碼如下:
huakuia = ActionChains(driver) huakuia.click_and_hold(flybutton).perform() x = flybutton_div.size['width'] i = 0 step = 5 while i < x: i = i + step huakuia.move_by_offset(step, 0).perform() time.sleep(3) filepath = self.filename + 'scroll' + str(i) + '.png' print(filepath) self.save_pic(filepath) angle = self.get_angle(filepath) print('current angle is : %s', angle) if math.fabs(angle) < 3: break print('scroll complete') huakuia.release()
運行之后,還是沒有成功
最后發(fā)現(xiàn)計算的圖片傾斜角度都是一樣的,打開圖片保存目錄一看,是下面這樣的:?
原來相同一個圖片,移動滑塊旋轉(zhuǎn)后保存的圖片都是一樣的,就是初始圖片的樣子,?怪不得失敗了。。。
繼續(xù)查資料,發(fā)現(xiàn)selenium有一個截圖的功能,于是使用這個截圖功能去保存旋轉(zhuǎn)后的圖片
img = self.page.find_element(by=By.XPATH, value="/html/body/div[11]/div[1]/div/div[1]")
data_s = img.screenshot(file) # 截取后直接是二進制,無括號
保存圖片后發(fā)現(xiàn)還是沒有旋轉(zhuǎn)前的圖片,真是心累。。。。。文章來源:http://www.zghlxwxcb.cn/news/detail-456736.html
先記錄在這里,后面再改進吧文章來源地址http://www.zghlxwxcb.cn/news/detail-456736.html
到了這里,關于Python爬蟲-使用Selenium模擬百度登錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!