走近Python爬虫(二):常见反爬虫机制的应对措施

news2025/1/21 20:30:28

文章目录

  • 一、应对—异步加载
    • 1.一般措施
    • 2.Selenium
  • 二、应对—登录验证
    • 1.使用Selenium模拟登录
    • 2.使用Cookies登录
    • 3.使用Session模拟表单登录
  • 三、应对—验证码

本文是Python爬虫系列博客的第二篇,内容概览如下:

在这里插入图片描述

一、应对—异步加载

1.一般措施

  • AJAX技术介绍:

AJAX是Asynchronous JavaScript And XML的首字母缩写,意为异步JavaScript与XML。使用AJAX技术,可以在不刷新网页的情况下更新网页数据。使用AJAX技术的网页,一般会使用HTML编写网页的框架。在打开网页的时候,首先加载的是这个框架。剩下的部分将会在框架加载完成以后再通过JavaScript从后台加载。

网页上面存在的某些文字,在源代码中却不存在的情况,绝大部分都是使用了异步加载技术。

  • 应对思路:
    +++当我们发现某个接口获取数据的前提是向服务器发起GET或POST请求,然后在response中获取网页数据。我们可以使用Python模拟浏览器(使用浏览器的请求头和请求体)发送GET或POST请求。
    +++有一些网页,显示在页面上的内容要经过多次异步请求才能得到。第1个AJAX请求返回的是第2个请求的参数,第2个请求的返回内容又是第3个请求的参数,只有得到了上一个请求里面的有用信息,才能发起下一个请求。像这种情况,解决思路也是通过构造一个又一个的请求来获取最终数据。不过在这个过程中需要有深厚的代码功底,否则难以看懂经过了混淆的源代码。
    +++包括基于异步加载的简单登录,也可以通过这种方式来实现,从而获得相应的通过口令。

2.Selenium

虽然在网页的源代码中无法看到被异步加载的内容,但是在Chrome的开发者工具的“Elements”选项卡下却可以看到网页上的内容,这就说明Chrome开发者工具“Elements”选项卡里面的HTML代码和网页源代码中的HTML代码是不一样的。在开发者工具中,此时显示的内容是已经加载完成的内容。如果能够获得这个被加载的内容,那么就能绕过手动构造的过程,可以直接使用XPath来获得想要的内容。

这种情况下,就需要使用Selenium操作浏览器来解析JavaScript,再爬取被解析以后的代码。

  • 安装:
    pip install selenium

