【注意!!!】
本章主要讲解网络爬虫入门及进阶知识
- 通过多篇文章【文字+案例】的形式系统化进行描述
网络爬虫专栏:https://blog.csdn.net/2201_75422674/category_12686609.html
- 大家喜欢可以订阅一下,不收费用的,有超多个人实战的案例!!
前言:
- 本文章主要是使用简单的js操作以及相关的滑动算法和Selenium的相关操作针实现对“黑马头条”的滑块的自动登录
导航小助手
项目介绍及需求:
1.了解Selenium模拟用户操作的相关语句,如点击、定位元素、滑拉动滑动条以及如何等待组件更新。
2.了解如何截取全屏图片以及滑块登录的背景图片,并了解如何通过全景图片与滑块登录的背景图片相比较获取滑块滑动距离的原理。
3.了解如何使用滑动算法获取将一大段的滑动距离化为一节一节的小段滑动距离,并通过“滑动+等待”的循环操作实现成功登录。
4.了解如何判断是否成功登录,若不成功,则重新获取滑动距离并拉动滑块,否则,则退出Selenium对浏览器发起的请求。
操作实现:
1.通过selenium对目标浏览器进行模拟,并对目标网址发起请求。
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.模拟点击“输入用户名获得验证码”按钮从而获得验证码获取按钮,这里使用显式等待。
# 点击”输入用户名获得验证码框“
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)
- 当获取验证码时,定位验证码背景图片,此时需要获取两张图片:1.背景完整图片 2.不包含滑块但包含缺口图片,此处包含几个步骤。
(1)利用修改样式原理将滑块标签进行修改,此处使用“display:none”在js中表示该标签效果,不显示,获得图片1。
(2)使用driver.get_screenshot_as_file("full.png"),获取整个页面图片。
(3)定位验证码背景图片,使用显示等待获取图片内容(尺寸、左上角坐标)
(4)通过计算可得出右下角的坐标。
(5)此处与别的网站不同的是,这里可以获取验证码背景的完整图片,只要在进行(1)的基础上,将验证码背景完整图片的默认“display:none”改为“display:block”即可将缺口修复,获得图片2。
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.实现结果截屏如下图所示:
注意:若需要源代码,请私信博主哦~
版权归原作者 不像程序员的程序员 所有, 如有侵权,请联系我们删除。