沈 漪, 华敏敏
(无锡科技职业学院, 江苏 无锡 214028)
互联网包含了最有用的数据集,并且大部分数据可以免费公开访问。它们被嵌入在网站的结构和样式当中,可以通过网络爬虫技术来获取。
本文基于项目中获取福彩奖池数据的需求,对福彩网站进行爬取,获取最新的奖池数据。
从明确爬取需求到数据爬取成功,一般包含以下步骤:
1.明确要爬取的网站和数据。
2.下载网页,如需抓取的数据不在其中,即需抓取的数据在动态网页中,执行3,否则执行4。
3.分析网页结构,根据不同的动态技术使用合适的方法获取相关动态网页内容。
4.选择合适的方法抓取数据。
5.改进优化,提高爬虫效率。
Python语言是进行爬虫实现的最佳语言,本文选择Anaconda开发环境中的jupyter notebook进行Python开发调试与分析,Python版本选用Python3.6。
首先,能抓到奖池数据的网站比较多,本文选择中国福利彩票发行管理中心官方网站http://www.cwl.gov.cn/kjxx/ssq/kjgg/进行爬取。
要想爬取网页,我们首先将其下载下来。我们选择最基础的方式使用Python的urllib模块进行下载,代码如下:
代码中对于访问网站时出现5XX的错误(一般是服务器出现问题),会递归调用函数进行重试下载,参数num_retries用于设定重试下载的次数,其默认值为两次,增强了代码的健壮性。由于urllib.request.urlopen(url).read()返回的是字节型的数据,用decode('utf-8')转化成相应字符数据。
网页下载下来以后,发现奖池数据并不在其中,利用浏览器的F12网页分析工具对网页进行分析,在Network模块XHR选项中发现动态行为,分析代码找到相应动态访问的网址,并获取到相关访问属性,按照这些访问属性对动态访问的网址进行下载。代码如下:
其中,http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueCount=30为网页动态访问获取彩票中奖信息的网址,该网址不能直接访问,要设置相关访问属性,包括User-agent、Cookie等。
下载下来发现,返回的是Json格式的数据,奖池数据就包含在其中。然后,进行数据抓取,由于要抓取的数据量较小,而且在下载下来的Json格式数据中特征明显,我们直接使用正则表达式实现。代码如下:
代码返回的就是我们需要的最新奖池数据。经过多天多次测试,均能得到最新奖池数据。由于本项目需求中爬取的数据量较小,因而无需改进代码,效率已经可以达到项目要求。
本文从需求开始完整呈现了用Python进行网络数据爬取的全过程,由于场景特殊,选择的方法较为简单,考虑的因素也较少。遇到网页数据量大,爬取的数据较复杂的情况,要考虑的因素会复杂许多,比如下载缓存、并发下载等等。在数据抓取时,除了正则表达式,还可以选择Beautiful Soup、lxml等方式。要在不同的场景下做出适当的策略选择,也是爬虫实现的一大挑战。