当前位置: 首页 > 科技观察

50行Python代码获取高考志愿信息,不用百度了

时间:2023-03-12 00:22:44 科技观察

最近遇到一个任务,需要将高考志愿信息保存成Excel表格,BOSS丢给我一个URL表格让我做我自己。虽然之前也学过用Python写爬虫的知识,但是时间久了就忘记了,所以经过一天的摸索终于完成了任务。不得不说,Python做到这一点相当容易。最后写完代码,看了代码,只用了50行就完成了任务。准备工作首先明确任务。首先,我们需要从URL表中读取一大串URL,然后访问每一个URL,获取页面上的学校信息,然后写入到另一个Excel中。显然,我们需要一个爬虫库和一个Excel库来帮助我们完成任务。第一步自然是安装它们。requests-html是一个非常好用的HTML解析库,对于简单的爬虫来说非常优雅;而openpyxl是一个Excel表格库,可以方便的创建和处理Excel数据。pipinstallrequests-htmlopenpyxl后面是URL形式,长这样,一共1700多条数据。少数网址错误,访问会出现404错误,所以写代码的时候要注意错误处理。任务分析任务的核心自然是分析获取网页内容。首先,在浏览器中打开一个URL,看看页面上的内容是什么。可以看到这个网页的格式很乱,学校名都混在一起,一点都不规则,给我们提取数据带来了很大的麻烦。但是仔细分析一下,这个问题其实并不难。首先要提取的是学校的名称。可以看到学校名称中夹杂着其他字样,比如“一批普通文科本科生627集美大学申请情况”。本来打算用正则表达式来提取的,后来发现正则表达式不好用。之后又浏览了几个网页,发现学校代码基本都是数字。如果有字母,它们也会出现在第一位,所以我使用了下面的算法。首先把字符串和数字分开,右边的一部分是学校名称和“申请状态”字样,然后把“申请状态”去掉,得到学校名称。这个算法唯一的缺点就是如果中间有一个带字母的代码,就没法获取到学校名称,但是经过实际操作,幸运的是发现并没有出现这种情况。之后需要提取的是专业信息,在网页源代码中使用tr和td标签呈现。一开始我是用tr加selector来提取的,但是生成这个网页的时候出现了问题。每个tr标签的样式根据内容不同,导致我硬编码的选择器无法完美获取。所有行。但是后来发现整个网页内容就是一个表格,除了头部和尾部固定的几行,剩下的就是要提取的数据行,所以直接获取tr标签,然后slice删除结束。网页基本分析完毕,下面就是写代码了。代码一共50行左右,加上注释,相信大家应该能轻松看懂。代码的第一部分是从URL表中读取所有url。刚开始写的时候,表格中的url是从另一个公式生成的,所以加载时需要加上data_only=True才能读取公式的结果,否则只能读取公式本身。第二部分是创建输出文件,然后写入文件头。顺便说一句,为了调试方便,我让它检测到目标文件已经存在就删除,然后新建一个。第三部分是代码的核心部分。Python代码可能看起来有些陌生,但是相对于上面的分析,我想大家应该很容易理解。最后需要保存文件。如果中途代码出现异常,整个工作就白费了,也无法保证1700多个网址全部正常运行。由于输出格式是“学校名称+专业信息”,我得到学校名称后,需要在每行专业信息前插入学校。所以我这里简单的用try-except包起来,如果出错了,打印错误的URL就可以了。importosfromrequests_htmlimportHTMLSessionfromopenpyxlimportWorkbook,load_workbook#GeturlsfromURLformdefget_urls():input_file='source.xlsx'wb=load_workbook(input_file,data_only=True)ws=wb.activeurls=[row[0]forrowinws.values]wb.close()returnurls#输出Excel文件,如果已经存在,删除已有的out_file='data.xlsx'ifos.path.exists(out_file):os.remove(out_file)wb=Workbook()ws=wb.active#写入第一行Headerws['a1']='学校'ws['b1']='专业代码'ws['c1']='专业名称'ws['d1']='计划编号'ws['e1']='预估1:1录取最低分数(提交分数)'ws['f1']='按学校提交比例在线报到的人数'ws['g1']='学费'ws['h1']='学校位置'ws['i1']='专业备注'#发起网络请求,解析网页信息,写入文件session=HTMLSession()urls=get_urls()forurlinurls:importrepage=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]forrinrows:info=[x.textforxinr.xpath('//td')]info.insert(0,college)ws.append(info)print(info)except:print(url)#保存文件wb.save(out_file)运行结果不错,用了一大半太好了,代码终于完成了,让我们运行一下看看结果。整个代码运行大约需要7-8分钟,最终完成后得到一个500多k的Excel文件。打开之后可以发现Excel文件已经满了,最后一共得到了一万多条数据,任务圆满完成。

猜你喜欢