爬虫实训案例:中国大学排名

2024-05-25 00:28

本文主要是介绍爬虫实训案例:中国大学排名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

近一个月左右的时间学习爬虫,在用所积累的知识爬取了《中国大学排名》这个网站,爬取的内容虽然只是可见的文本,但对于初学者来说是一个很好的练习。在爬取的过程中,通过请求数据、解析内容、提取文本、存储数据等几个重要的内容入手,不过在存储数据后的数据排版方面并不是很完善(优化),希望阅读本文章的学者大大给些存储后的数据排版方面的指点:中文对齐的问题

文章目录

  • 前言🌟
  • 一、🍉从网络上获取大学排名网页内容— getHTMLText()
  • 二、🍉提取网页内容中信息到合适的数据结构— fillUnivList()
  • 三、🍉将数据保存至电脑文件夹中— Store_as_file()
  • 四、🍉主函数
  • 总结🌟


前言🌟

本次案例主要涉及bs4库中的BeautifulSoup内容、requests的使用和存储数据等知识。

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、🍉从网络上获取大学排名网页内容— getHTMLText()

  1. 爬取的网址:https://www.shanghairanking.cn/rankings/bcur/202411
  2. 判断是否可以爬取
    在该网站的根目录下查看robots.txt文件是否可以爬取内容,这里显示没有搜索到该内容
    在这里插入图片描述

3.利用request库爬取

def getHTMLText(url):try:r = requests.get(url, timeout=30)r.raise_for_status()  # 判断请求是否成功:如果不是200,产生异常requests.HTTPErrorr.encoding = r.apparent_encoding  # http header中猜测的响应内容编码方式 设置为 内容中分析出的响应内容编码方式(备选编码方式)return r.textexcept:return "请求失败"

二、🍉提取网页内容中信息到合适的数据结构— fillUnivList()

  1. 分析网页
    我们要爬取的是”排名“,”学校名称“,”省市“,”类型“,”总分“,”办学层次“等信息,如图:
  • 先是分析整体信息,需要爬取的文本信息都存放在.html网页中的<tbody></tbody>中的<tr>标签下.
    在这里插入图片描述
  • ”学校名称”在<div class="univname" data-v-90b0d2ac>标签下<a>标签中。
    在这里插入图片描述
    特征:<a>的父亲<div>标签的属性都是class="link-container"和style="width:200px
    在这里插入图片描述
  • 而”省市“,”类型“,”总分“,”办学层次“等,都是直接在<tr>标签的子代中,所以可以直接获取相关数据存放至列表中在这里插入图片描述
  1. 解析数据
    获取主要爬取的数据,存放至列表中并返回
def fillUnivList(ulist, html):soup = BeautifulSoup(html, 'html.parser')  # 设置BeautifulSoup解析器为'html.parser'soup.prettify()  # 整理解析的网页# 创建列表tds_name = []name_types = []tds_location = []tds_type = []tds_total = []tds_level = []try:# 遍历tbody的下行遍历for tr in soup.tbody.children:# 检测tr标签的类型的类型,如果tr标签的类型不是bs4库定义的tag类型,将过滤掉if isinstance(tr, bs4.element.Tag):  # 检查变量tr是否为BeautifulSoup库中Tag类的实例的一个条件判断语句# tds=str(list(tr('td')[2])[0]).strip()# 学校名称td_name = tr('td')[1]td_div_names = td_name.find_all('div', attrs={"style": "width:200px", "class": "link-container"})for div_tag in td_div_names:# 另一种写法# name_part = div_tag.find('a').get_text(strip=True).split('\n', 1)[0]a = str(div_tag.find_all('a')[0].string).strip().split('\n')[0]tds_name.append(a)# 学校类型td_name_type = tr('td')[1] \.find_all('div', attrs={"class": "univname"})[0] \.find_all('p', attrs={"class": "tags"})[0].get_text(strip=True)# 位置td_location = tr('td')[2].get_text(strip=True)# 类型td_type = tr('td')[3].get_text(strip=True)# 总分td_total = tr('td')[4].get_text(strip=True)# 办学层次td_level = tr('td')[5].get_text(strip=True)# 将各个数据添加至列表name_types.append(td_name_type)tds_location.append(td_location)tds_type.append(td_type)tds_total.append(td_total)tds_level.append(td_level)# break# 中文名字列表name_cns = tds_name[::2]# 英文名字列表name_ens = tds_name[1::2]i=1# 遍历列表大学信息,存放至空列表university中,使用zip打包,zip打包后的数据是元组for name_cn, name_en, name_type, location, type, total, level in \zip(name_cns, name_ens, name_types, tds_location, tds_type, tds_total, tds_level):university_data = {'序号':i,'学校名称': name_cn + " " + name_en + " " + name_type,'省市': location,'类型': type,'总分': total,'办学层次': level}i+=1ulist.append(university_data)return ulistexcept:return "爬取失败"

三、🍉将数据保存至电脑文件夹中— Store_as_file()

这里直接给出代码块,因为完全没有真的优化处理好爬取后的数据(还是很杂乱)

