做一个网站的总结,定制官网,一流的扬中网站建设,重庆网站推广产品【网络爬虫篇】更多优秀文章借鉴#xff1a; 1. 使用Selenium实现黑马头条滑块自动登录 2. 使用多线程采集爬取豆瓣top250电影榜 3. 使用Scrapy爬取去哪儿网游记数据 4. 数据采集技术综合项目实战1#xff1a;国家水稻网数据采集与分析 5. 数据采集技术综合项目实战2#x… 【网络爬虫篇】更多优秀文章借鉴 1. 使用Selenium实现黑马头条滑块自动登录 2. 使用多线程采集爬取豆瓣top250电影榜 3. 使用Scrapy爬取去哪儿网游记数据 4. 数据采集技术综合项目实战1国家水稻网数据采集与分析 5. 数据采集技术综合项目实战2某东苹果15数据采集与分析 6. 数据采集技术综合案例实战3b站弹幕采集与分析 7. 逆向实战—京东滑块验证码逆向登录) 导航小助手
项目介绍及需求
实现步骤
结果展示 项目介绍及需求
本项目主要是针对“逆向实战—京东滑块验证码逆向登录”。1.通过Selenium与selector、Xpath交互自动化地寻找滑块拼接所需要的元素。2.针对特定元素使用pyautogui模拟鼠标的人为操作。3.当滑块验证码登录成功后将用户的成功登录的cookie保存到本地的txt文件在用户爬取京东相关特定的数据时只需要将记载着用户的cookie的txt文件进行读入即可避免浏览器的用户验证行为。
实现步骤
1. 首先导入相关库解决我们的相关需求
import base64 # 用于处理 Base64 编码的图像。
import cv2 # OpenCV用于图像处理和模式识别这里主要用于识别滑块验证码的位置。
from selenium import webdriver # 从selenium库中引入webdriver模块用于控制浏览器的自动化操作。
from selenium.webdriver.common.by import By # 引入selenium中的By类它提供了查找网页元素的不同策略如通过CSS选择器、ID、类名等。
from selenium.webdriver.support.ui import WebDriverWait # 用于等待页面上的元素出现这在处理动态网页时非常重要。
from selenium.webdriver.support import expected_conditions as EC # 用于检查元素是否出现在DOM中。
import time # 降低访问频率
import pyautogui # 用于模拟鼠标和键盘操作这里用于处理滑块验证码的拖动操作。
2.在自定义的login()函数中使用Selenium的内置参数元素的selector定位滑块验证码的相关元素
driver webdriver.Firefox()
driver.get(https://www.jd.com/)
# 最大化浏览器窗口确保自动化操作不会因为窗口大小问题而失败。
driver.maximize_window()
# driver.execute_script(document.body.style.zoom0.8)
# 在京东主页面找到登录按钮进入登录页面
driver.find_element(byBy.CSS_SELECTOR, value#ttbar-login a.link-login span.style-red).click()# 输入自己的手机号码
driver.find_element(byBy.CSS_SELECTOR, value#loginname).send_keys(xxx)
# 输入自己的密码
driver.find_element(byBy.CSS_SELECTOR, value#nloginpwd).send_keys(xxx)# 定位并点击确认按钮
driver.find_element(byBy.CSS_SELECTOR, value#formlogin div.item.item-fore5).click()# 休息3秒等待滑块验证码的加载
time.sleep(3)
3.在自定义的login()函数中使用一个死循环跳出循环的条件为用户滑块验证成功否则不断重复定位图片、写入图片、查找距离操作。
# 设置循环当滑块验证失败时不断重新获取滑块验证码并再次进行滑动验证while True:try:big driver.find_element(byBy.XPATH, value//div[classJDJRV-bigimg]/img)small driver.find_element(byBy.XPATH, value//div[classJDJRV-smallimg]/img)# 使用get_attribute方法获取背景图像的src属性值并去除前22个字符因为它们通常包含data: image / png;base64, 这样的前缀。big big.get_attribute(src)[22:]small small.get_attribute(src)[22:]# base64.b64decode(big)这个函数用于解码Base64编码的字符串。Base64是一种用于将二进制数据转换为可打印字符的编码方式with open(./pictures/slidepicture.png, modewb) as f:f.write(base64.b64decode(big))with open(./pictures/background.png, modewb) as f:f.write(base64.b64decode(small))# 调用FindPic拖动滑块拼接函数,识别滑块的位置。res FindPic()
4.在自定义的滑块拼接距离FindPic()函数中使用OpenCV中的相关图像匹配方法匹配滑块与滑块背景图片的缺口关系找到一个从滑块左上端到滑块背景最大值和最小值的距离这里我取的是最小值。
def FindPic(target./pictures/slidepicture.png, template./pictures/background.png):# 使用cv2.imread方法读取目标图像并将其转换为灰度图像。# 灰度模式意味着图像只包含亮度信息没有颜色信息因此每个像素点只有一个灰度值。target_rgb cv2.imread(target, 0)print(target_rgb.shape)template_rgb cv2.imread(template,0)执行模板匹配后返回的结果是一个二维浮点数组该数组的大小与输入的目标图像相同但包含的是匹配系数而不是图像像素值。通过分析这个结果图可以找到模板图像在目标图像中的最佳匹配位置。# 使用cv2.matchTemplate方法在目标图像中搜索模板图像使用cv2.TM_CCOEFF_NORMED方法进行匹配。res cv2.matchTemplate(target_rgb, template_rgb, cv2.TM_CCOEFF_NORMED)# 在给定的数组或图像res中找到最小值和最大值及其位置。value cv2.minMaxLoc(res)return value[2][0]
5. 在自定义的login()函数的while循环中计算滑块应该滑动的距离。由于计算滑块需要拖动的距离由于图片的真实宽度为360而展示的图片宽度为242且在我的电脑中屏幕是以125%的显示125/1001.25。所以真实的滑动距离应该为res res * 242 * 1.25 // 360定位小滑块元素。 # 计算滑块需要拖动的距离由于图片的真实宽度为360而展示的图片宽度为242且res res * 242 * 1.25 // 360print(本次应该滑动滑块的距离为, res)
# 使用WebDriverWait和presence_of_element_located等待滑块元素出现并将其保存在slider变量中。slider WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, #JDJRV-wrap-loginsubmit div div div div.JDJRV-img-panel.JDJRV-click-bind-suspend div.JDJRV-img-wrap div.JDJRV-smallimg img)))
6.当然有的小伙伴此时会想为什么不用Selenium自带的模拟滑动操作在经过实验后发现通过Selenium滑动滑块操作是不被京东所认可的结果小伙伴们可以自己实验。
使用Selenium自带的模拟拉动滑块操作1. action ActionChains(driver)2. action.click_and_hold(slider).move_by_offset(res,0).release().perform()
7.获取小滑块在浏览器上的在xy轴的坐标位置并使用pyautogui的相关操作拉动滑块而这里有个问题即认为需要的滑块位置与实际获得的滑块位置。 获取小滑块在网页上的位置lo slider.location# 计算鼠标需要移动到的x坐标位置这里可能涉及到滑块和网页元素的比例和位置关系。x int(lo.get(x)*1.25) 20 # 小滑块在浏览器上的 x 距离y int(lo.get(y)*1.25) 125 # 小滑块在浏览器上的 y 距离 8. 利用pyautogui对小滑块进行滑动“漂移”操作登录成功即将用户cookie写入txt文件。 # 使小滑块进行飘移操作1. duration0.2 指定了鼠标移动到目标位置所需的时间单位是秒。2. 先故意使得小滑块拉过头再慢慢恢复计算出来的距离pyautogui.moveTo(xres15, y6,duration 0.2)pyautogui.moveTo(xres-10, y-3,duration 0.3)pyautogui.moveTo(xres, y, duration 0.3)pyautogui.mouseUp()# 未验证成功休息5秒等待下一次模拟登录time.sleep(5)# 若登录成功则将本次登录成功的用户信息记录于txt文件中except:cookies driver.get_cookies()cookie_string ; .join(f{cookie[name]}{cookie[value]} for cookie in cookies)break
结果展示 由上图信息可见用户自动化登录成功~
注意若需要全部源代码请在后台私信博主~
创作不易请点个赞哦~
还有更多优秀作品在博主主页~