王蕾
[提要] 互联网金融数据中潜藏着未知的知识价值,但也存在着巨量的数据冗余。通过Python可以进行互联网金融数据的获取、解析、提取关键信息并进行存储,其方式方法是灵活多样的,可采用的开源库也比较多。获取数据时要遵守法律和道德规范,使用Python时可以依据实际的研究内容来决定需要采集的数据。Python是互联网数据的获取工具,也是进行互联网金融数据分析的基石。
关键词:Python;互联网金融;数据采集;数据解析
成果来源:河北省教育厅课题(QN2015151);保定市科技局课题(16ZF180);河北省智慧金融应用技术研发中心课题(XZJ2017003);河北省科技厅软科学研究计划项目(17450903D)
中图分类号:F83 文献标识码:A
收录日期:2017年3月17日
伴随着互联网的发展与移动应用的普及,互联网金融得到了长足的发展,伴随而来的是规模巨大的数据,金融从业者要通过数据挖掘、大数据分析获取有价值的信息,完成精准营销,进而降低营销成本,提高业绩。这时,一项重要的前置工作就是数据的采集,以便于后续的数据分析,尤其是实时数据分析。
一、互联网金融数据来源
要进行金融大数据分析,其数据来源可划分为内部数据来源和外部数据来源两种。内部数据来源是互联网金融企业内部数据库,较易得到,但是数据库中的数据往往不能直接用于分析,需要进行数据整合、清洗和转换等才能被使用。分析企业内部数据可以较好地对客户进行细分、了解金融产品组合特点,预测金融产品发展趋势,辅助进行金融决策,但从了解整个行业的发展角度来讲这并不够,需用到外部金融数据。外部金融数据的来源有多种形式:一是通过与数据拥有方签署合作协议来获取所需金融数据;二是购买金融数据库等方式来获取;三是通过数据采集工具来自行采集获取。第三种数据采集方式的优点是可以私人定制所需数据,缺点是对技术要求较高,同时不能违反网络数据采集的法律和相关道德约束,如应当遵守Robots Exclusion Protocol,否则可能会引发与“酷米客”与“车来了”之间数据纠纷类似的法律事件、产生隐私数据泄露、影响服务器性能等一系列问题。
二、互联网金融数据的分类
在利用数据采集工具自行采集互联网金融数据时会遇到多种类别的数据。按照行业领域划分,包括股票、证券、债券、期货等理财数据,P2P数据,众筹数据,电子商务数据,微博、微信、贴吧等社交平台互联网金融评论数据,新闻财经数据等。从数据自身的结构类型角度进行划分,包括数字、短文本、长文本、图片、音频、视频等。日期、价格、指数等多为数字或者短文本,评论、新闻等多为长文本,图片、音频、视频等随着通讯技术和互联网金融的发展也将成为互联网金融数据的重要来源。
三、互联网数据采集手段
针对上述外部数据采集中的第三种数据采集方式,即通过数据采集工具自行采集互联网数据的手段进行探讨。互联网数据的采集可采用网络爬虫,又称网页蜘蛛或网络机器人,其按照一定的规则,自动地抓取来自网络的程序或脚本。指定URL并不断从当前页面上抽取新的URL放入队列,直到满足一定的停止条件。网络爬虫在访问一个超文本链接时,可以从HTML标签中自动获取指向其他网页的地址信息,其间可依据关键词对所有相关网页信息进行存贮、解析和存储。常用的爬虫策略包括深度优先搜索策略、广度优先搜索策略和最佳优先搜索策略。页面内容和链接的重要性的不同会导致链接访问顺序的不同,其重要性評价方式包括基于内容评价、基于链接结构评价、基于增强学习和基于语境图的爬行等。
四、基于Python的金融数据采集
C++、C#、Java、Python等程序设计语言都可以作为网络爬虫的开发语言来进行互联网金融数据的采集。Python作为一种开源语言提供了丰富的API和工具,可以使用C语言、C++等来编写扩充模块,也可以使用第三方库,具有较高的灵活性,故采用Python来进行互联网金融数据的采集。在使用Python进行数据采集时,如果是小规模数据采集,可以使用requests+Beautiful Soup+re的架构来完成,使用requests库可以自动提交网络请求和自动爬取HTML页面,使用Beautiful Soup库和re正则表达式可解析HTML页面和提取页面关键信息;如果是较大规模数据的采集则可使用scraper架构或者Portia架构来完成。下面进行互联网金融数据采集的实证分析,针对淘宝网站的“大码女装”销售情况进行分析,需要获取商品名称、价格、销售量、产地、商家等信息。首先应查看其网站根目录之下的robots.txt文件,以得知该网站通过爬虫来获取数据时有哪些限制。接下来制定搜索策略,获取HTML页面信息,解析HTML文档,提取商品名称、价格、销售量等关键信息,最后存储商品信息。
(一)搜索策略的确定。以某URL为入口,分析最终URL队列形成方式以确定搜索策略。分析发现,其检索结果被放置于具有页码的多个页面,观察其URL所具备的特点http://s.taobao.com/search?q=”大码女装”&s=页码*每页商品显示数量,鉴于此可以确定此商品URL队列的获取原则。循环遍历次数为页面数量或自定义数量,为了不造成对网站服务器的负担,模拟了人类的访问频率,每获取一个页面信息,随即进行解析和存储并休眠2秒。try-catch处理了异常,提高了程序的健壮性。确定搜索策略后就要遍历得到页面信息。每次遍历实现对单个HTML页面信息的获取、解析和存储。页面信息的获取调用了自定义方法getHTML(),页面信息的解析调用了自定义方法parseHTML()。核心代码如下所示:
for i in range(页面数量):
time.sleep(2)
try:
url=start_url+str(每页商品数量*i)
html=getHTML(url)
parseHTML(html,goodslist)
saveGoodsList(goodslist,file_path)
except:
continue
(二)获取HTML页面信息。获取HTML页面信息需要获取HTML页面的源代码,可以调用requests库的get(url)方法,此方法是获取网页的常用方法之一,url作为其参数指明了要获取的资源路径,返回的页面信息被存储为Response对象中。Response对象的text即为HTML的页面内容。requests还包括post()、head()等方法。使用requests.get(url).text可以获得url地址所对应的HTML文档内容;使用f.write(requests.get(url).content)可以将url所指向资源以二进制的形式获得并保存至本地电脑,该资源可以是文本、图片、音频、视频等。以下为getHTML()方法中部分代码:
r=requests.get(url,header,timeout=30)
return r.text
(三)解析HTML文档,提取关键信息。获取页面信息后,就要对HTML页面内容进行分析以提取关键信息。整个解析过程中要对HTTP协议及HTML文档结构有足够的认识。当前要获取的是商品名称、价格、销售量、产地、商家等信息,分析HTML页面源代码发现其结构如下:
"raw_title":"2017胖妹妹春装***韩版宽松"
"view_price":"139.00"
"view_sales":"1245人付款"
"nick":"西加索旗舰店"
"item_loc":"广东 广州"
可以使用正则表达式直接提取,正则表达式是一个特殊的字符序列,它能方便地检查一个字符串是否与某种模式匹配。re库是python的标准库,主要用于字符串匹配。re的findall()可以实现在文本中检索全部能匹配的字符子串,并将检索结果以列表类型返回。re还包括search()、match()、split()等方法。通过salelt=re.findall(r'\"view_sales\"\:\"[\d].*?\"',html)方法可以从html中将所有匹配r'\"view_sales\"\:\"[\d].*?\"'格式的文本检索出来并放于salelt当中。这时就形成商品销售量的列表["view_sales":"40人付款","view_sales":"**人付款","view_sales":"**人付款"……]。其他信息如商品名称、价格、产地、商家等获取方式类似,更改匹配原则即可。
但是,此时还需要去除无关文本,形成每件商品的记录。当前有pricelt、salelt、nicklt、locallt等多个列表,可以逐个获取列表中的信息,形成每件商品信息,然后再将商品信息依次放入商品信息列表goodslist当中。sale=eval(salelt[i].split(':')[1]).strip('人付款')实现了从"view_sales":"**人付款"结构中获取销售量,其中salelt[i].split(':')[1]获取到'**人付款',strip()去除了多余字符串'人付款'。goodslist.append([price,sale,nick,……])实现了将一件商品信息的价格、销售量、商家、产地等多项信息放入goodslist。For循环中append方法的使用使得所有商品信息依次放入goodslist。核心代码如下:
for i in range(len(salelt):
try:
price=eval(pricelt[i].split(':')[1])
sale=eval(salelt[i].split(':')[1]).strip('人付款')
……
goodslist.append([price,sale,nick,……)
except:
continue
(四)商品信息的存儲。页面解析结束后就要对商品信息进行存储以便于进一步进行数据分析。数据存储时可以依据数据特点将其存储为CSV、EXCEL、XML等格式化文本,存储到SQL Server、MySQL、Oracle等关系型数据库,存储到MongoDB、Redis等非关系型数据库,或者进行数据索引存储等。此处存储为CSV格式,它是以纯文本形式存储表格数据,以逗号或制表符等为每条记录字段间的分隔符,所有记录具有相同的字段序列,具有方便导入Excel或数据库的特点。以文件续写的方式打开文件,为防止乱码的出现,编码方式设置为gb2312,因为商品信息列表goodslist中每一项仍为列表,故采用f.write(",".join(goods)+"\n")方式进行了写入。核心代码如下:
with open(“D://info.csv“,"a",encoding='gb2312')as f:
for goods in goodslist:
f.write(",".join(goods)+"\n")
(五)采集结果分析。最终采集数据放于info.csv中,如表1所示。采集结果与原始页面进行对比,发现其具有正确的对应关系。与使用人工来获取信息对比,使用python来获取数据具有同等或者说更高的准确性,速度更快,大大节省了时间与人力。(表1)
主要参考文献:
[1]刘艳平,俞海英,戎沁.Python模拟登录网站并抓取网页的方法[J].微型电脑应用,2015.
[2]齐鹏,李隐峰,宋玉伟.基于Python的Web数据采集技术[J].电子科技,2012.
[3]兰秋军.互联网金融数据抓取方法研究[J].计算机工程与设计,2011.
[4]陈琳.基于Python的新浪微博数据爬虫程序设计[J].信息系统工程,2016.