Python实战:使用DrissionPage库爬取高考网大学信息

上一篇文章,我刚入门 DrissionPage 爬虫库,使用这个库爬取了拉钩网关于 Python 的职位信息。

今天再使用 DrissionPage 爬虫库练习一个案例,爬取高考网大学信息。

本次爬取到2885个大学信息,包含大学名称、所在省、市、大学标签信息。

截图如下:

一、页面分析

目标网页是https://www.gaokao.cn/school/search

获取学校名称、所在省市、学婊标签信息。

二、分析思路

使用 DrissionPage 库打开目标网页

使用元素定位方法,定位到包含学校信息的 div

在 div 内继续定位学校名称、所在省市、标签这个信息

将信息存储到列表

翻页,到下一页重复爬取信息

翻完所有页,使用 pandas 将存有所有信息的列表转为 datafram

使用 pandas 将 datafram 保存为 csv 文件或者 excel 文件,或者写入数据库

三、开始写代码

1、打开网页

from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get('https://www.gaokao.cn/school/search')

2、定位信息

# 定位包含学校信息的div
divs = page.eles('tag:div@class=school-search_schoolItem__3q7R2')
# 提取学校信息
for div in divs:# 提取学校名称school = div.ele('.school-search_schoolName__1L7pc')school_name = school.ele('tag:em')# 提取学校城市city = div.ele('.school-search_cityName__3LsWN')if len(city.texts()) == 2:city_level1 = city.texts()[0]city_level2 = city.texts()[1]elif len(city.texts()) == 1:city_level1 = city.texts()[0]city_level2 = ""else:city_level1 = ""city_level2 = ""# 提取学校标签tags = div.ele('.school-search_tags__ZPsHs')spans = tags.eles('tag:span')spans_list = []for span in spans:spans_list.append(span.text)

3、存储信息

# contents列表用来存放所有爬取到的大学信息
contents = []
# 信息存到contents列表
contents.append([school_name.text, city_level1, city_level2, spans_list])
# print(school_name.text, city_level1, city_level2, spans_list)

4、翻页

# 定位下一页,点击下一页
try:next_page = page.ele('. ant-pagination-next')next_page.click()
except:pass

5、滑动页面到底部

# 页面滚动到底部,方便查看爬到第几页
time.sleep(2)
page.scroll.to_bottom()

6、反爬措施

在编写爬虫代码时,要考虑反爬措施。不然就会遇到下面这种情况,服务器直接不给你返回数据了。

我设置的是每爬 1 次都暂停几秒,每爬 50 次暂停 1 分钟。

for i in tqdm(range(1, 146)):# 每爬50页暂停1分钟if i % 50 == 0:get_info()print("暂停1分钟")time.sleep(60)else:get_info()

7、保存数据到csv文件

import pandas as pd
def save_to_csv(data):# 保存到csv文件name = ['school_name', 'city_level1', 'city_level2', 'tags']df = pd.DataFrame(columns=name, data=data)df.to_csv(f"高考网大学信息{len(data)}条.csv", index=False)print("保存完成")

8、使用tqdm库显示进度

from tqdm import tqdm
for i in tqdm(range(1, 146)):# 每爬50页暂停1分钟if i % 50 == 0:get_info()print("暂停1分钟")time.sleep(60)else:get_info()

四、完整代码

通过定义函数,优化代码,整合成一个完整的代码。完整代码如下:

