当前位置:   article > 正文

Python爬虫-使用Selenium模拟百度登录_selenium登录百度

selenium登录百度

前言

    前面我已经安装好了Selenium并模拟成功了一下打开百度页面并进行查询,让我这个python初学者信心倍增,今天再来试一试百度登录

正文

把打开百度的代码放到构造方法中

ps:那个文件目录是用于后面滑块验证图片保存的。

  1. def __init__(self):
  2. driver = webdriver.Chrome()
  3. driver.get('https://www.baidu.com/')
  4. driver.maximize_window()
  5. self.page = driver
  6. self.filename = 'G:\\scroll\\'

点击右上角的“登录”按钮,打开登录框,

代码如下:

  1. driver = self.page
  2. driver.find_element(By.ID, 's-top-loginbtn').click()

 效果是这样:

 输入用户名和密码,点击登录

  1. driver.find_element(By.ID, 'TANGRAM__PSP_11__userName').send_keys('用户名')
  2. driver.find_element(By.ID, 'TANGRAM__PSP_11__password').send_keys('密码')
  3. driver.find_element(By.ID, 'TANGRAM__PSP_11__submit').click()

运行之后,竟然出现了一个滑块验证窗口:

 打算用selenium的鼠标事件,模拟拖拽滑块的功能

先获取滑块的id,发现id竟然是动态变化的,后面有个随机变化的数字

没办法,只能使用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元素的宽度,进行移动,代码如下

  1. flybutton = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[2]')
  2. ActionChains(driver).move_to_element(flybutton).perform()
  3. flybutton_div = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[1]')
  4. print(flybutton_div.size['width'], flybutton_div.size['height'])
  5. huakuia = ActionChains(driver)
  6. huakuia.click_and_hold(flybutton).perform()
  7. huakuia.move_by_offset(flybutton_div.size['width'], 0).perform()
  8. huakuia.release()

运行了一下,效果是闪了一下,并没有滑动

思考良久,并查资料后看到一篇设置鼠标移动轨迹的文章,遂获得灵感,可能是移动的太快,被百度反爬工具发现了,于是每次5px循环的移动,

  1. flybutton = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[2]')
  2. ActionChains(driver).move_to_element(flybutton).perform()
  3. flybutton_div = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[1]')
  4. print(flybutton_div.size['width'], flybutton_div.size['height'])
  5. huakuia = ActionChains(driver)
  6. huakuia.click_and_hold(flybutton).perform()
  7. x = flybutton_div.size['width']
  8. i = 0
  9. step = 5
  10. while i < x:
  11. i = i + step
  12. huakuia.move_by_offset(step, 0).perform()
  13. time.sleep(3)
  14. huakuia.release()

效果很好,哈哈~,我设置的移动一次休眠3秒,这个可以调快一些,不然心急的可能就认为没有生效。

 滑动滑块是生效了,可是依然没有登录成功,因为系统要求的是把图片放正,并不是把滑块移动最右边

又进行了大量资料的查询,搜到一篇文章,是用python实现图片方向变换的功能,最关键的是里面实现了计算图片倾斜角度的计算,

地址是:python实现图片歪斜纠正+代码和注释

关键代码如下:

继续进行代码改进

保存图片:

  1. def save_pic(self, file):
  2. pic_url = self.page.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[1]/img').get_attribute('src')
  3. headers = {
  4. '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'
  5. }
  6. res_s = requests.get(pic_url, headers=headers)
  7. data_s = res_s.content
  8. 保存图片
  9. with open(file, 'wb') as f:
  10. f.write(data_s)

获得图片倾斜角度

  1. def get_angle(self, file):
  2. # 读取图像
  3. img = cv2.imread(file)
  4. # 二值化
  5. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  6. # 边缘检测
  7. edges = cv2.Canny(gray, 50, 150, apertureSize=3)
  8. # 霍夫变换,摘自https://blog.csdn.net/feilong_csdn/article/details/81586322
  9. lines = cv2.HoughLines(edges, 1, np.pi / 180, 0)
  10. for rho, theta in lines[0]:
  11. a = np.cos(theta)
  12. b = np.sin(theta)
  13. x0 = a * rho
  14. y0 = b * rho
  15. x1 = int(x0 + 1000 * (-b))
  16. y1 = int(y0 + 1000 * (a))
  17. x2 = int(x0 - 1000 * (-b))
  18. y2 = int(y0 - 1000 * (a))
  19. if x1 == x2 or y1 == y2:
  20. return 0
  21. t = float(y2 - y1) / (x2 - x1)
  22. # 得到角度后
  23. rotate_angle = math.degrees(math.atan(t))

改进后的滑块验证的代码如下:

  1. huakuia = ActionChains(driver)
  2. huakuia.click_and_hold(flybutton).perform()
  3. x = flybutton_div.size['width']
  4. i = 0
  5. step = 5
  6. while i < x:
  7. i = i + step
  8. huakuia.move_by_offset(step, 0).perform()
  9. time.sleep(3)
  10. filepath = self.filename + 'scroll' + str(i) + '.png'
  11. print(filepath)
  12. self.save_pic(filepath)
  13. angle = self.get_angle(filepath)
  14. print('current angle is : %s', angle)
  15. if math.fabs(angle) < 3:
  16. break
  17. print('scroll complete')
  18. huakuia.release()

运行之后,还是没有成功

最后发现计算的图片倾斜角度都是一样的,打开图片保存目录一看,是下面这样的: 

原来相同一个图片,移动滑块旋转后保存的图片都是一样的,就是初始图片的样子, 怪不得失败了。。。

继续查资料,发现selenium有一个截图的功能,于是使用这个截图功能去保存旋转后的图片

  1. img = self.page.find_element(by=By.XPATH, value="/html/body/div[11]/div[1]/div/div[1]")
  2. data_s = img.screenshot(file) # 截取后直接是二进制,无括号

保存图片后发现还是没有旋转前的图片,真是心累。。。。。

先记录在这里,后面再改进吧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/38971
推荐阅读
相关标签
  

闽ICP备14008679号