Python进阶 │反爬虫和怎样反反爬虫

news2024/12/24 21:40:34

爬虫、反爬虫和反反爬虫是网络爬虫工作过程中一直伴随的问题。

在现实生活中,网络爬虫的程序并不像之前介绍的爬取博客那么简单,运行效果不如意者十有八九。首先需要理解一下“反爬虫”这个概念,其实就是“反对爬虫”。根据网络上的定义,网络爬虫为使用任何技术手段批量获取网站信息的一种方式。“反爬虫”就是使用任何技术手段阻止批量获取网站信息的一种方式。

01、为什么会被反爬虫

对于一个经常使用爬虫程序获取网页数据的人来说,遇到网站的“反爬虫”是司空见惯的。

那么,网站为什么要“反爬虫”呢?

第一,网络爬虫浪费网站的流量,也就是浪费钱。爬虫对于一个网站来说并不算是真正用户的流量,而且往往能够不知疲倦地爬取网站,更有甚者,使用分布式的多台机器爬虫,造成网站浏览量增高,浪费网站流量。

第二,数据是每家公司非常宝贵的资源。在大数据时代,数据的价值越来越突出,很多公司都把它作为自己的战略资源。由于数据都是公开在互联网上的,如果竞争对手能够轻易获取数据,并使用这些数据采取针对性的策略,长此以往,就会导致公司竞争力的下降。因此,有实力的大公司便开始利用技术进行反爬虫。反爬虫是指使用任何技术手段阻止别人批量获取自己网站信息的一种方式。

需要注意的是,大家在获取数据时一定要注意遵守相关法律、法规。我们的爬虫教学仅用于学习、研究用途。

02、反爬虫的方式

在网站“反爬虫”的过程中,由于技术能力的差别,因此不同网站对于网络爬虫的限制也是不一样的。在实际的爬虫过程中会遇到各种问题,可以大致将其分成以下 3 类。

(1) 不返回网页,如不返回内容和延迟网页返回时间。

(2) 返回数据非目标网页,如返回错误页、返回空白页和爬取多页时均返回同一页。

(3) 增加获取数据的难度,如登录才可查看和登录时设置验证码。

1、不返回网页

不返回网页是比较传统的反爬虫手段,也就是在爬虫发送请求给相应网站地址后,网站返回 404 页面,表示服务器无法正常提供信息或服务器无法回应;网站也可能长时间不返回数据,这代表对爬虫已经进行了封杀。

首先,网站会通过 IP 访问量反爬虫。因为正常人使用浏览器访问网站的速度是很慢的,不太可能一分钟访问 100 个网页,所以通常网站会对访问进行统计,如果单个 IP 的访问量超过了某个阈值,就会进行封杀或要求输入验证码。

其次,网站会通过 session 访问量反爬虫。session 的意思“会话控制”, session 对象存储特定用户会话所需的属性和配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。如果一个session 的访问量过大,就会进行封杀或要求输入验证码。

此外,网站也会通过 User-Agent 反爬虫。User-Agent 表示浏览器在发送请求时,附带将当前浏览器和当前系统环境的参数发送给服务器,可以在 Chrome 浏览器的审查元素中找到这些参数。图 1 为 Windows 系统使用 Firefox 访问百度首页的请求头。

■ 图 1 百度首页请求头

2、返回数据非目标网页

除了不返回网页外,还有爬虫返回非目标网页,也就是网站会返回假数据,如返回空白页或爬取多页的时候返回同一页。当你的爬虫顺利地运行起来,但不久后,如果你发现爬取的每一页的结果都一样,那么这就是获取了假的网站。

3、获取数据变难

网站也会通过增加获取数据的难度反爬虫,一般要登录才可以查看数据,而且会设置验证码。为了限制爬虫,无论是否是真正的用户,网站都可能会要求你登录并输入验证码才能访问。例如,12306 为了限制自动抢票就采用了严格的验证码功能,需要用户在 8 张图片中选择正确的选项。

03、怎样“反反爬虫”

网站利用“反爬虫”阻止别人批量获取自己的网站信息。但是“道高一尺,魔高一丈”,负责写网站爬虫程序的人又针对网站的“反爬虫”进行了“反反爬虫”,也就是突破网站的“反爬虫”限制,让爬虫程序能够运行下去。

对于如何让爬虫顺利运行,其中心思想是让爬虫程序看起来更像正常用户的浏览行为。正常用户是使用一台计算机的一个浏览器浏览,而且速度比较慢,不会在短时间浏览过多的页面。对于一个爬虫程序而言,就需要让爬虫运行得像正常用户一样。常见的反爬虫的原理有:

检查 User-Agent ;检验访问频率次数,封掉异常 IP ;设置验证码;Ajax 异步加载等。下面介绍相应的对策。

1、修改请求头

为了被反爬虫,可以修改请求头,从而实现顺序获取网页的目的。

如果不修改请求头,header 就会是 python-requests ,例如:

import requests
r = requests get('http://www.baidu.com')
print(r.request.headers)

运行程序,输出如下:

["User - Agent": 'python - requests/2.19.1,'Accept - Encoding':'gzip,deflate',
'Accept':'*/*',
Connection': keep - alive"]

最简单的方法是将请求头改成真正浏览器的格式,例如:

import requests
link = "http://www.baidu.comheaders = ('User - Agent': 'Mozilla/5.0(Windows;U; Windows NT6.1; en - US; rv:1.9.1.6)Gecko/
20230529 Firfox/3.5.6'}
r = requests.get(link,headers = headers)
print(r.request.headers)

运行程序,输出如下:

('User - Agent': 'Mozilla/5.0(Windows;U; Windows NT6.1;en - US;rv:1.9.1.6)
Gecko/20230529.Firfox/3.5.6',Accept-Encoding': 'gzip,deflate','Accept':'*/*Connection': 'keepalive}

由结果可以看到,header 已经变成使用浏览器的 header 。

此外,也可以做一个 User-Agent 的池,并且随机切换 User-Agent 。但是,在实际爬虫中,针对某个 User-Agent 的访问量进行封锁的网站比较少,所以只将 User-Agent 设置为正常的浏览器 User-Agent 就可以了。

除了 User-Agent ,还需要在 header 中写上 Host 和 Referer。

2、修改爬虫访问周期

爬虫访问太密集,一方面对网站的浏览极不友好;另一方面十分容易招致网站的反爬虫。因此,当访问程序时应有适当间隔;爬虫访问间隔相同也会被识别,应该具有随机性。

import time
t1=time.time()
time.sleep(3)
t2=time.time()
total_time=t2-t1
print(total_time)

运行程序,输出如下:

3.0006399154663086

你的结果可能和这个不一样,但是应该约等于 3 秒。也就是说,可以使用 time.sleep (3 )让程序休息 3 秒,括号中间的数字代表秒数。

如果使用一个固定的数字作为时间间隔,就可能使爬虫不太像正常用户的行为,因为真正的用户访问不太可能出现如此精准的秒数间隔。所以还可以用 Python 的 random 库进行随机数设置,代码为:

import time
import random
sleep_time=random.randint(1,5)+random.random()
print(sleep_time)
total=time.sleep(sleep_time)

运行程序,输出如下:

3.361699347950341

你的结果可能和这个不一样,但是应该在 0~5 秒。这里 random.randint ( 0 , 5 )的结果是 0 、1 、 2 、 3 、 4 或 5 ,而 random.random ()是一个 0~1 的随机数。这样获得的时间非常随机,更像真正用户的行为。

3、使用代理

代理(Proxy )是一种网络服务,允许一个网络终端(客户端)与另一个网络终端(服务器)间接连接。形象地说,代理就是网络信息的中转站。代理服务器就像一个大的缓冲,这样能够显著提高浏览速度和效率。可以维护一个代理的 IP 池,从而让爬虫隐藏自己真实的 IP 。虽然有很多代理,但良莠不齐,需要筛选。维护代理 IP 池比较麻烦,而且十分不稳定。以下是使用代理 IP 获取网页的方法:

import requests
link='http://santostang.com'
proxies={'http':'http://xxx.xxx.xxx.xxx'}
resp=requests.get(link,proxies=proxies)

由于代理 IP 很不稳定,这里就不放出代理 IP 的地址了。其实不推荐使用代理 IP 方法,一方面,虽然网络上有很多免费的代理 IP ,但是都很不稳定,可能一两分钟就失效了;另一方面,通过代理 IP 的服务器请求爬取速度很慢。

03、文末送书

《深入理解计算机系统(原书第3版)》 作者:兰德尔 E. 布莱恩特 大卫 R. 奥哈拉伦

《算法导论(原书第3版)》 作者:Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest, Clifford Stein

《数据库系统概念(原书第7版)》 作者:亚伯拉罕·西尔伯沙茨 亨利·科思 S. 苏达尔尚

《计算机网络:自顶向下方法(原书第7版)》 作者:詹姆斯·F. 库罗斯、基思·W. 罗斯

《编译原理(原书第2版)》 作者:Alfred V. Aho, Monica S. Lam 等

《现代操作系统(原书第4版)》 作者:安德鲁 S. 塔嫩鲍姆、赫伯特·博斯

《数据结构与算法分析:C语言描述(原书第2版)典藏版》 作者:马克·艾伦·维斯

《TCP/IP详解》 作者:Kevin R. Fall, W. Richard Stevens, Gary R. Wright

《计算机组成与设计:硬件/软件接口(原书第5版)》 作者:戴维·A. 帕特森 约翰·L. 亨尼斯

《C程序设计语言(第2版·新版)典藏版》 作者:[美]布莱恩· W.克尼汉,丹尼斯· M.里奇

《C++程序设计语言(原书第4版)》 作者:(美)本贾尼·斯特劳斯特鲁普

《设计模式:可复用面向对象软件的基础(典藏版)》 作者:[美] 埃里克·伽玛、 理查德·赫尔姆、 拉尔夫·约翰逊、 约翰·威利斯迪斯

了解更多秒杀神书点击:http://h5.dangdang.com/mix_gys_04001_xs0h

参与方式:文章三连并评论,“按时下班,拒绝内卷!”参与抽奖,48小时后,程序自动抽取6位小伙伴获得技术图书一本【以上图书任选】,欢迎大家积极参与!

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

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

相关文章

PowerShell:因为在此系统上禁止运行脚本,解决方法

运行powershell脚本遇见报错: 无法加载文件 C:\Users\DH\Desktop\cs\rename.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 查了查之后发现是在计算…

差动测试棒如何连接到示波器

差动测试棒提供一个安全的绝缘仪器给示波器使用,它可以转换由高输入的差动电压进入一个低电压并且显示波形在示波器上,使用频率高达100MHz,非常适合大电力测试、研发使用。 差动测试棒输出标是设计在操作示波器1MΩ的输入阻抗的相对衰减量&a…

人工智能学习07--pytorch20--目标检测:COCO数据集介绍+pycocotools简单使用

如:天空 coco包含pascal voc 的所有类别,并且对每个类别的标注目标个数也比pascal voc的多。 一般使用coco数据集预训练好的权重来迁移学习。 如果仅仅针对目标检测object80类而言,有些图片并没有标注信息,或者有错误标注信息。…

需求:js给html添加css

目前发送请求&#xff0c;请求回html&#xff1a;<div class"articleRecommendation_con"> <a href"https://weekly.caixin.com/2023-05-26/102059365.html"><img src"https://img.caixin.com/2023-05-27/168515251870385…

如何选择适合平台的直播美颜SDK:从技术和商业角度考虑

直播美颜SDK作为一种技术解决方案&#xff0c;可以帮助直播应用实现优秀的美颜效果&#xff0c;提高用户体验和粘性。然而&#xff0c;如何选择适合你应用的直播美颜SDK&#xff0c;需要从技术和商业角度综合考虑。本文将从这两个角度出发&#xff0c;为你介绍如何选择适合你应…

手把手带你读vue2文档(基础篇总结)

目录 声明式渲染 v-bind v-if条件与循环 name命名 学会log打印 一些js方法 双向绑定v-model和v-bind 那么请实现一个复选框吧 自定义标签模板 vue2实例 数据与方法 你提到vue有两种数据和方法&#xff0c;js是不是只有一种 vue2自带的实例和方法 vue2$会和jQuery冲…

四站精彩回顾 | Fortinet Accelerate 2023·中国区巡展火热进行中

Fortinet Accelerate 2023中国区巡展 上周&#xff0c;Fortinet Accelerate 2023中国区巡展分别走过青岛、南京、长沙、合肥四站&#xff0c;Fortinet携手太平洋电信、亚马逊云科技、中企通信等云、网、安合作伙伴&#xff0c;与各行业典型代表客户&#xff0c;就网安融合、网…

spring事务管理详解和实例(事务传播机制、事务隔离级别)

目录 1 理解spring事务 2 核心接口 2.1 事务管理器 2.1.1 JDBC事务 2.1.2 Hibernate事务 2.1.3 Java持久化API事务&#xff08;JPA&#xff09; 2.2 基本事务属性的定义 2.2.1 传播行为 2.2.2 隔离级别 2.2.3 只读 2.2.4 事务超时 2.2.5 回滚规则 2.3 事务状态 3…

盘点索引常见的11个知识点

今天来盘点一下关于MySQL索引常见的知识点 本来这篇文章我前两个星期就打算写了&#xff0c;提纲都列好了&#xff0c;但是后面我去追《漫长的季节》这部剧去了&#xff0c;这就花了一个周末的时间&#xff0c;再加上后面一些其它的事&#xff0c;导致没来得及写 不过不要紧&…

chatgpt赋能python:Python中0的输入方法:完整指南

Python中0的输入方法&#xff1a;完整指南 Python是一门强大的编程语言&#xff0c;广泛应用于数据分析、人工智能、网络应用等领域。在Python中&#xff0c;输入0有多种方法&#xff0c;因此本文将带您深入了解Python中0的输入方式&#xff0c;包括基础类型、字符串和列表等结…

【计算机网络】网络安全,HTTP协议,同源策略,cors,jsonp

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 网络安全非对称加密中间人攻击 HTTP协议同源策略corsjsonp 网络安全 非对称加密 会生成一个公…

Arm发布最新内核 : Corte-X4/A720/A520,支持Armv9.2

1、背景 Arm 是一家设计智能手机的CPU内核的公司&#xff0c;并且每年它都会进行新的迭代&#xff0c;这些迭代随后将集成进芯片SOC&#xff0c;例如当年的旗舰 Snapdragon 、 MediaTek Dimensity。2023年&#xff0c;发布了新的旗舰级内核&#xff1a; Cortex-X4 超大核、Cort…

数据集成到可视化分析,轻松驾驭数据洞察力:ETLCloud与帆软BI完美结合

在当今数据驱动的业务环境中&#xff0c;企业需要快速而准确地获取、处理和分析大量的数据。为了满足这一需求&#xff0c;ETLCloud通过和帆软BI的集成提供了一种强大的数据采集和数据分析解决方案&#xff0c;通过可视化的ETL工具和灵活的BI功能&#xff0c;帮助企业快速实现高…

【笔记整理】元学习笔记

【笔记整理】元学习笔记 文章目录 【笔记整理】元学习笔记一、元学习基础概念1、概述&#xff08;“多任务&#xff0c;推理&#xff0c;快速学习”&#xff09;1&#xff09;Meta-learning&#xff08;“学习如何学习” “老千层饼”&#xff09;2&#xff09;Transfer learn…

JDBC查询数据库——普通、流式、游标

问题 通过JDBC对MySQL进行数据查询时&#xff0c;有个很容易踩的坑&#xff0c;以下面代码为例&#xff1a; public static void selectNormal() throws SQLException{Connection connection DriverManager.getConnection("jdbc:mysql://localhost:3306/test", &qu…

【一次调频】考虑储能电池参与一次调频技术经济模型的容量配置方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【IEEE/TOP录用】中科院2区TOP仅3个月录用~

一、【录用案例】 喜提一篇IEEE旗下中科院2区TOP录用&#xff1b; 2023/1/31提交&#xff0c;2023/5/26录用&#xff0c;仅3个月零26天录用&#xff1b; 传感器类SCIE&EI 【IF及分区】IF:4&#xff0c;JCR1/2区&#xff0c;中科院2区&#xff1b; 【检索情况】SCIE&E…

c语言编程练习题:7-42 整除光棍

#include <stdio.h>int main() {int x,s1,n1;scanf("%d",&x);while(s<x){ss*101;n;}while(1) {printf("%d",s/x); if(s%x0) break;s(s%x)*101;n;}printf(" %d",n);return 0; }代码来自&#xff1a;https://yunjinqi.top/article/16…

pdf如何转换成jpg图片?

pdf如何转换成jpg图片&#xff1f;PDF&#xff08;Portable Document Format&#xff09;是一种常见的文件格式&#xff0c;由Adobe Systems创建。与其他文档格式相比&#xff0c;它具有固定页面布局和跨平台兼容性等优点&#xff0c;因此广泛应用于电子书、论文、技术手册、合…

从外包到阿里,这 2 年 5 个月 13 天到底发生了什么?

个人背景&#xff1a; 本人毕业于浙江某二本院校&#xff0c;算是科班出身&#xff0c;毕业后就进了一家外包公司做测试&#xff0c;当然不是阿里的外包&#xff0c;具体什么公司就不透露了&#xff0c;在外包一呆就呆了整整 2 年多&#xff0c;直到现在才从外包离开&#xff…