from DrissionPage import ChromiumPage
import pandas as pd
from tqdm import tqdm
import timedef get_info():global i# 页面滚动到底部,方便查看爬到第几页time.sleep(2)page.scroll.to_bottom()# 定位包含学校信息的divdivs = page.eles('tag:div@class=school-search_schoolItem__3q7R2')# 提取学校信息for div in divs:# 提取学校名称school = div.ele('.school-search_schoolName__1L7pc')school_name = school.ele('tag:em')# 提取学校城市city = div.ele('.school-search_cityName__3LsWN')if len(city.texts()) == 2:city_level1 = city.texts()[0]city_level2 = city.texts()[1]elif len(city.texts()) == 1:city_level1 = city.texts()[0]city_level2 = ""else:city_level1 = ""city_level2 = ""# 提取学校标签tags = div.ele('.school-search_tags__ZPsHs')spans = tags.eles('tag:span')spans_list = []for span in spans:spans_list.append(span.text)# 信息存到contents列表contents.append([school_name.text, city_level1, city_level2, spans_list])# print(school_name.text, city.text, spans_list)print("爬取第", i, "页,总计获取到", len(contents), "条大学信息")time.sleep(2)# 定位下一页,点击下一页try:next_page = page.ele('. ant-pagination-next')next_page.click()except:passdef craw():global ifor i in tqdm(range(1, 146)):# 每爬50页暂停1分钟if i % 50 == 0:get_info()print("暂停1分钟")time.sleep(60)else:get_info()def save_to_csv(data):# 保存到csv文件name = ['school_name', 'city_level1', 'city_level2', 'tags']df = pd.DataFrame(columns=name, data=data)df.to_csv(f"高考网大学信息{len(data)}条.csv", index=False)print("保存完成")if __name__ == '__main__':# contents列表用来存放所有爬取到的大学信息contents = []page = ChromiumPage()page.get('https://www.gaokao.cn/school/search')# 声明全局变量ii = 0craw()save_to_csv(contents)

Pycharm 控制台输出如下:

五、数据分析

使用 excel 表自带的数据透视表功能,分析每个省的学校数量。

此外,标签字段含有的信息量也比较丰富,例如其中一个学校的标签是[‘普通本科’, ‘综合类’, ‘公办’, ‘985’, ‘211’, ‘双一流’, ‘强基计划’],也可以对标签字段进行数据分析。本文就不展开了。

六、总结

DrissionPage 库使用起来确实比 Selenium 库方便很多,再也回不去啦。哈哈哈。

本文首发在“程序员coding”公众号,欢迎关注与我一起交流学习。

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

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

相关文章

Git私服搭建

1、安装 openssh服务器 sudo apt-get install openssh-server openssh-client 2、创建个人公钥和私钥 在默认用户的主目录路径下,运行以下命令,按照提示创建公钥和私钥 ssh-keygen -t rsa 默认生成2048位,如果需要提高安全级别&#xff0c…

Galah:一款功能强大的LLM驱动型OpenAI Web蜜罐系统

关于Galah Galah是一款功能强大的Web蜜罐,该工具由LLM大语言模型驱动,基于OpenAI API实现其功能。 很多传统的蜜罐系统会模拟一种包含了大量网络应用程序的网络系统,但这种方法非常繁琐,而且有其固有的局限性。Galah则不同&…

【算法详解 | 二分查找】详解二分查找 \ 折半查找高效搜索算法 | 顺序数组最快搜索算法 | 递归循环解决二分查找问题

二分查找 by.Qin3Yu 本文需要读者掌握 顺序表 的操作基础,完整代码将在文章末尾展示。 顺序表相关操作可以参考我的往期博文: 【C数据结构 | 顺序表速通】使用顺序表完成简单的成绩管理系统.by.Qin3Yu 文中所有代码使用 C 举例,且默认已使用…

DAO设计模式

概念:DAO(Data Access Object) 数据库访问对象,**面向数据库SQL操作**的封装。 (一)场景 问题分析 在实际开发中,针对一张表的复杂业务功能通常需要和表交互多次(比如转账)。如果每次针对表的…

微服务系统设计:横向扩展和纵向扩展的对比

微服务扩展性:水平扩展 vs 垂直扩展 特点水平扩展垂直扩展扩展单位增加微服务实例增加单个实例的资源 (CPU,内存)方向向外,增加节点向上,增加单个节点的资源复杂性随着实例数量的增加,管理难度更大管理更简单&#xf…

聊一聊Tomcat的架构和运行流程,尽量通俗易懂一点

