DrissionPage爬虫包实战分享

news2025/7/27 13:36:41

一、爬虫

1.1 爬虫解释

爬虫简单的说就是模拟人的浏览器行为,简单的爬虫是request请求网页信息,然后对html数据进行解析得到自己需要的数据信息保存在本地。

1.2 爬虫的思路

# 1.发送请求

# 2.获取数据

# 3.解析数据

# 4.保存数据

1.3 爬虫工具

DrissionPage的个人空间-DrissionPage个人主页-哔哩哔哩视频

DrissionPage® 是一个基于 Python 的网页自动化工具。

既能控制浏览器,也能收发数据包,还能把两者合而为一。

可兼顾浏览器自动化的便利性和 requests 的高效率。

功能强大,语法简洁优雅,代码量少,对新手友好。

可以参考官网视频学习基本概念。

二、爬虫实战

2.1 爬虫需求

对首页 - 人民法院案例库的4884条法律案件信息进行csv保存。

2.2 爬虫效果

爬虫后的效果图:

2.3 爬虫实现过程

2.3.1 环境配置

最好先再本地安装好anaconda,然后创建虚拟环境和安装这个包。如何安装anaconda可以参考我之前的博客手把手教你使用云服务器和部署相关环境!!!-CSDN博客

conda create -n pachong python=3.10.16 -y

conda activate pachong

pip install DrissionPage==4.1.0.18

DrissionPage       4.1.0.18

python  3.10.16

2.3.2 学习DrissionPage的基本操作

设置好DrissionPage的默认浏览器启动路径,找到自己的chrome浏览器或者edge浏览器,得到路径,注意是需要.exe的执行文件路径,运行下面的代码就设置好了浏览器的启动环境。

from DrissionPage import ChromiumOptions

path = r'C:\Program Files\Google\Chrome\Application\Chrome.exe'  # 请改为你电脑内Chrome可执行文件路径

ChromiumOptions().set_browser_path(path).save()

 实例化浏览器对象和关闭浏览器对象操作

# 浏览器对象,标签页对象,页面元素对象

from DrissionPage import Chromium

# 链接浏览器

browser = Chromium()

browser.set.retry_interval(5)# 设置重试间隔

tab = browser.latest_tab

# 关闭浏览器

browser.quit()

 标签页的相关函数

# 浏览器对象,标签页对象,页面元素对象

from DrissionPage import Chromium

# 链接浏览器

browser = Chromium()

browser.set.retry_interval(5)# 设置重试间隔

tab = browser.latest_tab

tab.get('http://DrissionPage.cn') # 使用标签页访问url函数

tab2 = browser.new_tab("http://www.baidu.com") # 新建标签页函数

tab3 = browser.get_tab(title="DrissionPage") # 访问标签页函数

# 关闭标签页对象

tab.close()

# 标签页的后退前进与刷新

tab.back(2) # 后退2次

tab.forward(1) # 前进

tab.refresh() # 刷新

# 关闭浏览器

browser.quit()

 html元素对象的相关函数,元素可以使用Xpath语法进行定位

from DrissionPage import Chromium

# 链接浏览器

browser = Chromium()

browser.set.retry_interval(5)# 设置重试间隔

tab = browser.latest_tab

tab.get('http://DrissionPage.cn')

# 获取页面元素

# tab对象中直接查找

ele = tab.ele('使用文档') # 获取文本中包含“使用文档”的元素

ele.check() # 点击元素

# 相对位置查找

ele2 = ele.next() # 获取ele的下一个兄弟元素

ele2.click() # 点击元素

# 关闭浏览器

# browser.quit()

 一个实例

from DrissionPage import Chromium

# 链接浏览器

browser = Chromium()

browser.set.retry_interval(5)# 设置重试间隔

tab2 = browser.new_tab("http://www.baidu.com")

# 定位一个元素,输入按钮 , x表示xpath语法

input_btn = tab2.ele('x://*[@id="kw"]')

print(input_btn.html)

