经济学院经济学家也要学点网络爬虫技术丨《经济资料译丛》精选NO.11
Posted 厦门大学经济学院
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经济学院经济学家也要学点网络爬虫技术丨《经济资料译丛》精选NO.11相关的知识,希望对你有一定的参考价值。
编者按
厦门大学经济学院《经济资料译丛》创刊于1981年,是国内公开发行的经济管理类学术期刊。2013年以来,本刊重新定位为国内高质量的通俗经济学学术期刊,力图通俗简明地介绍国内外财经学科建设和学术研究的最新进展和成果,倡导运用经济学、管理学的理论和方法来解释现实中有关的社会现象和社会问题,强调经济学直觉和经济学思维方式的运用和应用。自2013年以来本刊发表了很多国内外知名学者的可读性强的高质量文章,受到了广大读者的好评,已经成为国内最好的通俗财经学术期刊之一。
为使本刊的优秀文章惠及更多读者,普及经济学常识和经济学思维方式,促进学术探索争鸣和财经学科发展,我们将不定期择选《经济资料译丛》优秀文章推送,同时也欢迎广大读者踊跃投稿。(来稿请将word文档发至编辑部邮箱 jzyc@xmu.edu.cn)
《经济资料译丛》编辑部
钟锃光
作者为计量经济学教育部重点实验室(厦门大学)副主任,高级实验师。
本文原撰写于2014年,作者近日略作更新后选登。
经济学家也要学点网络爬虫技术
选自《经济资料译丛》2014年第2期
厦门大学经济学院
钟锃光
1. 经济学实证研究中的的网络数据以及网络数据的特点
随着科技的发展,人们正面临信息爆炸。2010年,零售巨头沃尔玛每小时都要处理100多万笔交易,为数据库上传大概2,500兆数据,相当于美国国会图书馆存书数的167倍。[1]沃尔玛在2011年收购了数据处理公司Kosmix,成立了沃尔玛实验室,专门针对大数据开发了一系列的产品。可想而知,这个世界上数据量多到难以想像的地步,而且还在不断地快速增长,它们对世界的影响也越来越大。
与此同时,经济学家的研究也越来越离不开数据的支持。以2012年第1期的《经济研究》为例,11篇学术文章,除了一篇纯理论研究的文章外,其余10 篇均引用了各种数据。在中国经济学工作者常常访问的论坛里也充斥大量关于数据的下载、交换和交易的信息。为了获取所需的数据,经济学家不得不投入大量资金来搜集、购买各种数据库。
如果数据已经被很好的整理,即使需要高价购置,对经济学家而言已属幸运,实际上很多研究所需的数据往往无处寻觅或者分散在多处。好在随着互联网的发展,电子商务、电子政务的逐渐推广,部分数据在网站上直接公开了,只是并未以良好的格式加以组织、对研究者不够友好。
笔者在十年前做一个厦门市场房地产交易价格的论文时就碰到无法获取交易价格的问题,转而向多家在线房地产代理商索取数据,结果当然可想而知。被拒绝后,笔者对在线房地产代理商的网站进行了研究,并决定采用爬虫技术(web crawler)收集数据,最后完成了任务。
很多互联网上的“大数据”都可以类似的方法收集,比如,地方政府出让土地时需要在报纸和互联网上公告地块信息、很多城市的空气监测站发布每天甚至每小时的空气质量数据、各个城市的天气预报数据、携程网上的机票价格、Google trend提供的搜索信息等,这些数据都已经被搜集来做经济学研究。比如,斯坦福大学经济系的Scott Baker 就用Google trend 的数据来研究失业保险对工作搜寻强度的影响。
2. 如何利用网络爬虫技术有效率地抓取网上数据
2.1 爬虫技术简介
爬虫(web crawler)是一种专门的程序,用于在互联网上自动抓取内容。常见的爬虫都来自搜索引擎公司。在互联网刚刚兴起的1994年,yahoo采用了层次归类的方法来索引当时的互联网站点,在站点数目较少的时候,手工还能处理为数不多的数据,但随着互联网的发展,就需要自动化的工具来收集数据、更新内容、根据网站内容的链接来发现新的页面和网站,这时爬虫就变得必不可少了。早期的爬虫主要功能是索引网站中的文本内容,随着技术的发展,爬虫的功能也越来越强,例如对图片、视屏与内容的关联,对各种数据格式(如pdf、doc、xls)的解析等。
在经济学研究中,其实并不需要像搜索引擎公司那样开发一种功能特别强大的爬虫,需要的是使用爬虫技术,能方便、大批量的下载网站上的数据,并且能够把数据整理成实证研究所需要的格式。
2.2 爬虫技术原理
用户在访问网页的时候,可能是打开某个网站作为起步,然后通过在浏览器上显示的该网站的内容,再加以浏览、点击等等,从而在不同的站点间跳转并获取信息。个人和服务器之间的交互以浏览器作为中介,浏览器把用户的点击,输入转化成REQEUST(请求)并传输给服务器,服务器收到请求后,根据请求的内容,按需生成浏览器可以识别的数据格式,作为RESPONSE(响应)传输给浏览器,浏览器解析服务器传递的内容,并把它显示成图文并茂的页面,这就完成了一次交互。可以看到,一次交互由 以下几个步骤组成:
图1:浏览器和服务器的一次交互
一只简单的爬虫需要完成上述步骤中的1、2、5步,首先爬虫需要一个预先设置的起点,然后根据需要向服务器发送请求,这里的请求必须符合HTTP协议标准,在服务器看来,这个请求和正常浏览器发来的请求是一样的,所以照样生成相应的结果并返回给爬虫,这时爬虫收到的内容通常是html或其他浏览器可读的数据格式,但是爬虫不用显示这些内容,而是需要解析这些内容,或保存,或丢弃,或者从里面发现其他的Link (链接)来作为下一步的工作,这样一只爬虫就可以从一个起点,爬遍网上的每一个节点。
图2:爬虫工作原理
爬虫工作的关键一步是解析服务器返回内容得到想要的数据,只是这些数据原来是给浏览器准备的,对于普通人而言,那不是数据而是天书一样的乱码。服务器返回的数据有多种类型和格式,对于常见网页,服务器返回的是HTML格式,这是一种格式化的文本,和Tex有点类似,里面混杂着数据、格式、程序脚本、HTML标签等。
但是大多数时候没有这么幸运,如果不能直接下载csv/excel格式的数据,那么表格形式的网页也还算是不错的选择,只是要多费一些功夫,需要写一个HTML Parser(HTML解析器)来分析网页,过滤掉网页代码中那些显示图片、动画、广告的代码,把需要的数据提取出来,整理保存为csv文件,如果数据量太大,通常还需要一个队列和调度程序来处理页面中的翻页行为。
2.3 学习爬虫技术的建议
爬虫说起来原理并不复杂,但是涉及到的面比较广。而且随着互联网技术的发展,一些新的技术不断出现,也需要爬虫能够跟得上技术发展的步伐。
写一个爬虫,首先要理解HTTP协议和一些相关的知识,如javascript、HTML、DOM、XPATH、XML、JSON等,还可能根据具体的案例学习一些特殊知识。
其次还需要会一门顺手的语言工具,如果是简单的爬虫,SAS、R、MATLAB等经济学家熟悉的语言都可以在一些扩展包的支持下完成简单工作,但是他们的扩展包相对于目前程序设计语言的中最流行几种语言[1],那就少得可怜。根据在著名开源软件托管平台github 和热门程序员论坛stack overflow的调查统计,目前最流行的语言的前几名是Java、JavaScript、php、C#、C++、Python、C,这些语言经过多年的发展,拥有大量的库函数,扩展包,第三方工具,只要选择学习其中的一门,有基本的编程基础,很快就可以在扩展库的帮助下写出第一个简单的爬虫。
最后就是需要勤思考、多动手,有问题及时通过搜索引擎查询相关知识库。
3. 网络爬虫技术抓取网上数据的一个实例:抓取天气预报数据
https://www.wunderground.com/history/daily/cn/xiamen/ZSAM/date/2019-4-16?cm_ven=localwx_history
https://www.wunderground.com/history/daily/cn/xiamen/ZSAM/date/1997-1-1
这些气候信息在网页上以图文混排的方式显示,但是我们只关心页面后半部分的表格,通常一个简单的html parser (html 解析器) 就可以从繁杂的html源代码中提取我们需要的表格。可惜在本网页的源代码中找不到这个表格,这是新的动态显示技术(ajax)带来的门槛,要完整的理解数据是如何下载并在浏览器中呈现的,可以打开chrome浏览器的developer tools工具,观察客户端和服务器的历次数据交互。经过耐心细致的筛选后,可以发现这是一个复杂过程,浏览器先调用
https://api.weather.com/v3/location/point?language=en-US&apiKey=6532d6454b8aa370768e63d6ba5a832e&icaoCode=ZSAM&format=json
查询到ZSAM站对应的经纬度:latitude:24.512, longitude:118.092,
https://api.weather.com/v1/geocode/24.512/118.092/observations/historical.json?apiKey=6532d6454b8aa370768e63d6ba5a832e&startDate=19970101&endDate=19970101&units=e
至此我们才能看到数据的原始面目, 以一个时间点观测值为例:
observations":[{"key":"ZSAM","class":"observation","expire_time_gmt":852055200,"obs_id":"ZSAM","obs_name":"Xiamen","valid_time_gmt":852048000,"day_ind":"N","temp":59,"wx_icon":33,"icon_extd":3300,"wx_phrase":"Fair","pressure_tend":null,"pressure_desc":null,"dewPt":55,"heat_index":59,"rh":88,"pressure":30.06,"vis":4,"wc":59,"wdir":null,"wdir_cardinal":"CALM","gust":null,"wspd":null,"max_temp":null,"min_temp":null,"precip_total":null,"precip_hrly":null,"snow_hrly":null,"uv_desc":"Low","feels_like":59,"uv_index":0,"qualifier":null,"qualifier_svrty":null,"blunt_phrase":null,"terse_phrase":null,"clds":"CLR","water_temp":null,"primary_wave_period":null,"primary_wave_height":null,"primary_swell_period":null,"primary_swell_height":null,"primary_swell_direction":null,"secondary_swell_period":null,"secondary_swell_height":null,"secondary_swell_direction":null},
这是json格式的数据结构,可以简单的按文本解析,也可以调用 json parse 解析工具包来分析,并从中找到我们要的数据:temp:59。
要注意的是,URL中的apiKey参数,如果给出错误的值就不能返回正确的结果。事实上在本文第一稿时该网站还提供csv格式的数据下载,后面改为提供免费的api查询,现在网站还能找到api的说明文档。而现在已经完全改为商用,只能通过爬虫来免费下载数据。
在了解了厦门市1天的气候信息如何获取后,这时仅需要通过一个简单的循环即可获得1997至今年的厦门市机场观测点的历史气候信息。代码逻辑如下:
Loop 时间从1997/1/1开始到现在
生成URL
根据url下载对应的数据并分析json,格式化整理
合并保存到本地硬盘csv文件
End loop
如果要获得全中国的气候历史数据呢?那就需要更多的工作,从前面的工作可以看到ZSAM代表厦门机场观测点,那什么代表福州观测点?什么代表北京观测点,这些城市是否都有历史数据呢?在该网站上可以发现一份完整的列表:http://www.wunderground.com/about/faq/international_cities.asp,其中有该机构在中国采样的全部气象站列表,不是所有城市都拥有厦门这种代码为ZSAM的机场观测点,而是普遍拥有一个5位数字WMO(世界气象组织)编号的气象观察点,例如厦门还有一个观测点的WMO编码为59134。当然一个城市的两个观察点由于地理位置不同,结果不会完全一致。如果使用WMO代码查询厦门气象,也可以使用URL:
http://www.wunderground.ag/history/station/59134/2019/04/16/DailyHistory.html
其中59134表示厦门城市气象观察点的WMO编号,后面紧跟日期。有趣的是,这个网址返回的数据还是html格式,应该是改版后的漏网之鱼,改进后的获取全国历史气象数据的代码逻辑是:
分析气象站列表网页,获取全国气象站WMO 编号列表
Loop中国气象站WMO列表
Loop 时间从1997/1/1开始到现在
生成URL
根据url下载对应的数据,用html parse分析整理
合并保存到本地硬盘csv文件
End loop
End loop
这样一个中国城市历史气象数据的爬虫就完成了。这里只用到网页下载、字符串处理、文件读写等基本操作。读者可以尝试用python语言来实现它。
4. 网络爬虫的主要困难
从上一节的例子可以看到,使用爬虫下载数据,不仅需要技术,还需要细致和耐心,相似的页面可能采用不同完全不同的手段。
随着数据的重要性越来越被大家认识,对数据的公开的态度也分成两种,一种是提供各种公开的数据下载、查询接口,甚至直接提供开发API方便大家使用;一种是设置各种障碍,防止数据被第三方使用,为此各种障碍技术被不断开发出来。
对于有意开发代码下载数据的经济学研究者,国内市场有两本书可以作为很好的教材,Michael Schrenk著的《Webbots、Spiders和Screen Scrapers:技术解析与应用实践》,罗刚和王振东合著的《自己动手写网络爬虫》,两本书都比较详细的讲解了爬虫的开发、应用以及各种细节。
至于所用到的HTML、 Javascript、Json、web service 等相关细节知识,可以在开发过程中,根据数据的实际需要边学边用。如果缺乏编程基础,市场上还有一类半自动化的可定制爬虫。Newprosoft公司开发的Web Content Extractor即是此类产品,该产品本身是一个完整爬虫,但是预留了接口让用户可以配置起点、遍历规则、抓取数据的配置。对一些普通的业务,这类工具已经可以较好地完成工作。
http://www.kdnuggets.com/software/web-content-mining.html页面提供了该类软件的列表、既有商业软件,也有开源免费软件,但是这些软件都存在一个两难困境,如果简单易用,那功能就不够强大,如果功能强大,那么配置起来就很复杂,甚至比直接编程还困难。读者可以结合自己的实际情况斟酌选用。
厦门大学经济学院
http://se.xmu.edu.cn
长按二维码关注
以上是关于经济学院经济学家也要学点网络爬虫技术丨《经济资料译丛》精选NO.11的主要内容,如果未能解决你的问题,请参考以下文章
不满被辞退,一程序员写爬虫程序侵入公司后台删库泄愤,造成经济损失10余万元...