50行Python代码获取高考志愿信息的实现方法


Posted in Python onJuly 23, 2019

最近遇到个任务,需要将高考志愿信息保存成Excel表格,BOSS丢给我一个网址表格之后就让我自己干了。虽然我以前也学习过Python编写爬虫的知识,不过时间长了忘了,于是摸索了一天之后终于完成了任务。不得不说,Python干这个还是挺容易的,最后写完一看代码,只用了50行就完成了任务。

50行Python代码获取高考志愿信息的实现方法

准备工作

首先明确一下任务。首先我们要从网址表格中读取到一大串网址,然后访问每个网址,获取到页面上的学校信息,然后将它们在写到另一个Excel中。显然,我们需要一个爬虫库和一个Excel库来帮助我们完成任务。

第一步自然是安装它们,requests-html是一个非常好用的HTML解析库,拿来做简单的爬虫非常优雅;而openpyxl是一个Excel表格库,可以轻松创建和处理Excel数据。

pip install requests-html openpyxl

然后就是网址表格,大概长这样,总共大概一千七百多条数据。其中有少量网址是错误的,访问会得到404错误,所以在编写代码的时候还要注意错误处理。

50行Python代码获取高考志愿信息的实现方法

任务分析

任务的核心自然就是分析和获取网页内容了。首先现在浏览器里面打开一个网址,看看网页上的内容是什么。

50行Python代码获取高考志愿信息的实现方法

可以看到这个网页格式很乱,学校名字什么的都是混在一起的,一点也不规整,这给我们提取数据造成了不少的麻烦。不过仔细分析之后,其实问题也并不难。

首先要提取的是学校名字,可以看到学校名字和其他文字混在一起,例如"本科一批普通文科627集美大学报考情况"。本来我准备用正则表达式提取,然后发现用正则表达式好像很难。之后我多访问了几个网页,发现学校代码基本上都是数字,如果有字母的话也出现到第一位,所以我采用了以下的算法,首先将字符串从数字处分隔,右边的一个部分就包含了学校名字和“报考情况”几个字,然后删除“报考情况”即可得到学校名字。这个算法唯一的缺点就是,假如出现了字母在中间的代号,就没办法获取到学校名字了,不过实际运行之后,我幸运的发现并没有出现这种情况。

之后要提取的就是专业信息了,在网页源代码中这部分使用tr和td标签来呈现的。一开始我用的是tr加上选择器来提取,但是这个网页生成的时候很有问题,每个tr标签的样式居然还根据内容的多少而不同,导致我写死的选择器没法完美获取所有行。不过后来我发现整个网页内容都是一个表格, 除去表头和结尾的几个固定行之外,剩下的恰好就是要提取的数据行,所以直接获取tr标签,然后切片除去收尾即可。

50行Python代码获取高考志愿信息的实现方法

网页基本上分析完了,下面就是编写代码了。

编写代码

总共50行左右代码,我添加了注释,相信大家应该很容易就可以看懂。

第一部分代码是从网址表格读取所有url,一开始编写的时候,表格里的url是从另一个公式生成的,所以需要在加载的时候添加data_only=True才能读取到公式的结果,否则只能读取到公式本身。

第二部分是创建输出文件,然后编写表头。顺带为了调试方便,我让它如果检测到已经存在目标文件的话就删掉,在建立一个新的。

第三部分就是代码的核心了。Python代码看着可能有点奇怪,不过对照上面的分析,我想大家应该很容易看懂。需要注意保存文件在最后,假如半路代码出现异常,整个就白干了,而一千七百多条网址不可能保证都正常运行。由于输出格式是“学校名+专业信息”这样的格式,所以我获取学校名之后,还要将学校插入到每行专业信息之前。所以我这里索性直接用try-except包起来,如果出错的话只打印一下出错的网址。

import os 
from requests_html import HTMLSession 
from openpyxl import Workbook, load_workbook 
# 从网址表格获取urls 
def get_urls(): 
 input_file = 'source.xlsx' 
 wb = load_workbook(input_file, data_only=True) 
 ws = wb.active 
 urls = [row[0] for row in ws.values] 
 wb.close() 
 return urls 
# 输出Excel文件,如果已存在则删除已有的 
out_file = 'data.xlsx' 
if os.path.exists(out_file): 
 os.remove(out_file) 
wb = Workbook() 
ws = wb.active 
# 编写第一行表头 
ws['a1'] = '学校' 
ws['b1'] = '专业代号' 
ws['c1'] = '专业名称' 
ws['d1'] = '计划数' 
ws['e1'] = '预计1:1录取最低分(投档分)' 
ws['f1'] = '按院校投档比例投档线上已报人数' 
ws['g1'] = '学费' 
ws['h1'] = '办学地点' 
ws['i1'] = '专业备注' 
# 发起网络请求,解析网页信息,并写入文件 
session = HTMLSession() 
urls = get_urls() 
for url in urls: 
 import re 
 page = session.get(url) 
 page.html.encoding = 'gb2312' 
 try: 
 college_info = page.html.xpath('//td[@class="report1_1_1"]/text()', first=True) 
 college = re.split('\d+', college_info)[1].replace('报考情况', '') 
 rows = page.html.xpath('//tr')[3:-2] 
 for r in rows: 
 info = [x.text for x in r.xpath('//td')] 
 info.insert(0, college) 
 ws.append(info) 
 print(info) 
 except: 
 print(url) 
 
# 保存文件 
wb.save(out_file)

运行结果

好了,费了大半天的劲,代码终于完成了。让我们运行一下看看结果。整个代码大概需要运行7-8分钟,最后完成之后得到了一个500多k的Excel文件。

50行Python代码获取高考志愿信息的实现方法

打开之后,可以发现Excel文件填的满满的,最后总共获取到了大约一万多条数据,任务圆满完成。

50行Python代码获取高考志愿信息的实现方法

总结

以上所述是小编给大家介绍的50行Python代码获取高考志愿信息的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python实现3行代码解简单的一元一次方程
Aug 18 Python
对Python中gensim库word2vec的使用详解
May 08 Python
对Python 数组的切片操作详解
Jul 02 Python
用python3教你任意Html主内容提取功能
Nov 05 Python
详解python-图像处理(映射变换)
Mar 22 Python
Django 数据库同步操作技巧详解
Jul 19 Python
python全局变量引用与修改过程解析
Jan 07 Python
浅谈Python访问MySQL的正确姿势
Jan 07 Python
vue学习笔记之动态组件和v-once指令简单示例
Feb 29 Python
python单元测试框架pytest的使用示例
Oct 07 Python
Python实现Hash算法
Mar 18 Python
详解Python内置模块Collections
Mar 22 Python
python设计tcp数据包协议类的例子
Jul 23 #Python
Django 缓存配置Redis使用详解
Jul 23 #Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 #Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 #Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 #Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 #Python
flask框架路由常用定义方式总结
Jul 23 #Python
You might like
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
js下弹出窗口的变通
2007/04/18 Javascript
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
python编程嵌套函数实例代码
2018/02/11 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
如何用SQL语句进行模糊查找
2015/09/25 面试题
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
不打扫卫生检讨书
2014/02/12 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript