1.csdn登录
存在多个内部框架,学习使用driver.switch_to.default_content()
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import timedriver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
time.sleep(3)
driver.find_element(By.XPATH,'//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[1]/a').click()
time.sleep(3)
# 弹出小窗口,是内部框架需要切换
driver.switch_to.frame(driver.find_element(By.XPATH,'//*[@id="passportbox"]/iframe'))
driver.find_element(By.XPATH,'/html/body/div/div/div/div[2]/div[2]/div[1]/div[1]/span[4]').click()
time.sleep(3)
# 进行账号密码登录
driver.find_element(By.XPATH,'/html/body/div/div/div/div[2]/div[2]/div/div[2]/div[1]/div[1]/div/input').send_keys("18734256736")
driver.find_element(By.XPATH,'/html/body/div/div/div/div[2]/div[2]/div/div[2]/div[1]/div[2]/div/input').send_keys("123456")
driver.find_element(By.XPATH,'/html/body/div/div/div/div[2]/div[2]/div/div[2]/div[2]/div/i').click()
time.sleep(2)
driver.find_element(By.XPATH,'/html/body/div/div/div/div[2]/div[2]/div/div[2]/div[1]/div[4]/button').click()
time.sleep(10)
# 退出内部框架
driver.switch_to.default_content()
# 存在又一个内部框架
driver.switch_to.frame(driver.find_element(By.XPATH, '//*[@id="csdn-cert-iframe"]'))
time.sleep(3)
driver.find_element(By.XPATH,'//*[@id="app"]/div/div[1]/button').click()
driver.switch_to.default_content()
time.sleep(3)
# 找到悬浮元素
hover_element = driver.find_element(By.XPATH, '//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[1]/a/img')
# 创建 ActionChains 对象并执行悬浮动作
actions = ActionChains(driver)
actions.move_to_element(hover_element).perform()
time.sleep(5)
# 找到悬浮后才出现的元素
hovered_elment = driver.find_element(By.XPATH,'//p[@class="csdn-profile-nickName"]').text
print(hovered_elment)time.sleep(10)
driver.quit()
2.豆瓣滑动验证码
方法一:使用ddddcor实现
import time
import ddddocr
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import random# 初始化Selenium WebDriver
url = 'https://www.douban.com/'
driver = webdriver.Chrome()
driver.get(url)# 登录
driver.switch_to.frame(driver.find_element(By.XPATH, '//*[@id="anony-reg-new"]/div/div[1]/iframe'))
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/ul[1]/li[2]').click()
time.sleep(3)
driver.find_element(By.XPATH, '//*[@id="username"]').send_keys('18356734521')
driver.find_element(By.XPATH, '//*[@id="password"]').send_keys('123456')
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div[5]/a').click()
time.sleep(5)# 处理验证码
# 1.保存背景整个图片
driver.switch_to.frame(driver.find_element(By.XPATH, '//*[@id="tcaptcha_iframe_dy"]'))
time.sleep(3)
yzm_all_img = driver.find_element(By.XPATH, '//*[@id="slideBg"]')
yzm_all_path = 'D:\\yzm_all.png'
yzm_all_img.screenshot(yzm_all_path)# 2.保存缺口滑块小图片
yzm_img1 = driver.find_element(By.XPATH, '//*[@id="tcOperation"]/div[8]')
yzm_img2 = driver.find_element(By.XPATH, '//*[@id="tcOperation"]/div[7]')
s1 = yzm_img1.size
s2 = yzm_img2.size
# print(s1,s2)
if s1['width'] > 100 and s1['height'] < 20:yzm_small_img = yzm_img2
else:yzm_small_img = yzm_img1yzm_small_path = 'D:\\yzm_small.png'
yzm_small_img.screenshot(yzm_small_path)
time.sleep(5)# 3.计算滑动距离
slide = ddddocr.DdddOcr(det=False, ocr=False)with open('D:\\yzm_small.png', 'rb') as f:target_bytes = f.read()with open('D:\\yzm_all.png', 'rb') as f:background_bytes = f.read()res = slide.slide_match(target_bytes, background_bytes, simple_target=True)
print(res)
# 如果无法计算出位置,或者库没有提供相应方法,请根据实际情况自行处理
target_pos = res.get('target')[0] if res else 0# 4.模拟人滑动过程
small_slider = driver.find_element(By.XPATH, '//*[@id="tcOperation"]/div[6]')ActionChains(driver).click_and_hold(small_slider).perform()moved = 0
while moved < target_pos:# 随机滑动步进值,模仿人的滑动习惯step = random.randint(3, 8)if moved + step > target_pos:step = target_pos - movedActionChains(driver).move_by_offset(xoffset=step, yoffset=0).perform()moved += steptime.sleep(random.uniform(0.02, 0.1)) # 模拟不均匀滑动ActionChains(driver).release().perform()print(f"滑动到位置: {moved}")driver.quit()
方法二:使用cv2模块实现
1.首先进行登录
url = 'https://www.douban.com/'
driver = webdriver.Chrome()
driver.get(url)# 登录
driver.switch_to.frame(driver.find_element(By.XPATH, '//*[@id="anony-reg-new"]/div/div[1]/iframe'))
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/ul[1]/li[2]').click()
time.sleep(3)
driver.find_element(By.XPATH, '//*[@id="username"]').send_keys('123456')
driver.find_element(By.XPATH, '//*[@id="password"]').send_keys('123456')
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div[5]/a').click()
time.sleep(5)
2.然后需要进行验证码操作,获取背景图片和滑块缺口图片
yzm_all_img = driver.find_element(By.XPATH, '//div[@class="geetest_item_wrap"]')
yzm_all_path = 'D:/yzm_all.png'
yzm_all_img.screenshot(yzm_all_path)
time.sleep(5)
3. 模拟人鼠标进行滑动
import random
import time# 生成随机滑动轨迹
def generate_track(distance):track = []current = 0mid = distance * 4 / 5t = 0.2v = 0while current < distance:if current < mid:a = 2else:a = -3v0 = vv = v0 + a * tmove = v0 * t + 1 / 2 * a * t * tcurrent += movetrack.append(round(move))return track# 使用 ActionChains 模拟拖动
def simulate_dragging(browser, slider, distance):track = generate_track(distance)action = ActionChains(browser)action.click_and_hold(slider)for x in track:action.move_by_offset(xoffset=x, yoffset=0)action.release().perform()slider = browser.find_element(By.CSS_SELECTOR, '.slider-button')
simulate_dragging(browser, slider, 300)
豆瓣selenium滑动验证码
3.b站点选验证码
方法与豆瓣使用的ddddcor一样类似的方法
1.登录b站
driver = webdriver.Chrome()
driver.get('https://www.bilibili.com/')
driver.find_element(By.XPATH, '//*[@id="i_cecream"]/div[2]/div[1]/div[1]/ul[2]/li[1]/li/div[1]/div/span').click()
time.sleep(5)
driver.find_element(By.XPATH, '/html/body/div[5]/div/div[4]/div[2]/form/div[1]/input').send_keys('123456')
driver.find_element(By.XPATH, '/html/body/div[5]/div/div[4]/div[2]/form/div[3]/input').send_keys('123456')
driver.find_element(By.XPATH, '/html/body/div[5]/div/div[4]/div[2]/div[2]/div[2]').click()
time.sleep(5)
2.保存验证码
# 1. 保存背景整个图片
yzm_all_img = driver.find_element(By.XPATH, '//div[@class="geetest_item_wrap"]')
yzm_all_path = 'D:/yzm_all.png'
yzm_all_img.screenshot(yzm_all_path)
time.sleep(5)
3.使用ddddcor进行验证文字识别
# 2. 使用ddddocr进行文字检测
det = ddddocr.DdddOcr(det=True)
with open("D:/yzm_all.png", 'rb') as f:image = f.read()bboxes = det.detection(image)
print(bboxes)
4.使用selenium模拟鼠标点击
# 4. 获取截图元素的位置和大小
element_location = yzm_all_img.location
element_size = yzm_all_img.size# 获取截图元素的宽高
element_width = element_size['width']
element_height = element_size['height']# 5. 通过 OCR 坐标计算点击位置
# 获取每个矩形框的坐标并计算点击位置(这里以中心点为例)
for bbox in bboxes:x1, y1, x2, y2 = bbox# 计算点击坐标(矩形框的中心点)click_x = element_location['x'] + x1 + (x2 - x1) / 2 # 水平中心click_y = element_location['y'] + y1 + (y2 - y1) / 2 # 垂直中心# 6. 使用 ActionChains 进行点击action = ActionChains(driver)# 将鼠标移动到目标位置并点击action.move_to_element_with_offset(yzm_all_img, click_x, click_y).click().perform()print(f"Clicking at ({click_x}, {click_y})")
b站点选验证码