当前位置: 首页 > news >正文

【DrissionPage爬虫库 1】两种模式分别爬取Gitee开源项目

文章目录

    • DrissionPage爬虫库简介
      • 1. 浏览器操控模式(类似于游戏中的后台模拟鼠标键盘)
      • 2. 数据包收发模式(类似于游戏中的协议封包)
    • 实战中学习
      • 需求:爬取Gitee开源项目的标题与描述
      • 解决方案1:用数据包方式获取
      • 解决方案2:用操控浏览器方式获取

DrissionPage爬虫库简介

DrissionPage爬虫库提供了两种主要模式,分别为:

1. 浏览器操控模式(类似于游戏中的后台模拟鼠标键盘)

优点:

  • 快速实现数据获取需求
  • 相对简单易用

缺点:

  • 执行效率较慢
  • 可能存在不稳定性

2. 数据包收发模式(类似于游戏中的协议封包)

优点:

  • 高效执行
  • 可以绕过浏览器限制,自由获取数据

缺点:

  • 需要耗费较多时间进行逆向分析

你可以单独使用其中一种模式,也可以交替使用两种模式。这正是我对它感兴趣的原因。有时候,我们只是想简单获取一些数据,而不愿花费时间分析数据包。关于如何安装DrissionPage库,这里直接跳过,请查阅作者网站的安装步骤。作者提供了详细的使用文档,但我觉得针对初学者的角度,有必要写一篇自己的学习总结。初学者需要根据自身的知识水平,制定适合自己的学习流程。通过实践,发现不熟悉的地方,再去学习。


实战中学习

需求:爬取Gitee开源项目的标题与描述

在这里插入图片描述

解决方案1:用数据包方式获取

F12分析数据包得出结论:

Get:
https://api.indexea.com/v1/search/widget/wjawvtmm7r5t25ms1u3d?query=1048&q=DrissionPage&from=0&size=20&sort_by_f=
Response:
{"took": 0,"hits": {"total": {"value": 13,"relation": "eq"},"max_score": 185.50804,"hits": [{"_index": 1027,"_id": "9101163","_score": 185.50804,"fields": {"last_push_at": ["2024-05-14 17:08:51"],"license": ["BSD-3-Clause"],"fork": [0],"count.fork": [842],"description": ["基于python的网页自动化工具。既能控制浏览器,也能收发数据包。可兼顾浏览器自动化的便利性和requests的高效率。功能强大,内置无数人性化设计和便捷功能。语法简洁而优雅,代码量少。"],"recomm": [2],"langs": ["Python"],"count.star": [4030],"id": [9101163],"title": ["g1879/DrissionPage"],"url": ["https://gitee.com/g1879/DrissionPage"]}},{"_index": 1027,"_id": "27108495","_score": 7.674755,"fields": {"last_push_at": ["2024-01-08 20:34:25"],"fork": [0],"count.fork": [11],"description": ["DrissionPage的文档"],"recomm": [0],"langs": ["HTML","JavaScript"],"count.star": [12],"id": [27108495],"title": ["g1879/Docs32"],"url": ["https://gitee.com/g1879/Docs32"]}}]},"suggest": {"name": [{"text": "drissionpage","offset": 0,"length": 12,"options": []}]},"cache": 1716708583505,"action": "20240526162838_cdffgkei6kksr7o69ezazp1vgh"
}

返回的 JSON 代码已进行了简化,去除了一些数组成员,但这不会影响我们的分析。由于之前对 Python 中的 JSON 解析语法一无所知,因此需要进行一次关于 JSON 解析的知识弥补,这将为下一篇文章提供基础:如何在 Python 中解析 JSON 数据
直接上代码:

from DrissionPage import SessionPage
import json# 创建页面对象
page = SessionPage()page.get(f'https://api.indexea.com/v1/search/widget/wjawvtmm7r5t25ms1u3d?query=1048&q=DrissionPage&from=0&size=20&sort_by_f=')
data  = page.json
hits = data['hits']['hits']
for hit in hits:if 'title' in hit['fields']:print(hit['fields']['title'][0])if 'description' in hit['fields']:print(hit['fields']['description'][0])print()

解决方案2:用操控浏览器方式获取

代码:

from DrissionPage import WebPage# 创建页面对象
page = WebPage()
# 访问网址
page.get('https://gitee.com/explore')
# 查找文本框元素并输入关键词
page('#q').input('DrissionPage')
# 点击搜索按钮
page('tag:button@class=ui orange button').click()
# 等待页面加载
page.wait.load_start()
# 获取所有行元素
items = page.eles('.card-body')
for item in items:print(item.ele('.title').text)print(item.ele('.col-12 outline text-secondary').text)print()

最烦人的部分是元素的查找、操作和定位等操作,这启发了我写第三篇文章的想法:如何充分利用 DrissionPage 中的元素操控功能

相关文章:

  • 《C++primer》第八章课后习题
  • 黑马聚合的分类及实现
  • 埃及媒体分发投放-新闻媒体通稿发布
  • [数据集][目标检测]红外车辆检测数据集VOC+YOLO格式13979张类别
  • K8s Pod 资源进阶
  • C++课程设计实验杭州电子科技大学ACM题目(上)
  • 跳绳技巧一:蝴蝶步
  • 【NumPy】NumPy线性代数模块详解:掌握numpy.linalg的核心功能
  • Vue 3入门指南
  • adb获取包名和界面名
  • Apifox 更新|编排模式、Markdown 编辑器升级、自动申请 SSL 证书、用户反馈问题优化
  • CSS:transform作用
  • 网络安全防护技术的应用
  • 详解 Scala 的泛型
  • 爬虫视图展示之 Power BI
  • hexo+github搭建个人博客
  • 77. Combinations
  • angular学习第一篇-----环境搭建
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • es6
  • Python 基础起步 (十) 什么叫函数?
  • Python连接Oracle
  • ReactNativeweexDeviceOne对比
  • Zsh 开发指南(第十四篇 文件读写)
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 每天一个设计模式之命令模式
  • 使用Gradle第一次构建Java程序
  • 听说你叫Java(二)–Servlet请求
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • AI算硅基生命吗,为什么?
  • 如何在招聘中考核.NET架构师
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (152)时序收敛--->(02)时序收敛二
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (9)目标检测_SSD的原理
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (六)Flink 窗口计算
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)程序员疫苗:代码注入
  • (状压dp)uva 10817 Headmaster's Headache
  • .Net 4.0并行库实用性演练
  • .net 7 上传文件踩坑
  • .NET Core WebAPI中封装Swagger配置
  • .net core 控制台应用程序读取配置文件app.config
  • .NET/C# 使窗口永不获得焦点
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • :“Failed to access IIS metabase”解决方法
  • [ A*实现 ] C++,矩阵地图
  • [ SNOI 2013 ] Quare
  • [145] 二叉树的后序遍历 js
  • [AIGC] Spring Interceptor 拦截器详解
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [CF482B]Interesting Array