绕开网站反爬虫原理及实战

news2024/11/29 22:30:00

1.摘要

在本文中,我首先对网站常用的反爬虫和反自动化技术做了一个梳理, 并对可能能够绕过这些反爬技术的开源库chromedp所使用的技术分拆做一个介绍, 最后利用chromedp库对一个测试网站做了爬虫测试, 并利用chromedp库绕开了爬虫限制,成功通过程序自动获取到信息。在测试过程中,顺便对chromedp库经常使用的一些API做了一些调用尝试。

2.反爬虫和反自动化技术手段

网站常见的反爬虫和反自动化技术主要包括:

  • 用户代理检查 - 主要检查User-Agent字符串,如果不是正常浏览器的则拒绝访问。

  • IP限频 - 同一个IP地址访问过于频繁则会被限制或封禁。

  • 缺失字段检测 - 例如使用程序爬取可能会缺失必要的Referer字段,有些网站会检查Referer字段防爬虫。

  • Cookies与会话验证 - 需要验证Cookies或会话信息才能访问。

  • Js执行检测 - 注入各种JavaScript代码检测执行环境。

  • 滑动验证码 - 需要用户滑动验证码才能继续操作。

  • Cloudflare防护 - 使用Cloudflare对访问进行监控和风控。

  • 动态渲染 - 重要内容使用JS动态渲染,不能直接爬取。

  • 监测DOM变化 - 通过MutationObserver监测DOM变化判断是否为自动化程序。

  • 加密和反反编译 - 使用加密、混淆代码防止逆向。

  • 机器学习检测 - 训练模型检测访问行为是否为Bot。

  • 欺骗点击 - 设置假的网页元素迷惑爬虫点击。

  • 验证码识别 - 使用验证码技术防止自动提交。

由于每个网站使用的技术可能是以上技术的一种或多种, 有的甚至是自定义的复杂混合检测逻辑, 因此想要绕过反爬,需要动态调整策略。

3.chromedp开源库介绍

Chromedp是一个用Go语言编写的Chrome DevTools Protocol客户端库,用于通过Chrome DevTools Protocol与Chrome/Chromeium进行交互自动化。

Chromedp开源库地址为: https#github.com/chromedp/chromedp (将#替换为://)

Chromed拥有的能力包括:

  • 网页自动化 - 可以用来编写爬虫,进行网页数据抓取和提取。

  • UI测试 - 可以基于Chromedp对网页应用进行自动化的UI测试。

  • 性能分析 - 利用Chrome的profile和tracing工具做性能分析。

  • 调试支持 - 通过devtools协议调试JavaScript、CSS等。

  • 截屏和PDF - 可以利用headless chrome进行网页截图和生成PDF。

  • 模拟各种用户场景 - 可以模拟不同的用户操作,如:点击、输入、触发事件等。

  • 支持移动端 - 可以测试移动网页应用。

  • 支持扩展开发 - 可以开发Chrome扩展并进行调试。

Chromedp工作模式是首先在后台启动一个Chrome浏览器实例,并可以选择headless(无头)模式。启动后通过Chrome DevTools Protocol

Headless模式是浏览器的一种运行模式,意为"无头"模式。在这种模式下,浏览器不会有可见的界面,但是内核和所有功能都还存在。浏览器后台以命令行的形式运行,通过代码控制模拟执行各种操作。Headless模式主要特征和优势主要包括:
(1).不需要可视化界面,启动时间更快,资源占用更小。
(2).可以在服务器环境无界面运行。
(3).适合用来做自动化测试、爬虫等需要程序化控制浏览器的场景。
(4).测试或爬取的过程不会弹出可见窗口影响使用。
(5).可以方便的集成到持续集成和部署环境中。
(6).支持完整的浏览器功能和兼容性,因为使用的是完整的浏览器内核。
目前流行的Chrome、Firefox、Safari等浏览器都支持Headless模式,在自动化测试和爬虫领域,Headless浏览器已经成为标准工具。

协议与浏览器建立连接, 利用协议中的DOM,Network,Page等域,chromedp可以模拟浏览器的各种行为。例如通过DOM域修改页面DOM;Network域拦截请求;Page域控制页面导航等。当Chrome浏览器接收到chromedp发来的命令后,利用自身浏览器内核(Blink)对页面进行渲染, 渲染后的结果再通过DevTools协议返回给chromedp, chromedp便可以从返回的数据中提取需要的信息, 整个过程与真实用户操作浏览器一致,可以绕过多种反爬手段。同时利用Chrome强大的渲染引擎,可以处理各种复杂页面。

4.使用chromedp测试

我这里通过chromedp解决的问题是一个yml格式的资源, 在chrome浏览器中直接请求该资源可以正常返回内容,如图:

接着我使用Go语言的标准库来请求该URL, Go语言HTTP请求的方式主要有两种:

第一: 直接使用http.Get(url)

从实际的返回中可以发现, 请求目标URL超时了, 报了"dial tcp xxx:443 I/O timeout"错误, 如图:

第二: 使用http.NewRequest和Do()的组合

从实际返回中可以发现,和上面错误一样:

第三: 使用chromedp库测试

使用chromedp库,首先启动一个无头Chrome浏览器实例:

ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()

然后调用方法打开指定的网页:

var content string
err = chromedp.Run(ctx,
    chromedp.Navigate(interfaceUrl),
    chromedp.WaitVisible(`body`, chromedp.ByQuery),
    chromedp.OuterHTML(`html`, &content, chromedp.ByQuery),
)

其中, content变量中保存了爬取后获取的页面内容。

由于获取到的内容格式是一个完整的html页面格式,例如:

<html><body>页面内容</body></html>

因此要获取到页面内容,需要对内容进行提取,以下是我根据返回的具体内容写的提取方法:

idx1 := strings.Index(content, "<body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\">")
idx2 := strings.Index(content, "</body>")
yamlContent := content[idx1+len("<body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\">") : idx2]
var data map[string]interface{}
err = yaml.Unmarshal([]byte(yamlContent), &data)
freeNodes := data["proxies"].([]interface{})

上面的变量yamlContent就是过滤后获取到的真正内容, 然后就可以放心的将该内容反序列化到map,以下是我通过chromedp成功获取到内容的调试界面:

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

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

相关文章

基站/手机是怎么知道信道情况的?

在无线通信系统中&#xff0c;信道的情况对信号的发送起到至关重要的作用&#xff0c;基站和手机根据信道的情况选择合适的资源配置和发送方式进行通信&#xff0c;那么基站或者手机是怎么知道信道的情况呢&#xff1f; 我们先来看生活中的一个例子&#xff0c;从A地发货到B地…

小程序如何设置自动预约快递

小程序通过设置自动预约功能&#xff0c;可以实现自动将订单信息发送给快递公司&#xff0c;快递公司可以自动上门取件。下面具体介绍如何设置。 在小程序管理员后台->配送设置处&#xff0c;选择首选配送公司。为了能够支持自动预约快递&#xff0c;请选择正常的快递公司&…

vue3写nav滚动事件中悬停在顶部

