DrissionPage爬虫包实战分享

一、爬虫

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.pswp.cn/bicheng/84267.shtml

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

相关文章

android 布局小知识点 随记

1. 布局属性的命名前缀规律 与父容器相关的前缀 layout_alignParent:相对于父容器的对齐方式。 例如:layout_alignParentTop"true"(相对于父容器顶部对齐)。layout_margin:与父容器或其他控件的边距。 例如…

GeoDrive:基于三维几何信息有精确动作控制的驾驶世界模型

25年5月来自北大、理想汽车和 UC Berkeley 的论文“GeoDrive: 3D Geometry-Informed Driving World Model with Precise Action Control”。 世界模型的最新进展彻底改变动态环境模拟,使系统能够预见未来状态并评估潜在行动。在自动驾驶中,这些功能可帮…

Java高频面试之并发编程-25

hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶 面试官:CAS都有哪些问题?如何解决? CAS 的问题及解决方案 CAS(Compare and Swap&#xff0…

从碳基羊驼到硅基LLaMA:开源大模型家族的生物隐喻与技术进化全景

在人工智能的广袤版图上,一场从生物学羊驼到数字智能体的奇妙转变正在上演。Meta推出的LLaMA(Large Language Model Meta AI)系列模型,不仅名字源自美洲驼(llama),更以其开源特性和强大性能,引领了开源大模型社区的“驼类大爆发”…

可下载旧版app屏蔽更新的app市场

软件介绍 手机用久了,app越来越臃肿,老手机卡顿成常态。这里给大家推荐个改善老手机使用体验的方法,还能帮我们卸载不需要的app。 手机现状 如今的app不断更新,看似在优化,实则内存占用越来越大,对手机性…

Python_day47

作业:对比不同卷积层热图可视化的结果 一、不同卷积层的特征特性 卷积层类型特征类型特征抽象程度对输入的依赖程度低层卷积层(如第 1 - 3 层)边缘、纹理、颜色、简单形状等基础特征低高,直接与输入像素关联中层卷积层&#xff08…

比较数据迁移后MySQL数据库和达梦数据库中的表

设计一个MySQL数据库和达梦数据库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之…

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率&#xff0c…

Linux 文本比较与处理工具:comm、uniq、diff、patch、sort 全解析

在类 UNIX 操作系统,特别是 Linux 系统中,命令行提供了一整套强大的文本处理工具,这些工具对于文件差异对比、内容筛选、文本排序以及源代码管理尤为重要。今天,我们将结合真实示例,深入介绍并实战演示 comm、uniq、di…

6月6日day46打卡

通道注意力(SE注意力) 知识点回顾: 不同CNN层的特征图:不同通道的特征图什么是注意力:注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。通道注意力:模型的定义和插入的位置通道注意力…

前端技能包

ES6 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><script>// 变量定义var a1;let b5; // 现在使用let 定义变量// 对象解构let person{&quo…

大数据(1) 大数据概述

一、大数据时代 1.三次信息化浪潮 二、什么是大数据 1.四个特点 4V&#xff1a;数据量&#xff08;Volume&#xff09;大、数据类型&#xff08;Variety&#xff09;繁多、处理速度&#xff08;Velocity&#xff09;快、价值密度&#xff08;Value&#xff09;低 三、大数据…

element-plus 单选组件 el-radio,选不上,又没报错,直接复制官网也不行解决方案

在使用 Vue 框架开发项目时&#xff0c;Element UI 是常用的组件库。最近在开发中遇到了 Element 单选框组件el-radio的双向绑定问题&#xff0c;直接复制element官网上的的案例下来也是不得&#xff0c;经过调试和探索&#xff0c;终于找到了解决方案&#xff0c;特此记录分享…

使用 Amazon Q Developer CLI 快速搭建各种场景的 Flink 数据同步管道

在 AI 和大数据时代&#xff0c;企业通常需要构建各种数据同步管道。例如&#xff0c;实时数仓实现从数据库到数据仓库或者数据湖的实时复制&#xff0c;为业务部门和决策团队分析提供数据结果和见解&#xff1b;再比如&#xff0c;NoSQL 游戏玩家数据&#xff0c;需要转换为 S…

开疆智能Ethernet/IP转Modbus网关连接质量流量计配置案例

首先设置modbus从站的485参数&#xff0c;确保网关和从站的485参数保持一致。 设置完成后打开网关配置软件并新建项目 先设置网关在Ethernet一侧的IP地址以及数据转换长度。 设置网关的Modbus参数如波特率9600无校验8数据位&#xff08;无校验选8&#xff0c;有校验选9&#xf…

多智能体MPE环境遇到的若干问题

最近学习MADDPG算法&#xff0c;用MPE环境来测试算法性能。于是便下载了pettingzoo包&#xff0c;运行了simple_tag_v3环境&#xff0c;此环境中有猎人、逃亡者和障碍物。 问题1: MPE中的simple_tag_v3环境&#xff0c;在渲染时看似移动的问题 由于相机视角跟随导致的视觉错觉…

[特殊字符] FFmpeg 学习笔记

一、FFmpeg 简介 FFmpeg 是一个开源跨平台的视频和音频处理工具&#xff0c;支持录制、转换、流处理等功能。 官网&#xff1a;https://ffmpeg.org 安装命令&#xff08;macOS&#xff09;&#xff1a; brew install ffmpeg二、基本命令结构 ffmpeg -i 输入文件 [参数] 输出…

leetcode Top100 238. 除自身以外数组的乘积|数组系列

题目链接&#xff1a;238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 238. 除自身以外数组的乘积|数组系列 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 …

【Liunx专栏_6】Linux线程概念与控制

目录 1、线程是什么&#xff1f;通过一个图来理解……2、Linux进程和线程&#xff1f;2.1、之间的关系和区别2.2、线程的优缺点&#xff1f; 3、线程的创建3.1、POSIX线程库3.2、创建线程3.3、PS查看运行的线程 4、线程的终止5、线程的等待6、线程分离7、线程封装 1、线程是什么…

「Java基本语法」标识符、关键字与常量

知识点解析 1&#xff0e;标识符&#xff08;Identifiers&#xff09;&#xff1a;用于命名类、方法、变量等。 标识符命名规则&#xff1a; 标识符由字母&#xff08;A-Z&#xff0c;a-z&#xff09;、数字&#xff08;0-9&#xff09;、下划线“_”或美元符号“$”组成。标…