def Store_as_file(path,datas):# 打开文件准备写入with open(path, 'w', encoding='utf-8') as file:# 写入表头,方便阅读file.write("{:^10}\t{:<110}\t{:<10}\t{:<10}\t{:<10}\t{:>10}\n".format("序号","学校名称","省市","类型","总分","办学层次"))t="\t"*10# file.write(f"序号\t学校名称\t\t省市\t\t类型\t\t总分\t\t办学层次\n")# 遍历列表,将每个字典的内容写入文件for university in datas:# 使用制表符分隔各个字段,保证对齐line = "{序号:^10}\t{学校名称:<110}\t{省市:<10}\t{类型:<10}\t{总分:<10}\t{办学层次:>10}\n".format(**university)file.write(line)print(f"数据已成功保存至'{path}'")

四、🍉主函数

  1. 代码块:主函数的书写
def main():university = []num = int(input("请输入大学排名的年份:"))url=f"https://www.shanghairanking.cn/rankings/bcur/{num}11"html=getHTMLText(url)datas=fillUnivList(university,html)path=input("请输入存放内容的位置:")Store_as_file(path,datas)
  1. 最终效果:当然,我是确实不知道怎么更改,还望读者帮忙提供点意见

在这里插入图片描述

总结🌟

总代码块:导入requests库bs4库和bs4库中的BeautifulSoup

import requests
from bs4 import BeautifulSoup
import bs4def getHTMLText(url):try:r = requests.get(url, timeout=30)r.raise_for_status()  # 判断请求是否成功:如果不是200,产生异常requests.HTTPErrorr.encoding = r.apparent_encoding  # http header中猜测的响应内容编码方式 设置为 内容中分析出的响应内容编码方式(备选编码方式)return r.textexcept:return "请求失败"def fillUnivList(ulist, html):soup = BeautifulSoup(html, 'html.parser')  # 设置BeautifulSoup解析器为'html.parser'soup.prettify()  # 整理解析的网页# 创建列表tds_name = []name_types = []tds_location = []tds_type = []tds_total = []tds_level = []try:# 遍历tbody的下行遍历for tr in soup.tbody.children:# 检测tr标签的类型的类型,如果tr标签的类型不是bs4库定义的tag类型,将过滤掉if isinstance(tr, bs4.element.Tag):  # 检查变量tr是否为BeautifulSoup库中Tag类的实例的一个条件判断语句# tds=str(list(tr('td')[2])[0]).strip()# 学校名称td_name = tr('td')[1]td_div_names = td_name.find_all('div', attrs={"style": "width:200px", "class": "link-container"})for div_tag in td_div_names:# 另一种写法# name_part = div_tag.find('a').get_text(strip=True).split('\n', 1)[0]a = str(div_tag.find_all('a')[0].string).strip().split('\n')[0]tds_name.append(a)# 学校类型td_name_type = tr('td')[1] \.find_all('div', attrs={"class": "univname"})[0] \.find_all('p', attrs={"class": "tags"})[0].get_text(strip=True)# 位置td_location = tr('td')[2].get_text(strip=True)# 类型td_type = tr('td')[3].get_text(strip=True)# 总分td_total = tr('td')[4].get_text(strip=True)# 办学层次td_level = tr('td')[5].get_text(strip=True)# 将各个数据添加至列表name_types.append(td_name_type)tds_location.append(td_location)tds_type.append(td_type)tds_total.append(td_total)tds_level.append(td_level)# break# 中文名字列表name_cns = tds_name[::2]# 英文名字列表name_ens = tds_name[1::2]i=1# 遍历列表大学信息,存放至空列表university中,使用zip打包,zip打包后的数据是元组for name_cn, name_en, name_type, location, type, total, level in \zip(name_cns, name_ens, name_types, tds_location, tds_type, tds_total, tds_level):university_data = {'序号':i,'学校名称': name_cn + " " + name_en + " " + name_type,'省市': location,'类型': type,'总分': total,'办学层次': level}i+=1ulist.append(university_data)return ulistexcept:return "爬取失败"def Store_as_file(path,datas):# 打开文件准备写入with open(path, 'w', encoding='utf-8') as file:# 写入表头,方便阅读file.write("{:^10}\t{:<110}\t{:<10}\t{:<10}\t{:<10}\t{:>10}\n".format("序号","学校名称","省市","类型","总分","办学层次"))t="\t"*10# file.write(f"序号\t学校名称\t\t省市\t\t类型\t\t总分\t\t办学层次\n")# 遍历列表,将每个字典的内容写入文件for university in datas:# 使用制表符分隔各个字段,保证对齐line = "{序号:^10}\t{学校名称:<110}\t{省市:<10}\t{类型:<10}\t{总分:<10}\t{办学层次:>10}\n".format(**university)file.write(line)print(f"数据已成功保存至'{path}'")def main():university = []num = int(input("请输入大学排名的年份:"))url=f"https://www.shanghairanking.cn/rankings/bcur/{num}11"html=getHTMLText(url)datas=fillUnivList(university,html)path=input("请输入存放内容的位置:")Store_as_file(path,datas)if __name__ == '__main__':main()

最后还是想哆嗦一下,希望读者大大,和爬虫感兴趣的多找我讨论讨论,给出点建议和学习上的交流👑👑 👏👏

这篇关于爬虫实训案例:中国大学排名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999965

相关文章

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插