一个爬虫自动化数据采集的故事~

news2025/6/11 7:49:56

目录

      • 一、原文
      • 二、故事前半段背景内容
      • 三、正经的讲点DrissionPage知识
      • 四、故事的收尾

一、原文

  • 原文来自一个爬虫自动化数据采集的故事~ , 建议点击链接看文章末尾的视频
  • 笔者不擅长自动化,一个小小故事分享给大家,仅个人观点

二、故事前半段背景内容

以下文章来自,网友小时投稿,仅供十一姐使用

有时候她幻想自己会幽默点,会成为一个小说家,一个会讲故事的人…

所以那天,她奋笔疾书,用尽她不太多的词汇脑洞写下如下的内容…

hello, 大家好,我是十一姐,今天和大家分享一个在爬虫圈里,被不少人安利的自动化库Drissionpage,它可以通过控制浏览器跟网页进行交互爬取数据,它的官方使用文档https://g1879.gitee.io/drissionpagedocs/get_start/installation

在这里插入图片描述
相信绝大多数使用爬虫获取数据的人,他们一贯的方式可能都是直接找数据接口,然后模拟接口请求向服务器发送数据包,最终获得想要的数据
在这里插入图片描述
但这也让他们面临着更大的挑战,比如他们时常会遇到各种反爬,如加密/混淆/vmp/反调试/验证码/风控/封ip账号等等,甚至等爬虫人破解完了,后面还有无限的人机风控等着他,封账号/封ip/封指纹, 它到底在哪里埋了蜜罐,哪里设置了陷阱,能够如此精准的识别"我不是个人" (ps: 这里的“我”指的是爬虫代码脚本程序)
在这里插入图片描述
举个例子,他们会遇到各种丧心病狂反人类的验证码反爬如果“我”是个人,“我”都不敢相信“我”这个人可能会选择点击正确,当然,说得有点夸张了,使用这些比较反人类的验证码的网站还是比较少的,实际上大多数网站的验证码还是比较考虑“真实的人”感受的
在这里插入图片描述
所以当那些加密算法破解越来越耗时/风控越来越强时,爬虫人的头发似乎可能也开始日渐稀疏时......
在这里插入图片描述
他的眼神开始越来越空洞,不知何时是头,不知何时能破,要一周吗,NoNo,要一个月吗,NoNoNo,到底要多久呀,到底什么才是头呀,这就反爬对爬虫的折磨
在这里插入图片描述
于是向天呐喊,有没有大佬指点指点帮助帮助呀…请赐我一个所谓的逆向大神吧, 然而现实中,神面对众多繁星的愿望,虽有心而力不足,他也很无奈,神也有自己想忙的事情
在这里插入图片描述
所以,与其继续坚持逆向下去,有时候妥协放弃也是一种勇气,但倔强的我,舍不得,难道之前的努力就白费了吗,就这么隐藏入尘埃了吗,爬虫人儿势必要给反爬点颜色瞧瞧,哪怕是蚊子痛也行
在这里插入图片描述
于是,为了短时间的拿到了少量的数据用来应急入库,那个曾经被爬虫一部分人嗤之以鼻的最朴素的方法,并且认为速度太慢的自动化,而现在又回去求”怀抱“, 慢慢爬也未尝不可,真香永不过时
在这里插入图片描述
接下来我们要提一提,爬虫程序曾“临幸过”哪些第三方自动化爬取的库/项目,截图来自网站https://spiderbox.cn/, 比如sekiro、jsrpc,大家熟悉的selenium/undetected_selenium/puppeteer , 以及后来大家非常喜欢的playwright 等等
在这里插入图片描述
有个伟人讲过,不管黑猫白猫,能抓住老鼠的都是好猫
在这里插入图片描述
所以工具不再乎多,只要能用就是好猫,我本身并不擅长自动化,但是在爬虫圈圈里大家都在提drissionpage,可以过国外反爬"五秒盾cloudflare / shape /Google 等人机检测工具"时, 不得不说它此刻确实有点无敌强大
在这里插入图片描述
毕竟之前用过的很多老版的自动化会被反爬检测特征指纹什么的,于是作者也感慨到,或许是幸运,大厂们还没意识到”我DrissionPage“的出现,所以还未曾对我实施监控,未曾对我痛下杀手
在这里插入图片描述
当然,那只是浅浅的感慨,可能之所以不被检测到,是因为DrissionPage的底层基于cdp协议(Chrome DevTools Protocol),以下是懒神推荐读的cdp代码 https://chromedevtools.github.io/devtools-protocol/
在这里插入图片描述
然后据挖哥科普DrissionPage底层源码,如图通过命令chrome.exe --remote-debugging-port=9222 远程调试托管浏览器的源码,这意味着使用dp可以打开我们日常使用的浏览器,继承它已存在的登陆cookie信息/插件信息等
在这里插入图片描述