# 输入搜索内容

input_btn.input("python")

# 定位一个搜索按钮

search_btn = tab2.ele('x://*[@id="su"]')

search_btn.click()

2.3.3 获取目标网页的数据

2.3.3.1 抓包分析得到数据,需要先监听标识符

按F12进入开发者模式,刷新页面,再network中可以搜索相关的数据包

比如我们搜索,蒋某华猥亵儿童案。只有一个搜索结果,headers是前端请求后端的信息,preview是请求结果的预览信息,response是请求结果的详细信息。我们对数据抓包主要是看这三部分信息。

 我们再preview中可以看到数据包中的['data']['datas']刚好有这页的10个案件信息,我们对这个信息中抽取我们需要的信息再保存再本地就行。

 我们此时监听的是:蒋某华猥亵儿童案,虽然也可以用,但是我们一般选择监听请求头的信息,一般是“?”前面的https(如果有的话),复制一下,检索一下看一下是不是唯一值。

2.3.3.2 html元素定位xpath得到html元素,得到数据

DrissionPage非常好的功能是通过xpath语法定位到html元素,就可以使用元素.text 、元素.html等获得相关数据,定位元素过程,F12打开开发者工具,最左边的定位标识符选择你想定位的网页元素,比如我定位的是下一页的按钮元素,得到位置后,右键选择copy,XPath,然后按ctrl+f进行搜索模式,就可以看到你的这个XPath语法定位的元素再当前标签页中有几个了。

2..3.4 爬取全部信息

我们平时怎么操作浏览器,就怎么写代码。

思路: 打开浏览器,新建标签页,搜索目标url,通过监听唯一的标识符:“https://rmfyalk.court.gov.cn/cpws_al_api/api/cpwsAl/search”得到当前页面的10个案件的数据包,对数据包列表的每个数据进行抽取我们需要的信息,再保存到csv表格中。下滑,点击下一页,重复上述操作。

from DrissionPage import Chromium

from pprint import pprint

import csv

# 打来浏览器

tab = Chromium().latest_tab

# 监听数据包

tab.listen.start("https://rmfyalk.court.gov.cn/cpws_al_api/api/cpwsAl/search")

# 访问页面

url = "https://rmfyalk.court.gov.cn/view/list.html?key=case_sort_id_cpwsAl&keyName=%25E6%25A1%2588%25E4%25BB%25B6%25E7%25B1%25BB%25E5%259E%258B&value=05&valueName=%25E6%2589%25A7%25E8%25A1%258C&isAdvSearch=2"

tab.get(url)

f = open(r'E:\gdzd_hb\pachoong\zhixing.csv', 'w', encoding='utf-8', newline='')

# 字典写入方法

csv_writer = csv.DictWriter(f, fieldnames=['案件名称', '案件标签', '裁判要旨'])

# 写入表头

csv_writer.writeheader()

for page in range(1, 208):

    print(f'正在爬取第{page}页')

    # 等待数据包加载

    resp = tab.listen.wait()

    # 获取响应数据-->json

    json_data = resp.response.body

    # # 打印数据

    # print(json_data)

    # print(type(json_data))

    # 遍历jobInfo列表

    jobList = json_data['data']['datas']

    for job in jobList:

        pprint(job) # 打印字典格式

        break # 打印一个结束

    # 抽取需要的数据

    for job in jobList:

        dit = {

            '案件名称': job['cpws_al_title'],

            '案件标签': job['cpws_al_infos'],

            '裁判要旨': job['cpws_al_cpyz']

        }

        pprint(dit)

        # 字典写入数据

        csv_writer.writerow(dit)

    # 下滑到最底部

    tab.scroll.to_bottom()

    # 点击下一页

    tab.ele('css:.page-next').click()

三、问题和小结 

进阶需求:爬取每个案件的对应的详细PDF信息。

方法一:通过点击每个案件,进去后再点击下载PDF的案件到指定文件夹中实现。

