Python反爬取访问验证处理

news2024/12/23 23:48:11

        最近爬取数据的时候,遇到反爬取限制:即当访问一定次数后会弹出访问验证如下图所示:

 

 这种验证方式没找到绕过去的方法,那就只能用最笨的办法,弹出验证框后,将等待时间延长,然后手动点击验证。代码如下:

# 处理跳页
def jump_page(browser, pageNum):
    # 输入页码
    validate(browser, (By.ID, 'jpage'))
    browser.find_element(By.ID, 'jpage').clear()
    browser.find_element(By.ID, 'jpage').send_keys(pageNum)
    # 点击 go
    validate(browser,(By.XPATH, '//*[@id="jpage"]/following-sibling::input[1]'))
    browser.find_element(By.XPATH, value='//*[@id="jpage"]/following-sibling::input[1]').click()



def validate(browser,locator):
    captcha = None
    try:
        #找到验证框
        captcha = browser.find_element(By.ID, 'captcha')

    except NoSuchElementException as r:
        print("captcha:%s" % (r.msg))
        if captcha:
            # 如果验证框出现了,那就设置等待时间长一些好手动处理
            browser.implicitly_wait(30)
        else:
            browser.implicitly_wait(sleep_s)
    # 设置下一个操作事件的等待时间好手动点击验证(也可以去掉下面两行代码,加上后兼容性会更好一些,因为可能不止一种验证方式,而且要连续多次验证)
    wait = WebDriverWait(browser, 3600)
    wait.until(EC.presence_of_element_located(locator))

def t(pageNum):
    # 实例化chrome配置
    chrome_options = webdriver.ChromeOptions()

    # 设置浏览器默认下载路径
    ## profile.default_content_settings.popups:设置为 0 禁止弹出窗口
    ## download.default_directory:设置下载路径
    diy_prefs = {'profile.default_content_settings.popups': 0,
                 'download.default_directory': 'D:\Download\ChromeDownload'}

    # 添加路径到selenium配置中
    chrome_options.add_experimental_option('prefs', diy_prefs)

    # 实例化chrome浏览器时,添加配置信息
    browser = webdriver.Chrome(options=chrome_options)

    browser.maximize_window()
    browser.get("http://www.ucdrs.superlib.net/")

    # 点击登录
    browser.find_element(By.XPATH, value='// *[ @ id = "h_right"] / a[2]').click()
    # 输入用户名、密码
    browser.find_element(By.ID, 'userName').send_keys(u"188******")
    browser.find_element(By.ID, 'passWord').send_keys(u"z*******05!")
    browser.find_element(By.CLASS_NAME, 'submit').submit()
   
    # 点击书名分类
    # 由于验证框随时会弹出,所以在每个事件操作前都调一下
    validate(browser,(By.ID, 'slt1')) 
    browser.find_element(By.ID, 'slt1').click()
    # 输入关键词
    browser.find_element(By.ID, 'sw').send_keys(u"税")
    browser.find_element(By.NAME, 'Submit').submit()
    # 跳页处理,判断从哪一页开始
    if pageNum:
        jump_page(browser, pageNum)

    flag = True
    while flag:
        wait = WebDriverWait(browser, 3600)
        wait.until(EC.presence_of_element_located((By.ID, "jpage")))

        pageNum = browser.find_element(By.ID, 'jpage').get_attribute("value")

        print("--------当前页码:>" + pageNum + "<开始!------------")
        # 点击全选
        validate(browser,(By.ID, 'sltAll'))
        browser.find_element(By.ID, 'sltAll').click()

        # 点击导出
        validate(browser,(By.XPATH, '//*[@id="doaction"]/a/img'))
        browser.find_element(By.XPATH, value='//*[@id="doaction"]/a/img').click()
        # 点击 选择Excel方式
        validate(browser,(By.XPATH, '/html/body/div/table/tbody/tr/td[1]/ul/li[6]/label/input'))
        browser.find_element(By.XPATH, value='/html/body/div/table/tbody/tr/td[1]/ul/li[6]/label/input').click()
        # 点击输出到本地
        validate(browser,(By.CLASS_NAME, 'printBtn'))
        browser.find_element(By.CLASS_NAME, 'printBtn').click()
        print("--------当前页码:>" + pageNum + "<结束!------------")
        # validate(browser)

        browser.back()
        
        browser.back()
        
        browser.back()

        try:
            # 点击下一页
            validate(browser,(By.XPATH, '//*[@id="jpage"]/preceding-sibling::a[1]'))
            browser.find_element(By.XPATH, value='//*[@id="jpage"]/preceding-sibling::a[1]').click()
        except NoSuchElementException as r:
            print("-" * 15)
            print(r)
            print("=" * 15)
            #如果没有下一页了就退出循环
            flag = False

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构--线索二叉树的概念

