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

目录

      • 一、原文
      • 二、故事前半段背景内容
      • 三、正经的讲点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
在这里插入图片描述

四、故事的收尾

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#中对象的相等性与同一性的判断方法总结

C#对象的相等性与同一性 1. 概述与准备1.1 概述1.2 准备 2. Equals(Object)2.1 功能:2.2 实例:2.3 扩展:2.4 重写此方法 3. Equals(Object, Object)3.1 功能3.2 实例 4. ReferenceEquals(Object, Object)4.1 功能4.2 使用场景:4.3…

突破编程_前端_JS编程实例(自适应表格列宽)

1 开发目标 针对如下的表格组件: 根据表格的各个列字符串宽度动态调整表格列宽: 2 详细需求 本组件目标是提供一个自动调整 HTML 表格列宽的解决方案,通过 JS 实现动态计算并调整表格每列的宽度,以使得表格能够自适应容器宽度&a…

Matlab|配电网智能软开关(sop)规划模型

目录 1 主要内容 目标函数 2 部分程序 3 程序结果 3.1 sop选址定容优化模型 3.2 对比算例(不含sop) 4 下载链接 1 主要内容 该程序参考文献《基于改进灵敏度分析的有源配电网智能软开关优化配置》,采用二阶锥算法,以改进的…

vscode 格式化prettier失败出现一大堆错误

如题,使用vscode开发项目时候,会自动进行格式化【安装prettier插件】 但是有时候会出现格式化失败的情况,如果插件安装正确,则可能是代码出现了格式问题。

使用腾讯云快速搭建WordPress网站流程详解

专栏系列文章: WordPress建站主题美化系列教程https://blog.csdn.net/seeker1994/category_12184577.html 一文搞懂WordPress是什么?为什么用它建站?怎么安装与部署? 初次安装WordPress后如何进行网站设置(主题安装、…

揭秘接口测试:完整流程指南!

在讲接口测试之前,首先需要给大家申明下:接口测试对于测试人员而言,非常非常重要,懂功能测试接口测试,就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试,一般也是面试笔试必问。为方便大家更好的…

Python快速入门系列-2(Python基础语法)

第三章:Python基础语法 3.1 变量与数据类型3.1.1 变量的定义与赋值3.1.2 数据类型3.1.3 类型转换 3.2 注释与缩进3.2.1 注释3.2.2 缩进 3.3 条件语句与循环结构3.3.1 条件语句3.3.2 循环结构 3.4 函数与模块3.4.1 函数3.4.2 参数和返回值3.4.3 模块3.4.4 标准库中的…

基于SSH的点餐服务管理系统的设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 开发工具相关技术 3 1.1 SSH框架 3 1.1.1 Spring 3 1.1.2 Spring MVC 3 1.1.3 Hibernate 4 1.2 前端技术 4 1.2.1 jQuery 5 1.2.2 Bootstrap 5 1.3 数据库技术 5 1.4 本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 系统工作流程 8 2.3 用例…

一学就会 | ChatGPT提示词极简指南-有爱AI实战教程(三)

演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 导读:在使用 ChatGPT 时,当你给的指令越精确,它的回答会越到位,举例来说,假如你要请它帮忙写文案,如…

【Claude 3】一文谈谈Anthropic(Claude) 亚马逊云科技(Bedrock)的因缘际会

文章目录 前言1. Anthropic的诞生2. Anthropic的“代表作”——Claude 3的“三驾马车”3. 亚马逊云科技介绍4. 强大的全托管服务平台——Amazon Bedrock5. 亚马逊云科技(AWS)和Anthropic的联系6. Claude 3模型与Bedrock托管平台的关系7. Clude 3限时体验入口分享【⚠️截止3月1…

【Flink】Apache Flink 常见问题定位指南

Apache Flink 常见问题定位指南 1.问题分析概览1.1 如何分析 Flink 问题 2.常见问题处理2.1 作业自动停止2.2 输出量稳定但不及预期2.3 输出量逐步减少或完全无输出2.4 个别数据缺失2.5 作业频繁重启 3.问题追因技巧3.1 常用工具3.1.1 内存3.1.2 CPU3.1.3 磁盘 I/O3.1.4 网络 I…

187基于matlab的弹道目标跟踪滤波方法

基于matlab的弹道目标跟踪滤波方法,扩展卡尔曼滤波(extended Kalman filter, EKF)、转换测量卡尔曼滤波(conversion measurement Kalman filter, CMKF)跟踪滤波,得到距离、方位角、俯仰角误差结果。程序已调…

qt一个项目只能有一个QMainWindow,其他小窗口只能继承QWidget

我继承QMainWindow,结果就出现奇奇怪怪的现象,我人都疯了 这些接口全他妈不能用 删了换成QWidget就可以用了

ROS2中launch编写及参数含义(xml、python)

ROS2系列文章目录 ROS2中nav_msgs/msg/Path 数据含义及使用 ROS2中std_msgs/msg/Header 数据含义及使用 ROS中TF变换详解 文章目录 ROS2系列文章目录ROS2中launch编写及参数含义(xml、python)一、ROS官方介绍二、实现案例1.编写主函数、CMakeLists.tx…

qt的layoutStretch,非常重要

在几个控件横着布局中,不要指望着这些限制大小的接口能帮你什么 a->setMaximumWidth(); a->setMinimumWidth();我这里有两个控件,设置layoutStretch 1,1

poll开发服务器

int poll(struct pollfd *fds, nfds_t nfds, int timeout); 函数说明:与select类似,委托内核监控可读,可写,异常事件。 函数说明: fds:一个struct pollfd结构体数组的首地址 struct pollfd { …

上门废品回收小程序开发,互联网回收创业模式,稳占回收市场

随着人们生活水平的提高,我国居民产生了大量的废弃物品,这为废品回收行业提供了巨大的市场空间。 当下,废品回收行业成为了不少年轻人讨论的热门话题,吸引了越来越多的企业商家进行到市场中,成为了一个创业的重要行业…

【附教程】2024,人工智能+AI绘画,看这里就够了~14款主流图像生成软件工具总有一个适合你

AI绘画技术通过深度学习和处理海量图像数据,能够迅速将文字描述转化为富有创意和艺术性的画作。这一技术不仅极大地提升了艺术家的创作效率和作品质量,还为他们提供了全新的灵感来源和创作方式,推动了艺术领域的创新与发展。 同时&#xff0…

项目管理【引论一】项目管理的目标和高层次目标

系列文章目录 【引论一】项目管理的目标和高层次目标 一、项目管理的目标 项目管理的目标是在规定的时间内,在批准的预算内,完成事先确定的工作范围内的工作,并且达到预期的质量性能要求。 1.时间、成本和质量之间的关系 1.1时间、成本和…

(C语言)二分查找 超详细

📌 博客主页 爆打维c 目录 一、二分查找的原理 1.优点 2.缺陷 3.原理(核心思想) 4.例题 描述 思路: 一、二分查找的原理 在讲原理之前,先为大家分析一下二分查找的优缺点。 1.优点 如果我们要在数组里面找一个元素的位置…