存在问题:网站做了限制,每个账号下载了20个左右的PDF,就会显示下面的报错,就算是人工手动下载PDF文件也是一样的。

方法二:通过获取每个案件的详情url地址,使用元素来获取相关信息,用字典保存,再保存到csv文件中。

存在的问题:网站做了限制,我们一个账号连续访问40个左右的案件详情网页后,就会显示空的网页,从而无法获得html元素。

 这两个问题我暂时没有解决办法,因为DrissionPage已经是模拟人的行为进行抓包了,但是网站对每个账号进行了限制。

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

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

相关文章

iptables实战案例

目录 一、实验拓扑 二、网络规划 三、实验要求 四、环境准备 1.firewall (1)配置防火墙各大网卡IP并禁用 firewall和selinux (2)打开firewall路由转发 2.PC1(内网) (1)配置防…

Google AI 模式下的SEO革命:生成式搜索优化(GEO)与未来营销策略

一、搜索范式转变:从链接引导到答案交付 Google自2023年起逐步推出AI搜索功能,经历了SGE(Search Generative Experience)和Gemini阶段,最终在2025年全面上线了「AI Mode」搜索模式。与此同时,也保留了一种过…

SpringBoot中缓存@Cacheable出错

SpringBoot中使用Cacheable: 错误代码&#xff1a; Cacheable(value "FrontAdvertiseVOList", keyGenerator "cacheKey") Override public List<FrontAdvertiseVO> getFrontAdvertiseVOList(Integer count) {return this.list(Wrappers.<Adve…

iOS UIActivityViewController 组头处理