三、正经的讲点DrissionPage知识

初次如何使用DrissionPage(大家简称dp),先通过pip install DrissionPage --upgrade安装,然后再复制执行如下代码,这里我使用的是xpath语法定位元素
在这里插入图片描述
1、如下代码,可以操控浏览器打开一个网页,获取html源码/文本/属性值

from DrissionPage import ChromiumOptions, ChromiumPage

co = ChromiumOptions().use_system_user_path()
print("page1要控制的浏览器地址", co.address)
print("page1浏览器默认可执行文件的路径", co.browser_path)
print("page1用户数据文件夹路径", co.user_data_path)
print("page1用户配置文件夹名称", co.user, "\n")
page = ChromiumPage(co)

page.get('http://g1879.gitee.io/DrissionPageDocs', retry=3, interval=2, timeout=15)
print(f">>>>>>>>>>>>>>>>>>>>>>>>\n当前对象控制的页面地址和端口: {page.address}\n浏览器进程id: {page.process_id}\n标签页id: {page.tab_id}")
print(">>>>>>>>>>>>>>>>>>>>>>>>\n当前概述html", page.ele('x://*[@id="️-概述"]').html)
print(">>>>>>>>>>>>>>>>>>>>>>>>\n当前版本信息text", page.ele('x://p[contains(text(),"最新版本")]').text)
print(">>>>>>>>>>>>>>>>>>>>>>>>\ngit链接属性值", page.ele('x://p[contains(text(),"项目地址")]/a').attr('href'))

# page.quit()  退出浏览器

2、如下代码,可以像network/fiddler那样实现数据抓包,获得请求头/响应头/响应文本等

from DrissionPage import ChromiumPage, ChromiumOptions

