【网络爬虫篇】使用Selenium实现黑马头条滑块自动登陆

前言:本文章主要是使用简单的js操作以及相关的滑动算法和Selenium的相关操作针实现对“黑马头条”的滑块的自动登录

更多优秀文章借鉴:

1. 使用Selenium实现黑马头条滑块自动登录

2. 使用多线程采集爬取豆瓣top250电影榜

3. 使用Scrapy爬取去哪儿网游记数据 

4. 数据采集技术综合项目实战1:国家水稻网数据采集与分析

5. 数据采集技术综合项目实战2:某东苹果15数据采集与分析

6. 数据采集技术综合案例实战3:b站弹幕采集与分析

导航小助手

1. 项目介绍及需求:

2. 操作实现:


项目介绍及需求:

1.了解Selenium模拟用户操作的相关语句,如点击、定位元素、滑拉动滑动条以及如何等待组件更新。

2.了解如何截取全屏图片以及滑块登录的背景图片,并了解如何通过全景图片与滑块登录的背景图片相比较获取滑块滑动距离的原理。

3.了解如何使用滑动算法获取将一大段的滑动距离化为一节一节的小段滑动距离,并通过“滑动+等待”的循环操作实现成功登录。

4.了解如何判断是否成功登录,若不成功,则重新获取滑动距离并拉动滑块,否则,则退出Selenium对浏览器发起的请求。

操作实现:

1.通过selenium对目标浏览器进行模拟,并对目标网址发起请求。

cd9983f8fc8646cca4dba33b77cf9b68.png

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from PIL import Image
from selenium. WebDriver import ActionChains
import time
import numpy as np
driver = webdriver.Firefox()
driver.maximize_window()

# 笔记本默认显示可能不为100%,而是125%或者150%,使用此语句可将其恢复至100%
driver.execute_script('document.body.style.zoom="0.8"')
driver.get("http://mis-toutiao-python.itheima.net/#/")

# 隐式等待10秒,等待所有的组件刷新
driver.implicitly_wait(10)

2.模拟点击“输入用户名获得验证码”按钮从而获得验证码获取按钮,这里使用显式等待。

8ebf044e6a2042daaf57ee5c638ca0ad.png

# 点击”输入用户名获得验证码框“
btn1 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.yzm_btn')))
btn1.click()
time.sleep(2)

3.模拟点击“获取验证码”按钮从而获得验证码,这里使用显式等待。

# 点击验证码弹出框,获得验证码
btn2 = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '.geetest_radar_tip_content')))
btn2.click()
time.sleep(2)

4. 当获取验证码时,定位验证码背景图片,此时需要获取两张图片:1.背景完整图片 2.不包含滑块但包含缺口图片,此处包含几个步骤。

(1)利用修改样式原理将滑块标签进行修改,此处使用“display:none”在js中表示该标签效果,不显示,获得图片1。

(2)使用driver.get_screenshot_as_file("full.png"),获取整个页面图片。

(3)定位验证码背景图片,使用显示等待获取图片内容(尺寸、左上角坐标)

(4)通过计算可得出右下角的坐标。

(5)此处与别的网站不同的是,这里可以获取验证码背景的完整图片,只要在进行(1)的基础上,将验证码背景完整图片的默认“display:none”改为“display:block”即可将缺口修复,获得图片2。

6e398a9cd27645548fd6689c20d540e5.png

d6b0efcdf5a54b24ac898c67113034d5.png

5.将获取到的两张图片使用其像素(rgb)进行对比,因为一张图片的rgb分别由3个信息量表示,分别是rgb[0]、rgb[1]、rgb[2],只要将两张图片的rgb[n],n=1、2、3进行分别计算,设置一个误差量,不在误差范围内的点可视为阴影部分(即为图片背景最左边到图片缺口左边的极限距离)。

def compare_rgb(image1,image2,x,y):
    pixel1 = image1.load()[x,y]
    pixel2 = image2.load()[x,y]
    # 设置误差
    threashold=30
    # abs()函数用于返回一个数的绝对值。如果输入是一个整数或浮点数,则返回该数的绝对值;如果输入是一个复数,则返回该复数的模
    if abs(pixel1[0]-pixel2[0]) < threashold and abs(pixel1[1]-pixel2[1]) < threashold and threashold and abs(pixel1[2]-pixel2[2]) < threashold :
        return True
    # 若不在误差范围内,则表示此处为阴影(缺口)处
    else:
        return False

6.使用js的缓慢滑动函数获得滑动距离以及Selenium自带的拖动滑块功能,这里要设置相关暂停时间,否则很容易被浏览器识别爬虫,导致失败。

def get_len():
    a=0
    image1 = Image.open('verify_code1.png')
    image2 = Image.open('verify_code2.png')
    for i in range(image1.size[0]):
        for j in range(image1.size[1]):
            if not compare_rgb(image1,image2,i,j):
                # 当
                a=a+1
                if a>=30:
                    return i

7.最后定位验证码左下角的刷新元素并点击查看是否成功,若不成功,则表示实现自动滑块验证码登录成功;否则,重新滑动即步骤6。

#检查刷新按钮函数
def check_button():
    try:
        btn3 = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'html body div#app div.main_wrap form.login_form input#inp1.input_sub')))
        if btn3.is_enabled():
            btn3.click()
            driver.quit()
            return True
    except:
        return False

8.实现结果截屏如下图所示:

21d72c60e0534a1dacc2b3b653af034b.png

注意:若需要源代码,请私信博主哦~

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值