1. 防抖类Animate, 使用requestAnimationFrame代替setTimeout 也可以使用节流函数, lodash有现成的防抖和节流方法 _.debounce防抖 _.throttle节流 export default class Animate {constructor() {this.timer null;}start (fn) > {if (!fn) {throw new Error(需要执行…

力扣:147. 对链表进行插入排序(Python3)

题目&#xff1a; 给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&#xff0c;直到所有元素可以形成一个有序的输出列表。每次迭代中&#xff0c…

解决在Win7下运行一些老游戏花屏或色彩异常问题的方法

有一些喜欢回顾经典老游戏的玩家们&#xff0c;在目前最新的windows7的操作系统下&#xff0c;运行某些游戏会出现花屏&#xff0c;问题的原因是因为win7对这些游戏的DirectDraw不兼容&#xff0c;一种方法是改游戏配置文件&#xff0c;把游戏色彩8bit改成16bit&#xff0c;当然…

安装pytorch报错torch.cuda.is_available()=false的解决方法

参考文章&#xff1a; https://blog.csdn.net/qq_46126258/article/details/112708781 https://blog.csdn.net/Andy_Luke/article/details/122503884 https://blog.csdn.net/anmin8888/article/details/127910084 https://blog.csdn.net/zcs2632008/article/details/127025294 …

为什么Facebook运营需使用IP代理?有哪些美国IP代理好用?

随着互联网的快速发展和全球用户规模的不断增长&#xff0c;Facebook已成为了全球最大的社交媒体平台之一。然而&#xff0c;大批量地运营Facebook账号往往需要借助IP代理这一工具&#xff0c;提高账号的安全性和可靠性&#xff0c;使得运营Facebook更加流畅。那么Facebook为什…

嵌入式到底如何理解呢?

今日话题&#xff0c;嵌入式到底如何理解呢&#xff1f;以我个人的理解&#xff0c;可以用一个客观的比喻来描述&#xff0c;就是将某个系统嵌入到特定的环境中&#xff0c;以实现特定的功能。这个过程包括将现实世界中的人、物的意图和逻辑关系&#xff0c;通过计算和运算的方…

【计算机网络】同源策略及跨域问题

1. 同源策略 同源策略是一套浏览器安全机制&#xff0c;当一个源的文档和脚本&#xff0c;与另一个源的资源进行通信时&#xff0c;同源策略就会对这个通信做出不同程度的限制。 同源策略对 同源资源 放行&#xff0c;对 异源资源 限制。因此限制造成的开发问题&#xff0c;称…

【Acwing170】加成序列(dfs+迭代加深+剪枝)题解和一点感想

本思路来自acwing算法提高课 题目描述 看本文需要准备的知识 1.dfs算法基本思想 2.对剪枝这个词有个简单的认识 迭代加深思想和此题分析 首先&#xff0c;什么是迭代加深呢&#xff1f;当一个问题的解有很大概率出现在递归树很浅的层&#xff0c;但是这个问题的解本身存在…

树结构及其算法-用数组来实现二叉树

目录 树结构及其算法-用数组来实现二叉树 C代码 树结构及其算法-用数组来实现二叉树 使用有序的一维数组来表示二叉树&#xff0c;首先可将此二叉树假想成一棵满二叉树&#xff0c;而且第层具有个节点&#xff0c;按序存放在一维数组中。首先来看看使用一维数组建立二叉树的…

Java使用pdfbox进行pdf和图片之间的转换

简介 pdfbox是Apache开源的一个项目,支持pdf文档操作功能。 官网地址: Apache PDFBox | A Java PDF Library 支持的功能如下图.引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app</artifactId><version>…

这样发布成绩,轻松没烦恼

老师们&#xff0c;你知道怎样公正、便捷发布学生成绩吗&#xff1f;今天我来教给大家一个超级实用的方法&#xff0c;成绩发布简单又轻松&#xff01; 成绩查询系统主要是学校和教师使用。能够实现学生成绩的录入、查询、发布和导出等功能&#xff0c;让老师告别传统操作&…

深入理解元素的高度、行高、行盒和vertical-align

1.块级元素的高度 当没有设置高度时&#xff0c;高度由内容撑开&#xff0c;实际上是由行高撑开&#xff0c;当有多行时&#xff0c;高度为每行的行高高度之和。 行高为什么存在&#xff1f; 因为每行都由一个行盒包裹&#xff0c;行高实际上是行盒的高度。 2.什么是行盒&am…

模糊C均值聚类(FCM)python

目录 一、模糊C均值聚类的原理 二、不使用skfuzzy的python代码 三、 使用skfuzzy的python代码 一、模糊C均值聚类的原理 二、不使用skfuzzy的python代码 import numpy as np import random import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei] plt.r…

记录 vue + vuetify + electron 安装过程

NodeJs 版本&#xff1a; 20 内容来自&#xff1a; Electron Vue.js Vuetify 构建跨平台应用_思月行云的博客-CSDN博客文章浏览阅读61次。Go coding!https://blog.csdn.net/kenkao/article/details/132600542 npm config set registry https://registry.npm.taobao.org np…

Physics2DPlugin3加载后会跳转gsap官网解决

因工作需要使用Physics2DPlugin3库&#xff0c;目标效果 加载他里面的在线js&#xff0c;使用效果正常&#xff0c;但是几秒会跳转官网&#xff0c;我们app内部、浏览器都会这样。 于是研究js代码&#xff0c;发现里面有setTimeout跳转。 删掉就好了 分享我改好的文件&#x…

uniapp原生插件之安卓获取设备唯一标识

插件介绍 安卓获取设备唯一标识&#xff0c;集成了获取imei&#xff0c;获取安卓ID&#xff0c;获取GUID&#xff0c;获取获取OAID/AAID等 插件地址 安卓获取设备唯一标识 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 uniapp 安卓获取设备唯一标…

Unity 粒子特效-第五集-烟雾缭绕合并特效

一、特效预览 二、制作原理 1.素材介绍 我们之前几章做了有光球&#xff0c;星星&#xff0c;烟雾 我们把他们结合起来&#xff0c;做一些调整 2.合并方法 我们还是建一个粒子游戏物体 我们把所有的效果取消 再重置一下transform 现在这个物体就是一个可以控制粒子特效的空…

BUUCTF webshell后门 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 朋友的网站被黑客上传了webshell后门&#xff0c;他把网站打包备份了&#xff0c;你能帮忙找到黑客的webshell在哪吗&#xff1f;(Webshell中的密码(md5)即为答案) 密文&#xff1a; 下载附件&#xff0c;解压得到一…