co = ChromiumOptions().set_paths(browser_path=r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe")
page = ChromiumPage(co)
# 开始监听,指定获取包含该文本的数据包
page.listen.start('detail?nodeId=')  # 默认不启动正则匹配,这里代表url包含该字符串,启动正则匹配需要配置 is_regex=True
page.get('https://ygp.gdzwfw.gov.cn/#/44/new/jygg/v3/A?noticeId=dc240acc-d8a3-48ab-b16a-bad2e64a1ff7&projectCode=E4401000002400710001&bizCode=3C51&siteCode=440100&publishDate=20240302000028&source=%E5%B9%BF%E4%BA%A4%E6%98%93%E6%95%B0%E5%AD%97%E4%BA%A4%E6%98%93%E5%B9%B3%E5%8F%B0&titleDetails=%E5%B7%A5%E7%A8%8B%E5%BB%BA%E8%AE%BE&classify=A02&nodeId=1762040444150657029')  # 访问网址
data_packet = page.listen.wait()
print(">>>>本标签页id与框架id    ", data_packet.tab_id, data_packet.frameId)
print(">>>>数据包请求网址    ", data_packet.method, data_packet.url)
print(">>>>响应文本    ", data_packet.response.body,  data_packet.response.raw_body)
print(">>>>响应头    ", data_packet.response.headers)
print(">>>>请求头信息    ", data_packet.request.headers)
for key, value in data_packet.request.headers.items():
    print(f"\t【name】 {key} 【value】 {value}")
print(">>>>请求头表单信息    ", data_packet.request.postData)
print(">>>>连接失败信息    ", data_packet.fail_info.errorText)

3、如下代码,可以启动两个互不相干的全新的浏览器,auto_port会生成随机的端口和临时用户文件夹

from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.auto_port(True)
page1 = ChromiumPage(co)
print("page1要控制的浏览器地址", co.address)
print("page1浏览器默认可执行文件的路径", co.browser_path)
print("page1用户数据文件夹路径", co.user_data_path)
print("page1用户配置文件夹名称", co.user, "\n")
page2 = ChromiumPage(co)
print("page2要控制的浏览器地址", co.address)
print("page2浏览器默认可执行文件的路径", co.browser_path)
print("page2用户数据文件夹路径", co.user_data_path)
print("page2用户配置文件夹名称", co.user)
# 每个页面对象控制一个浏览器
page1.get('https://www.baidu.com')
page2.get('http://www.163.com')

4、当然,你也可以指定固定的端口和用户目录,来创建两个全新的浏览器

from DrissionPage import ChromiumPage, ChromiumOptions

# 创建多个配置对象,每个指定不同的端口号和用户文件夹路径
do1 = ChromiumOptions().set_paths(local_port=9111, user_data_path=r'D:\data1')
do2 = ChromiumOptions().set_paths(local_port=9223, user_data_path=r'D:\data2')

# 创建多个页面对象
page1 = ChromiumPage(addr_or_opts=do1)
print("page1要控制的浏览器地址", do1.address)
print("page1浏览器默认可执行文件的路径", do1.browser_path)
print("page1用户数据文件夹路径", do1.user_data_path)
print("page1用户配置文件夹名称", do1.user, "\n")
page2 = ChromiumPage(addr_or_opts=do2)
print("page2要控制的浏览器地址", do2.address)
print("page2浏览器默认可执行文件的路径", do2.browser_path)
print("page2用户数据文件夹路径", do2.user_data_path)
print("page2用户配置文件夹名称", do2.user)
# 每个页面对象控制一个浏览器
page1.get('https://www.baidu.com')
page2.get('http://www.163.com')

5、如果你要多线程并发的开不同的标签页/浏览器等,page.get_tab()是获取当前标签页对象, 而page.new_tab()是打开另一个标签页,直接看作者提供的官方源码案例 , https://g1879.gitee.io/drissionpagedocs/demos/actual/multithread
在这里插入图片描述
6、在作者的官方文档里面提供了更多的实战案例,大家可以多多试试,比如可以携带插件自动切换代理,可以执行js脚本,可以截图,录像等 , https://g1879.gitee.io/drissionpagedocs/demos/functions/new_browser
在这里插入图片描述

四、故事的收尾

  • 文章的末尾
    在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【C++】c++入门之递归上 数值类

文章目录 前言一、 递归1.1 基本概念1.2 递归的过程1.3 使用场景 二、例题讲解问题一:1002 - 编程求解123...n问题二:1241 - 角谷猜想问题三:1108 - 正整数N转换成一个二进制数问题四:1088 - 求两个数M和N的最大公约数 三、练习问…

【扩散模型系列3】DiT开源项目

文章目录 DiT原始项目Fast-DiT readmeSamplingTraining训练之前的准备训练DiTPyTorch 训练结果改进训练效果 Evaluation (FID, Inception Score, etc.) 总结 DiT原始项目 该项目仅针对DiT训练,并未包含VAE 的训练 项目地址 论文主页 Fast-DiT readme 该项目仅针…

【毕业】 医药药店销售管理系统

1、引言 设计结课作业,课程设计无处下手,网页要求的总数量太多?没有合适的模板?数据库,java,python,vue,html作业复杂工程量过大?毕设毫无头绪等等一系列问题。你想要解决的问题&am…

OpenJDK 目前主要发展方向

Loom:得赶紧解决 synchronized pin 线程的问题(据说 Java 23 会解决,现在有预览版)。各个 Java 库需要改造原来使用 ThreadLocal 的方式:如果是为了穿参数,则可以使用 ScopedLocal;如果是对象池…

【leetcode热题】寻找旋转排序数组中的最小值 II

难度: 困难通过率: 38.7%题目链接:. - 力扣(LeetCode) 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的…

激光打标机红光与激光不重合:原因及解决方案

激光打标机红光和激光不在一个位置的问题可能由多种原因导致。以下是一些可能的原因和解决方法: 1. 激光器光路调整不当:激光器光路调整不当会导致激光束偏移,从而使红光与激光不重合。解决方法是重新调整激光器的光路,确保激光束…

Session登陆实践

Session登陆实践 Session登录是一种常见的Web应用程序身份验证和状态管理机制。当用户成功登录到应用程序时,服务器会为其创建一个会话(session),并在会话中存储有关用户的信息。这样,用户在与应用程序交互的整个会话…

C语言逗号运算符(,)

在C语言中,逗号运算符(,)用于在表达式中分隔多个子表达式,并按照从左到右的顺序依次计算这些子表达式。逗号运算符的运算结果是最后一个子表达式的值。 逗号运算符的底层行为是依次计算每个子表达式,并将每个子表达式…

SSM框架,MyBatis-Plus的学习(下)

条件构造器 使用MyBatis-Plus的条件构造器,可以构建灵活高效的查询条件,可以通过链式调用来组合多个条件。 条件构造器的继承结构 Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装&#xf…

广度优先搜索和深度优先搜索

广度优先搜索 广度优先搜索(Breadth-First-Search,BFS)类似于二叉树的层序遍历算法(借助队列),其基本思想是:首先访问起始顶点,接着由v出发,依次访问v的各个未访问过的邻…

git命令行提交——github

1. 克隆仓库至本地 git clone 右键paste(github仓库地址) cd 仓库路径(进入到仓库内部准备提交文件等操作) 2. 查看main分支 git branch(列出本地仓库中的所有分支) 3. 创建新分支(可省…

纪年哥的文物挽救木牌

左(江南制造局,曾国藩书天道酬勤,李鸿章少荃印,光绪三十四年制造) 中(汉阳兵工厂,民国二十六年制造,公元1937年七月七日,抗日战争全面爆发) 右(…

linux、windows 动态库与静态库的实现

动态库与静态库的实现 在使用keil的时候遇到这样一个事情,我调用了一个函数,只有函数声明,但是我想查看函数的实现却不行,为什么会这样,这不来了嘛, 我们在使用printf函数等,都是加上头文件直接调用&…

HarmonyOS NEXT应用开发案例——列表编辑实现

介绍 本示例介绍用过使用ListItem组件属性swipeAction实现列表左滑编辑效果的功能。 该场景多用于待办事项管理、文件管理、备忘录的记录管理等。 效果图预览 使用说明: 点击添加按钮,选择需要添加的待办事项。长按待办事项,点击删除后&am…

考研408 2014年第41题(二叉树带权路径长度【WPL】)

function.h(结构体)&#xff1a; // // Created by legion on 2024/3/5. //#ifndef INC_14_4_TREE_FUNCTION_H #define INC_14_4_TREE_FUNCTION_H #include <stdio.h> #include <stdlib.h>typedef int BiElemType; typedef struct BiTNode{BiElemType weight;//直…

【Python】Python Astar算法生成最短路径GPS轨迹

简介 最短路径问题是计算机科学中一个经典问题&#xff0c;它涉及找到图中两点之间距离最短的路徑。在实际应用中&#xff0c;最短路径算法用于解决广泛的问题&#xff0c;例如导航、物流和网络优化。 步骤 1&#xff1a;加载道路网络数据 要计算最短路径&#xff0c;我们需…

【Python】装饰器函数

专栏文章索引&#xff1a;Python 原文章&#xff1a;装饰器函数基础_装饰函数-CSDN博客 目录 1. 学习装饰器的基础 2.最简单的装饰器 3.闭包函数装饰器 4.装饰器将传入的函数中的值大写 5. 装饰器的好处 6. 多个装饰器的执行顺序 7. 装饰器传递参数 8. 结语 1. 学习装饰…

【UE5】创建蓝图

创建GamePlay需要的相关蓝图 项目资源文末百度网盘自取 在 内容游览器 文件夹中创建文件夹&#xff0c;命名为 Blueprints &#xff0c;用来放这个项目的所有蓝图(Blueprint) 在 Blueprints 文件夹下新建文件夹 GamePlay ,用存放GamePlay相关蓝图 在 Blueprints 文件夹下创建文…

Java17 --- SpringCloud初始项目创建

目录 一、cloud项目创建 1.1、项目编码规范 1.2、注解生效激活 1.3、导入父工程maven的pom依赖 二、创建子工程并导入相关pom依赖 2.1、相关配置文件 2.1.1、数据库配置文件内容 2.1.2、自动生成文件配置内容 三、创建微服务8001子工程 3.1、导入相关pom依赖 3.…

利用IDEA创建Java项目使用Servlet工具

【文件】-【项目结构】 【模块】-【依赖】-【】-【JAR】 找到Tomcat的安装路径打开【lib】找到【servlet.jar】点击【确定】 勾选上jar,然后【应用】-【确定】 此时新建文件可以发现多了一个Servlet&#xff0c;我们点击会自动创建一个继承好的Servlet类