下载ChromeDriver,根据自己的系统选择合适的版本,并安装。

  • 代码:
    可以根据实际情况修改until条件。
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome('./chromedriver')
    
    # 获取页面
    try:
      WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CLASS_NAME, "content")))
    except Exception as _:
      print(’网页加载太慢,不想等了。')
      
	# 查找资源
    print(driver.page_source)
    comment = driver.find_element_by_xpath('//div[@class="content"]')
    print(comment.text)
    comment = driver.find_elements_by_xpath('//p[starts-with(@id, "content_")]')
    for each in comment:
      print(each.text)

二、应对—登录验证

1.使用Selenium模拟登录

优点是简单有效,缺点是它的速度太慢了,不适合用于大规模的爬虫开发。

(1)初始化ChromeDriver。
(2)打开知乎登录页面。
(3)找到用户名的输入框,输入用户名。
(4)找到密码输入框,输入用户名。
(5)手动单击验证码。
(6)按下Enter键。

  • 示例代码:
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    import time
    
    driver = webdriver.Chrome('./chromedriver') #填写你的chromedriver的路径
    driver.get("https://www.zhihu.com/#signin")
    
    elem = driver.find_element_by_name("account") #寻找账号输入框
    elem.clear()
    elem.send_keys("xxx@gmail.com") #输入账号
    password = driver.find_element_by_name('password') #寻找密码输入框
    password.clear()
    password.send_keys("12345678") #输入密码
    
    input(’请在网页上点击倒立的文字,完成以后回到这里按任意键继续。')
    elem.send_keys(Keys.RETURN) #模拟键盘回车键
    
    time.sleep(10)#这里可以直接sleep,也可以等待某个条件出现
    print(driver.page_source)
    
    driver.quit()

2.使用Cookies登录

为了不让用户每次访问网站都进行登录操作,浏览器会在用户第一次登录成功以后放一段加密的信息在Cookies中。下次用户访问,网站先检查Cookies有没有这个加密信息,如果有并且合法,那么就跳过登录操作,直接进入登录后的页面。通过已经登录的Cookies,可以让爬虫绕过登录过程,直接进入登录以后的页面。

使用Cookie来登录网页,不仅可以绕过登录步骤,还可以绕过网站的验证码。

3.使用Session模拟表单登录

因为某些网站的登录过程中涉及到了页面跳转,但是我们却无法感知到中间的某些跳转,因此仅仅是模拟一步GET/POST请求无法实现模拟登陆,可能需要分多步进行。

在这种情况下,使用python requests的Session模块来模拟这个登录。

  • 代码示例:
import requests

login_url='xxx'
login_success='xxxx'

data={
    'username':'111',
    'password':'1111'
}

session=requests.Session()
# step1
session.post(login_url,data=data).text
# step2
after_login=session.get(login_success).text
print(after_login)

三、应对—验证码

对于一次登录就可以长时间使用的情况,只需要识别一次验证码即可。这种情况下,与其花时间开发一个自动识别验证码的程序,不如直接肉眼识别。

  • 借助浏览器肉眼识别:

对于需要输入验证码才能进行登录的网站,可以手动在浏览器登录网站,并通过Chrome获取Cookies,然后使用Cookies来访问网站。这样就可以实现人工输入一次验证码,然后很长时间不再登录。有一些网站的验证码是通过单击或者拖动滑块来验证的。对于这种网站,目前最简单的办法就是使用Cookies来登录,其他方式都不好用。

  • 借助代码Session肉眼识别:

(1)爬虫访问登录页面。
(2)分析网页源代码,获取验证码地址。
(3)下载验证码到本地。
(4)打开验证码,人眼读取内容。
(5)构造POST的数据,填入验证码。
(6)POST提交。

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

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

相关文章

【操作系统】Cygwin和MinGW的区别与联系是怎样的?

Cygwin和MinGW的区别与联系是怎样的? CygwinMinGW两者的区别和联系参考资料 Cygwin和MinGW都是为Windows系统开发者设计的工具。 Cygwin Cygwin, 原Cygnus出品,目前是RedHat名下的项目。项目的目的是提供运行于Windows平台的类Unix环境&…

Linux - 浅析守护进程的概念

Linux下的守护进程是在后台运行的特殊进程,它不与任何终端关联,通常在系统启动时自动启动,运行在后台并且不受用户登录或注销的影响。Linux 下的守护进程通常是以系统管理员的权限运行,用来执行一些系统任务,例如监控硬…

MATLAB R2023b(编程和数学计算软件)

MATLAB R2023b是一款最新版本的编程和数学计算软件,它包含了大量用于算法开发、数据可视化、数据分析、数据模拟以及交互式环境的功能,使得用户能够更加方便灵活地进行科学研究或者工程应用。 MATLAB R2023b相较于之前的版本,增加了一些新的…

同城售后系统退款业务重构心得 | 京东云技术团队

一、重构背景 1.1、退款 到家、小时购、天选退款有2套结构,代码逻辑混乱; 其中小时购、天选部分售后单是和平生pop交互退款,部分是和售后中台交互退款;并且兼容3套逻辑; 痛点:代码繁重,缺乏…

猫头虎博主:Python数据分析,你掌握了吗?

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

自动驾驶的同学看过来:DriveLM:世界首个语言+自动驾驶全栈开源数据集

DriveLM:世界首个语言自动驾驶全栈开源数据集,旨在借助大语言模型和海量自然语言数据集,构筑复杂场景下安全、精准、可解释的自动驾驶系统,突破现有自动驾驶推理能力上限,数据集已开源! DriveLM提供了量化…

多叉树OJ思路 ,无代码

也是第一次写森林树,确实不是很拿捏,受二叉树的影响太多了;你会发现这个多叉树一般不建链式结构的,都是数组式的比如“双亲表示法”,让子节点可以找到父节点这样。 有疑问欢迎交流,作者我也是蒟蒻&#xff…

精进·第2篇:分享一个3-5年战略规划框架思路

首发:麦子禾咨询 作者:石头 前几天,石头分享过一个简单的战略规划框架思路,本篇,石头打算再分享一个相对复杂的3-5年战略规划框架思路。 每种战略规划框架思路,都有其局限性,有些受限于行业属…

MySQL 外连接和内连接的查询优化怎么做?

目录 1. 表连接方式的分类和需要注意的细节 2. 表连接时底层做了什么事? 3. 左外连接优化方案 4. 内连接优化方案 1. 表连接方式的分类和需要注意的细节 多表连接查询,大体上可以分为内连接与外连接。 内连接的意思就是把两个表有关联的部分都取出…

二叉树进阶 - (C++二叉搜索树的实现)

二叉树进阶 - (二叉搜索树的实现) 二叉搜索树1. 二叉搜索树概念2. 二叉搜索树操作2.1 二叉搜索树的查找2.2 二叉搜索树的插入2.3 二叉搜索树的删除(重点) 3. 二叉搜索树的(代码)实现 二叉搜索树 1. 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0…

MySQL是如何优化in子查询的?

目录 前言 一、普通in子查询 二、物化表 三、SQL优化 四、IN语句的优化方式 1. 使用子查询代替IN查询 2. 使用JOIN代替IN查询 3. 使用EXISTS代替IN查询 4. 使用索引优化IN查询 5. 优化查询语句 总结 前言 对于很多的开发小伙伴来说,在MySQL中进行in子查…

Antlr4学习笔记

目录 背景 相关概念 流程说明 入门示例 简易计算器 环境准备 开发 java8方法提取 语法规则 常用的语法要点 设计语法 序列模式 选择模式 词法符号依赖 嵌套模式 总结 参考资料 背景 在阅读shardingjdbc-4.1.1代码时,发现一段sql解析的逻辑&#x…

极智开发 | H100服务器的庐山真面目

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 H100服务器的庐山真面目。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq H100 是英伟达最强显卡,当然其实也…

stable-diffusion 电商领域prompt测评集合

和GhostReivew一个思路,还是从比较好的图片或者是civitai上找一些热门的prompt,从小红书上也找到了不少的prompt,lexica.art上也有不少,主要是为了电商场景的一些测评: 小红书、civitai、Lexica、Liblib.ai、 depth o…

基于GEE云平台一种快速修复Landsat影像条带色差的方法

这是之前关于去除遥感影像条带的另一篇文章,因为出版商推迟了一年发布,所以让大家久等了。这篇文章的主要目的是对Landsat系列卫星因为条带拼接或者镶嵌产生的条带来进行的一种在线修复方式。 原文连接 一种快速修复Landsat影像条带色差的方法 题目&a…

app开发之后需要做什么

在完成app的开发之后,还有一系列的工作需要进行,以确保app的顺利上线和用户的良好体验。下面将从原理和详细介绍两个方面来介绍app开发之后需要做的工作。 一、原理介绍 1. 测试与调试:在app开发完成后,需要进行全面的测试与调试…

防范欺诈GPT

去年,ChatGPT的发布让全世界都感到惊讶和震惊。 突然间出现了一个平台,它比之前的任何其他技术都更深入地了解互联网。人工智能可以被训练成像阿姆一样说唱,以世界著名诗人的风格写作,并精确地翻译内容,以至于它似乎能…

初识Vue 解决vue在启动时生成的提示

让我为大家简单介绍一下吧&#xff01; Vue是一套用于构建用户界面的渐进式javaScript框架 当我们引入vue.js后 <script src"../js/vue.js"></script>我们发现&#xff0c;当我们打开网页时&#xff0c;控制台会出现以下内容 那我们该怎么解决呢&…

思科网络基础

目录 一、特殊的ip地址 1.一些基本概念 2.私有地址 3.子网划分 4.VLSM&#xff08;可变长子网掩码&#xff09; 5.CIDR&#xff08;无类域间路由-超网&#xff09; 二、IP头和一些基本概念 1.ip头 2.mtu 3.免费arp 一、特殊的ip地址 1.一些基本概念 网络位不变&…

卡尔曼家族从零解剖-(04)贝叶斯滤波→细节讨论,逻辑梳理

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解的 卡尔曼家族从零解剖 链接 :卡尔曼家族从零解剖-(00)目录最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/133846882 文末正下方中心提供了本人 联系…