0x00 情形一 - (void)shareAction1 {// 当前 View 转成图片UIImage *image [self snapshotImage:self.view];NSArray *activityItems [image];UIActivityViewController *activityVC [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationAc…

《TCP/IP 详解 卷1:协议》第3章:链路层

以太网和IEEE802局域网/城域网标准 IEEE802局域网/城域网标准 IEEE 802 是一组由 IEEE&#xff08;电气与电子工程师协会&#xff09;定义的局域网和城域网通信标准系列&#xff0c;涵盖了从物理层到链路层的多个网络技术。其中&#xff1a; IEEE 802.3 定义的是传统的以太网…

Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程(二)

package com.test.xulk.es.entity.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.test.xulk.es.entity.Hotel;public interface HotelMapper extends BaseMapper<Hotel> { }集成Springboot 项目里面 官方地址&#xff1a; Elasticsearch …

数据库管理-第333期 Oracle 23ai:RAC打补丁完全不用停机(20250604)

数据库管理333期 2025-06-04 数据库管理-第333期 Oracle 23ai&#xff1a;RAC打补丁完全不用停机&#xff08;20250604&#xff09;1 概念2 要求3 操作流程4 转移失败处理总结 数据库管理-第333期 Oracle 23ai&#xff1a;RAC打补丁完全不用停机&#xff08;20250604&#xff0…

【DAY39】图像数据与显存

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点&#xff1a; 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0…

AI代码库问答引擎Folda-Scan

简介 什么是 Folda-Scan &#xff1f; Folda-Scan 是一款革命性的智能项目问答工具&#xff0c; 完全在浏览器中本地运行 。它使用高级语义矢量化将您的代码库转变为对话伙伴&#xff0c;使代码理解和 AI 协作变得前所未有的简单和安全。其采用尖端的 Web 技术和 AI 算法构建&…

Kafka深度技术解析:架构、原理与最佳实践

一、 消息队列的本质价值与核心特性 1.1 分布式系统的“解耦器” 异步通信模型 代码列表 graph LRA[生产者] -->|异步推送| B[(消息队列)]B -->|按需拉取| C[消费者1]B -->|按需拉取| D[消费者2] 生产者发送后立即返回&#xff0c;消费者以自己的节奏处理消息。典…

基于cnn的通用图像分类项目

背景 项目上需要做一个图像分类的工程。本人希望这么一个工程可以帮助学习ai的新同学快速把代码跑起来&#xff0c;快速将自己的数据集投入到实战中&#xff01; 代码仓库地址&#xff1a;imageClassifier: 图片分类器 数据处理 自己准备的分类图像&#xff0c;按照文件夹分…

Linux环境管道通信介绍

目录 前言 一、通信的本质 二、匿名管道 1.通信资源——文件缓冲区 2.为什么叫匿名管道&#xff1f; ​编辑 3.匿名管道的创建过程 4.pipe函数 小结 5.一些问题 1&#xff09;匿名管道为什么要求父子进程将原本的读/写权限只保留一个 2&#xff09;为什么一开始父进程要以读/写…

DIC技术助力金属管材全场应变测量:高效解决方案

在石油管道、汽车排气系统、航空航天液压管路等工业场景中&#xff0c;金属管作为关键承力部件&#xff0c;其拉伸性能&#xff08;如弹性极限、颈缩行为、断裂韧性&#xff09;直接影响结构安全性和使用寿命。 实际应用中&#xff0c;选用合适的管材非常重要&#xff0c;通过…

嵌入式学习--江协stm32day1

失踪人口回归了&#xff0c;stm32的学习比起51要慢一些&#xff0c;因为涉及插线&#xff0c;可能存在漏插&#xff0c;不牢固等问题。 相对于51直接对寄存器的设置&#xff0c;stm32因为是32位修改起来比较麻烦&#xff0c;江协课程是基于标准库的&#xff0c;是对封装函数进…

湖北理元理律师事务所:债务化解中的心理重建与法律护航

专业法律顾问视角 一、债务危机的双重属性&#xff1a;法律问题与心理困境 在对173名债务人的调研中发现&#xff1a; 68%存在焦虑引发的决策障碍&#xff08;如不敢接听银行电话&#xff09; 42%因羞耻感隐瞒债务导致雪球效应 湖北理元理律师事务所创新采用法律-心理双轨…

【更新中】(文档+代码)基于推荐算法和Springboot+Vue的购物商城

概要设计 本节规划和定义了Woodnet桌游电商平台的软件概要设计说明书&#xff0c;描述了软件的总体设计、接口设计、运行设计、系统数据库结构设计以及系统出错处理设计&#xff0c;从整体上说明了系统设计的结构层次、处理流程、系统用例等。 本系统是一个独立的系统&#x…

六种高阶微分方程的特解(原创:daode3056)

高阶微分方程的通解是指包含所有可能解的解的表达式。对于一个 n 阶微分方程&#xff0c;其通解通常包含 n 个任意常数。这些任意常数可以通过初始条件或边界条件来确定。高阶微分方程的特解是指在通解中&#xff0c;特定地选择了一组常数&#xff0c;使得解满足给定的初始条件…

【C++11(上)】—— 我与C++的不解之缘(三十)

一、C11 这里简单了解一下C发展好吧&#xff1a; C11是C的第二个大版本&#xff0c;也是自C98以来最重要的一个版本。 它引入了大量的更改&#xff0c;它曾被人们称为C0x&#xff0c;因为它被期待在2010年之前发布&#xff1b;但在2011年8月12日才被采纳。 C03到C11花了8年时间…

【多线程初阶】wait() notify()

文章目录 协调多个线程间的执行顺序join 和 wait 区别sleep 和 wait 区别 wait()方法线程饿死调用 wait()唤醒 wait() notify()方法wait() 和 notify() 需对同一对象使用确保先 wait ,后 notify多个线程在同一对象上wait notify随机唤醒一个wait notifyAll()方法应用 wait() 和…

安全-JAVA开发-第二天

Web资源访问的流程 由此可见 客户访问JAVA开发的应用时 会先通过 监听器&#xff08;Listener&#xff09;和 过滤器&#xff08;Filter&#xff09; 今天简单的了解下这两个模块的开发过程 监听器&#xff08;Listener&#xff09; 主要是监听 我们触发了什么行为 并进行反应…