用Python获取银行网站上的存贷款利率表

用Python获取银行网站上的存贷款利率表。

项目背景

最近在做一个利率市场化咨询的项目,主要是协助银行搭建定价体系,提供定价策略,在充分考虑产品差异、顾客需求差异、时间差异、地点差异等因素基础上制定不同的存贷款定价方法。

在制定定价策略之前, 我们通常会分析客户所处的内外部的环境。外部环境分析可以分成宏观环境分析、行业环境分析等部分。 在行业分析(Industrial Analysis) 部分, 我们会确定客户的存贷款利率价格在业内处于什么样的水平。这就需要去采集各家银行的存贷款利率数据。

用Python获取银行网站上的存贷款利率表

然而Wind上没有相关的数据源可供下载。 这就需要不怕脏不怕累的小朋友们去百度搜索各家银行的网站,然后再用肉眼寻找躲在银行主页角落的“存贷款利率”的连接, 点击进入后将存贷款利率录入到Excel中。 这绝对是是对Junior耐心、眼力的一个考验… 这种没有什么附加值、重复性很强的工作,对于新人成长并没有什么帮助。但是怎么才能让这种无聊的工作自动化呢 ?

LifeIs Short,UsePython

这时候我们就要引出 简单、易学、功能强大的编程语言 Python了。我就在这里不赘述Python的优点了,只放一个一目了然的编程语言比较图:

用Python获取银行网站上的存贷款利率表

需求分析

在这项任务中,我们需要的自动化的过程并不多,只需要遍历各大银行主页,搜索到存贷款页面连接并打印或储存下来即可。 我们当然也可以直接将数据直接也爬取下来存在Excel中, 但因为各家银行网站架构设计各异,有些存贷款利率表甚至只是一张图片,页面分析的过程会比较耗时。所以,我们暂时不将数据爬取转存这项功能放入我们的需求清单中。

爬取过程

首先, 我们先找到一个银行网址导航网站。我选取的是360导航页面 (http://hao.360.cn/yinhanggengduo.html):

用Python获取银行网站上的存贷款利率表

并查看源代码:

用Python获取银行网站上的存贷款利率表

可以看出, 银行网址都被放入了 a 这个标签中。 我们可以使用第三方库 BeautifulSoup 美丽汤对该标签进行下载。

当然,不只是银行网址被放入了这个标签中,还有其他很多不相关的网站也是被放入了这个标签下。 这时候我们就需要 正则表达式对于该标签下的链接进行筛选。经过观察, 大部分银行网站的标签名都以“银行”结尾, 所以我们使用

” .银行 “

作为筛选的正则。而在银行页面上,存贷款的利率信息表的标签名,一般都会包含”款利率“这几个字, 所以我们使用:

”款利率. *”

作为寻找存贷款利率链接的正则。

下面是准备阶段的Python代码:

#encoding:utf-8
import urllib2
import re
from bs4 import BeautifulSoup

#建立列表储存url和对应的标签名
url = []
name= []
#建立集合, 将爬取过的页面放入,避免才重复
urlset =set("")
#用于筛选的正则表达式
source = ".银行"
temp = source.decode('utf8')
source2 = "款利率.*"
temp2 = source2.decode('utf8')
#导航网站作为我们爬取的根页面
response = urllib2.urlopen("http://hao.360.cn/yinhanggengduo.html")
html= response.read()
soup = BeautifulSoup(html,'html.parser')
#将满足条件的url和页面名称放入列表中
for tag in soup.find_all(name='a', text=re.compile(temp)):
   name.append(tag.string)
   url.append(tag.get('href'))

我们在获取好各大银行网站的url后, 我们需要进一步进入银行的存贷款利率信息表页面。但是经过进一步分析,我们发现,第二层的url一般都是短链接:

用Python获取银行网站上的存贷款利率表

无法直接使用,所以我们需要将短链接与域名进行拼接:

#域名拼接
url2 = link + tag2.get('href')

而如果第二层链接是可以直接访问的连接,这样拼接会导致访问错误,所以我们将连接转换为String, 通过判断其前四个Char是否为http来判断该连接为长连接还是短链接:

if href[0:4] == 'http':
    #长连接,不进行域名拼接
 url2 = tag2.get('href')

并在每次拼接后查询该连接是否输出过,如果已经输出过,则通过continue跳过循环。如果没有,则输出后加入urlset集合中:

if url2 in urlset:
    continue
else:
    urlset.add(url2)

Python输出部分代码:

num = -1
for link in url:
    num = num + 1
 try:
        linkresponse = urllib2.urlopen(link)
        htmlpage = linkresponse.read()
        pagesoup = BeautifulSoup(htmlpage, 'html.parser')
        for tag2 in pagesoup.find_all(name='a', text=re.compile(temp2)):
            #得到银行名称
   bname = tag2.get_text()
            #得到页面名称
   href = str(tag2.get('href'))
            if href[0:4] == 'http':
                #长连接,不进行域名拼接
    url2 = tag2.get('href')
                if url2 in urlset:
                    #输出过, 跳出循环
     continue
    else:
                    #未输出过,放入集合
     urlset.add(url2)
            else:
                #域名拼接
    url2 = link + tag2.get('href')
                if url2 in urlset:
                    continue
    else:
                    urlset.add(url2)
            print name[num]+" " + bname +" "+ url2
    except:
        pass



运行结果

我们在完成代码部分后,运行该部分Python脚本。


用Python获取银行网站上的存贷款利率表

查看输出:

用Python获取银行网站上的存贷款利率表

用Python获取银行网站上的存贷款利率表

可以看出,我们需要的银行存贷款信息页面链接已经打印出来。 做咨询的小朋友们可以直接点击进入记录相关银行的存贷款利率了~

本文为专栏文章,来自:SAS中文论坛,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/41421.html 。

(1)
SAS中文论坛的头像SAS中文论坛专栏
上一篇 2017-02-12 11:07
下一篇 2017-02-13 15:24

相关文章

关注我们
关注我们
分享本页
返回顶部