时间:2024-05-04
伍高巍 刘杰 葛晓龙 徐望成
摘要:研招网作为中国最大的研究生招考信息公布平台,资源丰富。目前主流的爬虫框架有Scrapy、pyspider与crawley,其中Scrapy为目前最流行的爬虫框架。因此,文中主要研究Python语言开发的开源爬虫框架Scrapy所开发的爬虫,对研招网硕士目录进行爬取,举例说明爬虫如何应对网站的反爬措施。
关键词:网络爬虫;Scrapy;Python;反反爬;研招网
中图分类号:TP311.11 文献标识码:A
文章编号:1009-3044(2022)17-0053-03
1 引言
随着信息技术与互联网的发展,人们几乎在生活中每时每刻都在产生着数据也不断在获取数据,但是由于互联网的网状结构是数据零零散散地发布在不同的区域,很难实现数据系统化结构化的有效利用。人们继续采用以往的常规方式去收集数据的话,不仅速度慢而且效率低,由此网络爬虫技术就诞生了。网络爬虫可以通过分析网页的基本结构及其特点,通过相关选择器从而获取网站的指定信息。
研招网(yz.chsi.com.cn)是教育部全国硕士研究生招生考试网上报名和网上调剂指定网站,贯穿研究生招生宣传、招生咨询、报名管理、生源调剂、录取检查整个工作流程,实现了研究生招生信息管理一体化。
2 Scrapy爬虫设计
研招网硕士硕士目录(https://yz.chsi.com.cn/zsml/zyfx_search.jsp)提供了统一的按照学校、学科门类、学科类别等查询方式,为广大考生提供了许多年的优质服务,但是由于不同院校的考试科目千差万别,这导致无法按照考试科目进行查找相关院校成为了一大难题。我国具有招收研究生资格的院校往往都会在研招网上公布其当年统考的招生人数以及考试课程,其中考试课程也分为统考科目与院校自主命题。为了更好地解决研究生考试择校问题,本文对研招网硕士目录进行了相关信息的爬取。
2.1 爬取对象的分析
其中研招网硕士目录主要分为四个页面,第一个为搜索页,第二个为目录页,第三个为院校页,第四个为招考信息页。
其中对研招网硕士目录分析网页请求结构,通过浏览器的检查工具可知。首先由浏览器对https://yz.chsi.com.cn/zsml/queryAction.do发送post请求,并且携带的数据如表1所示。
mldm与yjxkdm為必须选项,例如请求南华大学软件工程全日制学硕的招考信息则需要向https://yz.chsi.com.cn/zsml/queryAction.do?ssdm=43&dwmc=南华大学&mldm=08&mlmc=&yjxkdm=0835&xxfs=1&zymc=软件工程 发起网络请求,其中?后面携带的为post请求所需要发送的参数,通过其参数即可实现自定义查找。由此可以通过mldm=zyxw&yjxkdm=0854&xxfs=1 即可实现对全国所有招收全日制电子信息专业硕士的信息的查找。同理可以对下一页的操作进行分析可以得知只需要携带一个pageno参数即可完成翻页操作,如pageno=2即表示请求第二页。
2.2 Scrapy概述
Python语言拥有许许多多的第三方爬虫库,如Scrapy、pyspider、crawley等[1]。其中Scrapy爬虫框架应用最为广泛。Scrapy框架采用Python语言设计而成,拥有twisted的特点,能够很好地实现异步爬取网页相关内容,快速而又十分便捷[2]。通过Scrapy爬虫框架支持自定义中间件结构,从而实现对爬虫数据的个性化处理。
2.3 Scrapy 基本架构
Scarpy由引擎、调度器、下载器、爬虫、管道、下载中间件、爬虫中间件七大部分组成[3]。其中各组件的作用如下:
1)引擎主要负责数据在Scrapy中的流动。
2)调度器主要负责处理来自引擎的请求。
3)下载器主要负责获取网页的信息并交给引擎进行处理。
4)爬虫主要负责提取符合由开发者编写的提取规则的字段。
5)管道主要负责对相关字段的处理。
6)下载中间件是位于下载器与引擎之间的结构,主要负责数据在引擎与下载器中间流动过程的处理。
7)爬虫中间件是位于爬虫与引擎之间的结构,主要负责数据在引擎流与爬虫中间流动过程的处理。
2.4 爬虫总体架构设计
本文将爬虫分为三个模块即网页信息抓取模块、中间件模块以及数据处理模块[4]。
网页信息抓取模块首先根据定义的URL地址分析网页element结构,再根据由开发者自定义的XPath提取相关字段。
中间件模块负责通过User-Agent伪装,代理IP等技术实现反反爬。
数据处理模块将对爬虫爬取的数据进行相关处理,然后在MySQL数据库中实现持久化存储。
2.5 数据流控制
Scrapy对研招网硕士目录数据流的控制如下:
1)引擎从爬虫中获得一个初始请求即start_url(目录页的url地址)。
2)爬虫通过对字段的提取得到院校页的url,并放入调度器中。
3)调度器将请求提交给引擎。
4)引擎通过下载中间件把相关请求提交给下载器处理。
5)下载器获得相应的院校页的响应数据,并提交给引擎处理。
6)引擎将来自下载器的数据经过爬虫中间件提交给爬虫处理。
7)爬虫通过相关的提取规则得到招考信息页的url,并放入调度器中。
8)调度器将请求提交给引擎。
9)引擎通过下载中间件把相关请求提交给下载器处理。
10)下载器获得相应的招考信息页的响应数据,并提交给引擎处理。
11)引擎将来自下载器的数据经过爬虫中间件提交给爬虫处理。
12)爬虫爬取相关信息。
2.6 爬虫字段的设计
设计爬取硕士目录的学校名稱、学校所在地、招生院系、招生人数、考试科目、研究方向、指导老师、学科门类、学科类别、学习方式、招生专业、是否自划线、是否拥有研究生院、是否拥有博士点。并采用Scrapy.Item的属性定义在Items.py文件中。
2.7 爬虫策略的设计
其中Scrapy爬虫采用深度优先爬虫策略[5]设计如下:
1)首先用户自定义相关参数。
2)爬虫获取start_url。
3)分析当前页的网页结构与特点,根据用户自定义爬取规则爬取当前目录页的相关数据。
4)跳转至院校页。
5)分析当前页的网页结构与特点,根据用户自定义爬取规则爬取当前院校页的相关数据。
6)跳转至招考信息页。
7)分析当前页的网页结构与特点,根据用户自定义爬取规则爬取当前招考信息页的相关数据。
8)将相关数据存入数据库中。
9)返回院校页。
10)判断是否存在下一页,若存在下一页,则请求翻页处理,并执行步骤5,直至不存在下一页;若不存在下一页,则返回目录页。
11)判断是否存在下一页,若存在下一页,则请求翻页处理,并执行步骤3,直至不存在下一页;若不存在下一页,则将数据导出为Excel文件,程序结束。
示意图如图2所示。
其中为了实现对网页中相关信息的提取,文章选用了XPath作为选择器,XPath是一个轻量级的小型查询语言[6]。如需获得院校页的url地址,可通过使用response.xpath(‘//tbody/tr//a/@href)来对具体学校的URL地址进行提取。
2.8 反反爬策略的设计
由于研招网具有一定的反反爬能力,为了实现对网站的正常访问采用随机User-Agent伪装以及IP代理的方式来规避服务器对爬虫对封禁。
其中Scrapy默认携带的请求头为爬虫的请求头,服务器可以对其识别,并进行封禁处理[7]。本文设计了一个User-Agent池,User-Agent池中含有大量的User-Agent请求头,并且通过random模块中的choice方法与自定义中间件UserAgentProxyMiddlerware来实现对爬虫User-Agent的随机伪装,从而实现使服务器认为是浏览器发送的正常请求。
当同一个IP地址连续多次发送请求时,服务器也会认为此请求为爬虫发出的,也会对其进行封禁处理[8]。为了规避服务器对爬虫的封禁,采用了代理IP,通过每发送一次网络请求,变更一次IP地址,从而使服务器认为是由多个来自不同的计算机对其发送的网络请求。
2.9 持久化存储
当完成一次数据提取后,为了对数据进行持久化存储,由此选用了关系型数据库MySQL,并采用pymysql模块作为程序与数据库连接的中间桥梁,通过编写SQL语句进行对数据库的操作。并通过DownloadMiddleWare中的open_spider方法与close_spider方法实现对数据库的连接与断开[9]。其中open_spider方法与close_spider方法在同一个爬虫程序中有且仅执行一次。通过process_items方法将items存入MySQL数据库中。
同时可以采用编写SQL语句的方式完成对数据库中信息进行相关查询工作,或者通过利用pandas模块,将数据库内容导出为Excel文件进行查找或筛选。
3 结束语
本文通过设计了一个Scrapy爬虫对研招网硕士目录进行了相关信息的爬取,并进行了持久化存储,支持使用SQL语句或者Excel来进行相关数据的查询与筛选。可以使人们通过考试专业课对院校进行选择。打破了研招网按学校查询的思想,为考生提供了新的选择。
参考文献:
[1] 刘宇,郑成焕.基于Scrapy的深层网络爬虫研究[J].软件,2017,38(7):111-114.
[2] 孙瑜.基于Scrapy框架的网络爬虫系统的设计与实现[D].北京:北京交通大学,2019.
[3] Xie D X,Xia W F.Design and implementation of the topic-focused crawler based on scrapy[J].Advanced Materials Research,2013,850/851:487-490.
[4] 安子建.基于Scrapy框架的网络爬虫实现与数据抓取分析[D].长春:吉林大学,2017.
[5] 刘世涛.简析搜索引擎中网络爬虫的搜索策略[J].阜阳师范学院学报(自然科学版),2006,23(3):59-62.
[6] 袁宇丽.基于HTML网页的Web信息提取研究[D].成都:电子科技大学,2006.
[7] 陈辉.基于SCRAPY框架的网络爬虫封锁技术破解研究[J].科技视界,2020(6):224-225.
[8] 韩贝,马明栋,王得玉.基于Scrapy框架的爬虫和反爬虫研究[J].计算机技术与发展,2019,29(2):139-142.
[9] 郑岚.Python访问MySQL数据库[J].电脑编程技巧与维护,2010(6):59-61.
收稿日期:2022-03-16
基金项目:2020年湖南省大学生实践创新训练项目:校园东街微信小程序的设计与开发(项目编号:S202010555141)
作者简介:伍高巍(2000—),男,湖南娄底人,本科在读,主要研究方向为软件工程、计算机视觉等;刘杰(1974—),男,湖南衡阳人,副教授,博士,研究方向为软件工程、可信软件等;葛晓龙(2000—),男,河南濮阳人,本科在读,研究方向为软件工程等;徐望成(2000—),男,湖南衡阳人,本科在读,研究方向为软件工程等。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!