1、Tomcat的架构 这里可以看出 A、一个Tomcat就是一个Server,一个Server下会有多个Service, B、Service只负责封装多个Connector和一个Container(Service本身不是容器,可以看做只是用来包装Connector和Container的壳&#xff0c…

基于Springboot的社区疫情防控平台

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 一、项目简介 以往的社区疫情防控管理…

交强险投保日期查询接口返回字段说明

API接口是现代互联网应用中重要的组成部分,通过接口的调用可以实现不同系统之间的数据交互和共享。在汽车保险行业中,交强险投保日期查询接口是非常关键的一个接口,本文将详细介绍该接口的返回字段和使用方法。 接口名称:交强险投…

【Java基础】自定义类型处理器xxxTypeHandler

1. 背景 在处理复杂的数据类型时,我们一般需要提供一种灵活的映射机制,以适应数据库字段和Java实体类之间的差异。 例: dim_bu_info_private_i表中有一个json类型的字段extend_info create table dim_bu_info_private_i (id …

计算机网络(第六版)复习提纲23

第五章:运输层 SS5.1 运输层协议概述 1 进程之间的通信 A 运输层要实现复用和分用: 复用:发送方不同进程都能使用用一个运输层协议传送数据 分用:接收方的运输层在剥去报文首部后能将这些数据交付给正确的应用 B 运输层提供应用进…

17 # 类型检查机制:类型保护

例子: enum Type {Strong,Week }class Java {helloJava(){console.log(hello Java);} }class JavaScript {helloJavaScript(){console.log(hello JavaScript);} }function getLanguage(type: Type){let lang type Type.Strong ? new Java() : new JavaScript();…

算法专题:记忆搜索

参考练习习题总集 文章目录 前置知识练习习题87. 扰乱字符串97. 交错字符串375. 猜数字大小II403. 青蛙过河464. 我能赢吗494. 目标和552. 学生出勤记录II576. 出借的路径数 前置知识 没有什么特别知识,只有一些做题经验。要做这类型的题目,首先写出暴…

C++入坑基础知识点

当学习了C语言之后,很多的小伙伴都想进一步学习C,但两者有相当一部分的内容都是重叠的,不知道该从哪些方面开始入门C,这篇文章罗列了从C到C必学的入门知识,学完就算是踏入C的大门了。 1. 命名空间 写C的时候&#xff…

使用Vue-Grid-Layout实现自定义工作台

前言 当代工作环境要求高度的个性化和定制化,因此,自定义工作台成为了一个热门的需求。Vue-Grid-Layout是一个强大的Vue组件,可以帮助我们实现自定义工作台的功能。在本篇博客中,我将向您介绍如何使用Vue-Grid-Layout来创建一个自…

找不到d3dcompiler_43.dll,无法继续执行代码的原因分析与解决方法

在运行某些软件或游戏时,可能会遇到系统提示找不到 d3dcompiler_43.dll 文件的情况。这个特定的动态链接库文件 (dll) 是 DirectX 3D 编译器组件的一部分,对于许多现代软件游戏的正常运行起着不可或缺的作用。它的主要功能在于将高级着色语言编写的代码转…

零基础学Python之核心基础知识

1.Python入门简介 (1)什么是Python Life is short, you need Python!人生苦短,我用Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言…

MySQL数据库入门(概念+使用)

目录 1. 数据库的概念 1.1 数据库的存储介质 1.2 主流数据库 2. MySQL的基本使用 2.1 链接数据库 2.2 服务器管理 2.3 数据库,服务器和表关系 2.4 简单MySQL语句 3. MySQL架构 4. SQL分类 5. 存储引擎 本篇完。 1. 数据库的概念 数据库是按照数据结构来…

【CSS】页面自适应屏幕宽度(响应式布局媒体查询-@media、弹性布局、网格布局和相对单位-vh/em/%)

【CSS】页面自适应屏幕宽度(响应式布局媒体查询-media、弹性布局、网格布局和相对单位-vh/em/%) 一、媒体查询(media)1、媒体类型2、媒体特征3、媒体查询语法4、示例(1)示例1(2)示例…

筛选可疑密码

题目描述 情报小组截获了若干个可疑密码,这些密码都是4位数。现在他们获得了一条最新情报:个位数与千位数的和 减去十位数与百位数的和,结果是一个正数。请你帮助情报组筛选目前的可疑密码。 输入 输入两行,第一行是&#xff1…

Codeforces Round 481 (Div. 3)

本场比赛也是没有考察什么算法重点在于思维模式 目录 A. Remove Duplicates B. File Name C. Letters D. Almost Arithmetic Progression E. Bus Video System F. Mentors G. Petyas Exams A. Remove Duplicates 要求我们从右边开始保留数,我们可以考虑的就…