数据结构–线索二叉树的概念 二叉树的中序遍历序列 void InOrder(BiTree T) {if (T ! NULL){InOrder(T->lchild); //递归遍历左子树visit(T); //访问根结点InOrder(T->rchild); //递归遍历右子树} }中序遍历序列:D G B E A F C ①如何找到指定结点p在中序遍历序列中的前…

Oracle-奇怪的expdp备份报错LPX-00217

问题背景: 接用户报障&#xff0c;数据库每天晚上正常的expdp备份&#xff0c;从2天前开始出现奇怪的备份报错LPX-00217: invalid character 3 问题分析: 检查expdp备份的日志&#xff0c;从2天前晚上开始的备份均出现LPX-00217: invalid character 3的报错&#xff0c;报错均…

CentOS7在线安装MySQL新手小白教程

1、下载并安装MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm使用上面的命令下载安装用的Yum Repository yum -y install mysql57-community-release-el7-10.noarch.rpm开始安装MySQL服务器 yum -y install …

C++学习 数组

目录 数组 一维数组 数组名 案例&#xff1a;冒泡排序 二维数组 数组名 数组 数组就是一个集合&#xff0c;里面存放了相同类型的数据元素。 下面的数字对应为数组的下标(索引)&#xff0c;可以看到索引范围为0~数组长度-1 特点&#xff1a; 数组中数据元素的数据类型相同。…

github软件包-golang,不同版本的使用--推荐

一、golang中获取github软件包&#xff0c;不同版本&#xff08;V1,V2...&#xff09;的使用&#xff1a; github中如何使用&#xff1a; golang语言使用的github的软件包&#xff0c;有时候不同版本如何切换&#xff0c;特别是有的版本变化比较多&#xff0c;例如在v1中没有…

Go语言程序设计(一)Go语言概述及基础

一、前言 为了尽可能获得最佳的运行性能&#xff0c;Go语言被设计成一门静态编译型的语言&#xff0c;而不是动态解释型的。Go语言的编译速度非常快&#xff0c;明显的要快过其他同类语言&#xff0c;比如C和C。 Go语言的官方编译器被称为gc。 Go语言具有以下几个特点&#x…

(css)盒子的阴影

(css)盒子的阴影 效果&#xff1a; 代码&#xff1a; box-shadow: inset 0 0 50px 2px #74eaff;解决参考&#xff1a;https://blog.csdn.net/weixin_52984349/article/details/125803515

docker部署私有化镜像仓库

为什么要部署私有化&#xff1a; 1.防止镜像因为内存不够被驱逐 2.方便内网服务器复用 部署步骤&#xff1a; docker pull registry // 如果嫌麻烦&#xff0c;也可以去我的资源里面去拿现成的&#xff0c;docker load -i registry.tar 到自己的docker里。"""如…

Django搭建图书管理系统02:创建并配置APP功能模块

&#x1f4c1; 创建APP **Django中的APP&#xff08;应用程序&#xff09;是将功能模块组织在一起的单位&#xff0c;每个APP通常负责处理特定的功能。**开发者可以将不同功能的模块放在不同的app中, 方便代码的复用。app就是项目的基石&#xff0c;因此开发博客的第一步就是创…

[C++] C++11新特性介绍 分析(2): lambda表达式、function包装器、bind()接口

文章目录 [toc] C11**lambda 表达式**lambda 表达式lambda 表达式底层 包装器 functionfunction 包装普通可调用对象function 包装类内成员函数 bind()bind() 使用 及 功能1. 调整参数位置2. 绑定参数 C11 上一篇介绍C11常用的新特性只介绍了一部分. 本篇文章继续分析介绍. l…

Linux简介与安装

文章目录 前言一、Linux简介1.Linux是什么2.学完Linux后能做什么 二、Linux安装1.安装方式介绍2.安装Linux3.网卡设置4.安装SSH连接工具5. Linux目录结构 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&…

括号生成(力扣)递归 JAVA

目录 题目描述&#xff1a;纯递归解法&#xff1a;递归 回溯&#xff1a; 题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a…

《手把手教你》系列基础篇之1-python+ selenium自动化测试-环境搭建(详细)

1.环境搭建 基于python3和selenium3做自动化测试&#xff0c;俗话说&#xff1a;工欲善其事必先利其器&#xff1b;没有金刚钻就不揽那瓷器活&#xff0c;磨刀不误砍柴工&#xff0c;因此你必须会搭建基本的开发环境&#xff0c;掌握python基本的语法和一个IDE来进行开发&…

modelscope魔塔初探--TTS

官网 step1 可以选择指定模型&#xff0c;对于多情感的模型&#xff0c;还可以通过标签实现语气情感 from modelscope.outputs import OutputKeys from modelscope.pipelines import pipeline from modelscope.utils.constant import Taskstext <speak><emotion …

Springboot实现热部署

目录 1、问题阐述 2、实现方式 3、开始配置 3.1在pom.xml中添加依赖 3.2devtools配置 3.3修改IDEA配置 3.4测试一下 1、问题阐述 在实际项目开发过程中&#xff0c;每次修改代码就得将项目重启&#xff0c;重新部署&#xff0c;对于一些大型应用来说&#xff0c;重启时…

特征选择算法 | Matlab实现基于ReliefF特征选择算法的回归数据特征选择 ReliefF

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab实现基于ReliefF特征选择算法的回归数据特征选择 ReliefF 部分源码 %--------------------

五分钟就可以安装MySQL

目录 ⛈️一.什么是MySQL ⛈️二.为什么要使用MySQL ⛈️三.MySQL有什么优点 ⛈️四.官网&#xff1a; ⛈️五.下载 ⛈️六.安装 ⛈️七.查看 ⛈️八.修改密码 一.什么是MySQL MySQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用结…

【Python编程系列】1、Python安装

Python安装 1、下载安装包 官网地址:https://www.python.org/ 进入后,在Downloads菜单下选择python运行的系统环境: 以Windows系统为例,进入后,选择合适的版本下载: 2、安装Python软件包 双击可执行文件exe: 弹出安装窗口后: 我们一般选择"Install Now"的…

Linux 配置dns覆盖默认127.0.0.53

Linux dns默认127.0.0.53&#xff0c;在/etc/resolve.conf中存在 nameserver 127.0.0.53&#xff0c;手动修改无果&#xff0c;每次重启依旧127.0.0.53&#xff0c;因为这是系统生成的文件&#xff0c;resolvectl命令来查dns的配置。 要修改dns&#xff0c;先暂停dns服务&…

6 JSR303校验

6.1 加入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency> 6.2 在实体类上加注解 在实体类上加入Validated注解。并且在属性上方加入Emall(messag…