未加星标

用Python爬取金融市场数据

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二03 | 时间 2019 | 作者 红领巾 ] 0人收藏点击收藏
一、写在前面

由于在平时的工作中,需要对某信托网的信托在售和资管在售数据进行统计分析,但是一条一条的输入,显然太过耗时耗力,于是萌生了写个爬虫的想法。

一门计算机语言,可以当做是在模仿人的目的或意图来进行一系列行为或动作,所以在写代码之前,首先要弄清楚你要干什么,如果是你,你每一步的动作是什么,然后将这一步步的动作通过代码传递给计算机,让计算机高效的帮你完成即可。

本文结合正则表达式和比较流行的beautifulsoup(bs4),对网页进行解析并提取数据,因此在正式进行之前,有必要简单介绍下正则表达式和bs4.

二、基础知识 1、正则表达式

具体的详细介绍可自行去网上补知识,这里只介绍一些规则和常用的用法。

#正则表达式 规则: 单字符: .:除换行以外所有字符 []:匹配集合中任意一个字符 \d:数字 \D:非数字 \w:数字、字母、下划线、中文 \W:非数字、字母、下划线、中文 \s:空格 \S:非空格 数量修饰: *:任意多次 +:至少1次 ?:非贪婪方式,可有可无 {m}:固定m次 {m+}:至少m次 {m,n}:m到n次 起始: ^:以啥啥开头 $:以啥啥结尾 常用组合和函数: .*:贪婪方式任意字符任意次数 .*?:非贪婪方式任意字符任意次数 r=re.compile(r'正则表达式',re.S): 最常用:将规则传递给某个参数以便反复使用 re.match\re.search\(字符串) re.findall(字符串) re.sub(正则表达式,替换内容,字符串) 2、bs4

同样,详细知识自行补,这里只介绍常用的用法:select结合选择器的用法。

#bs4用法 首先加载里面的BeautifulSoup: frombs4importBeautifulSoup soup=BeautifulSoup('网页响应回来的东西')

主要有以下几种提取规则:

1、获取标签 soup.a获取a标签(第一个) 2、获取属性 soup.a.attrs获取a标签下所有的属性和值,返回的是字典 soup.a['name']获取a标签下的name属性 3、获取内容 soup.a.string() soup.a.text()建议使用这个 4、find用法 soup.find('a')找到第一个a soup.find('a',title='')附加条件的查找 5、find_all用法 soup.find_all('a')找到所有a soup.find_all(['a','b'])找到所有a和b soup.find_all('a',limit=5)找到前5个a 6、select用法――重点 结合选择器使用,常用的选择器如下: 标签选择器:如div表示为div 类选择器:.表示,如class='you'表示为.you id选择器:#表示,如id='me'表示为#me 组合选择器:如div,.you,#me 层级选择器:如div.you#me表示选取div标签下的you类下的id为me的内容 再如div>.you>#me,>则表示只能是下面一级 三、开始实战――爬取某信托网的信托在售数据 1、爬取前的准备工作――梳理好代码的逻辑

正如前面所说,写代码之前,首先要清楚你想要干什么,如果是你,你是什么样的动作来达到你的这个目的或意图。

第一,你的目的或意图是什么,对于本例而言,我需要获取任意某页至某页信托在售产品的下面数据:产品名称、发行机构、发行时间、最高收益、产品期限、投资行业、发行地、收益分配方式、发行规模、最低收益、最高收益和利率等级划分情况这12个数据。

第二,如果是人,需要哪些动作来达到这个目的。我们来看下网页。动作就清晰了:

输入网址/搜索关键字 > 进入网站 > 点击红色框框里的信托产品和在售 > 录入下面绿色框框里的相关信息 > 发现信息不全,再点击这个产品,在详情页(再下一张图)继续录入。


用Python爬取金融市场数据
用Python爬取金融市场数据
2、开始爬取

既然动作清晰了,那就可以让计算机来模拟人的这个动作进行爬取了。

然后就是写代码的逻辑了。我们用做数学题常用的倒推法来梳理这个过程。

要想获取数据 < 你得解析网页给你的响应 < 你得有个响应 < 你得发送请求 < 你得有个请求request < 你得有个url。

然后我们再正过来解题:获取url > 构建request > 发送请求 > 获取响应 > 解析响应 > 获取所需数据 > 保存数据。

所以按照这个步骤,我们可以先做出一个大框架,然后在框架的基础上补充血肉。大框架,就是定义个主函数。

值得注意的是,本例中,每个产品的信息获取,我们都有二次点击的动作,即第一页数据不全,我们再点击进入详情页进行剩余数据的获取,因此,本例是有两层的数据获取过程的。第一层使用正则表达式,第二层使用bs4。

① 定义主函数

如下是这个主函数,前面的写入相关数据你可以先不管,这都是在第一步的获取url时,后补过来的。

回到前面的目的:提取任意某页至任意某页的数据,所以写个循环是必须的,然后在循环下方,两层网页的数据获取框架就出来了。(由于第二层网页的url是根据第一层网页的某个数据拼接出来的,而第一层网页是一下子提取整个页面所有产品的信息,所以第二层网页的提取也设置了个循环,对第一层网页的所有产品,一个一个点进去进行提取)

#定义一个主函数 defmain(): #写入相关数据 url_1='http://www.某信托网.com/Action/ProductAJAX.ashx?' url_2='http://www.某信托网/Product/Detail.aspx?' size=input('请输入每页显示数量:') start_page=int(input('请输入起始页码:')) end_page=int(input('请输入结束页码')) type=input('请输入产品类型(1代表信托,2代表资管):') items=[]#定义一个空列表用来存储数据 #写循环爬取每一页 forpageinrange(start_page,end_page+1): #第一层网页的爬取流程 print('第{}页开始爬取'.format(page)) #1、拼接url――可定义一个分函数1:joint url_new=joint(url_1,size=size,page=page,type=type) #2、发起请求,获取响应――可定义一个分函数2:que_res response=que_res(url_new) #3、解析内容,获取所需数据――可定义一个分函数3:parse_content_1 contents=parse_content_1(response) #4、休眠2秒 time.sleep(2) #第二层网页的爬取流程 forcontentincontents: print('第{}页{}开始下载'.format(page,content[0])) #1、拼接url id=content[0] url_2_new=joint(url_2,id=id)#joint为前面定义的第1个函数 #2、发起请求,获取响应 response_2=que_res(url_2_new)#que_res为前面定义的第2个函数 #3、解析内容,获取所需数据――可定义一个分函数4:parse_content_2,直接返回字典格式的数据 item=parse_content_2(response_2,content) #存储数据 items.append(item) print('第{}页{}结束下载'.format(page,content[0])) #休眠5秒 time.sleep(5) print('第{}页结束爬取'.format(page)) #保存数据为dataframe格式CSV文件 df=pd.DataFrame(items) df.to_csv('data.csv',index=False,sep=',',encoding='utf-8-sig') print('*'*30) print('全部爬取结束') if__name__=='__main__': main() ② 获取url ―― 第一层和第二层通用

由于我们需要访问两层的数据,所以希望定义一个函数,能对两层的URL都可以进行拼接。

如下图为第一层页面的内容和源码,由第二个红框中的内容(X-Requested-With:XMLHttpRequest),可知这是一个AJAX get请求,且携带者第三个红框中的数据,而第三个红框中的数据,又恰好是第一个红框中的url的一部分,即为:

http://www.某信托网.com/Action/ProductAJAX.ashx?加上第三个红框中的数据。

第三个框框中包括几个可变的数据:pageSize(表示一页显示多少产品);pageIndex(表示第几页);conditionStr(定义产品类型,1表示信托,2表示资管),其余的数据都是固定的(这其中有个_:1544925791285这种下划线带一串数字的东西,像是个随机数,去掉也没影响,我就给去掉了)。


用Python爬取金融市场数据

下图为第二层页面的内容和源码,可见只是一个简单的get请求,且网址很简单,就是一个http://www.某信托网.com/Product/Detail.aspx?加上一个id,而这个id又来自哪里呢,答案就在第一层网页的响应数据中(见再下面一幅图的红色框)。


用Python爬取金融市场数据
用Python爬取金融市场数据

通过上面的分析,第一层网页的请求url由一个固定的部分加上一些数据,第二层网页的url依赖于第一层的数据,我们先在主函数中将url_1、url_2和一些可变的数据写入(见上面的主函数),然后定义一个函数用来拼接两层的url即可,因为第一层网页url的固定部分长度为47,第二层的为43,这里使用一个长度条件来判断是拼接第一层还是拼接第二层。

#定义第1个分函数joint,用来拼接url defjoint(url,size=None,page=None,type=None,id=None): iflen(url)>45: condition='producttype:'+type+'|status:在售' data={ 'mode':'statistics', 'pageSize':size, 'pageIndex':str(page), 'conditionStr':condition, 'start_released':'', 'end_released':'', 'orderStr':'1', 'ascStr':'ulup' } joint_str=urllib.parse.urlencode(data) url_new=url+joint_str else: data={ 'id':id } joint_str=urllib.parse.urlencode(data) url_new=url+joint_str returnurl_new ③ 构建request + 获取response一条龙 ―― 第一层和第二层通用

获取url后,接下来就是构建request用来发送请求获取响应了,此处定义一个函数实现一条龙服务。

这里为了提防反爬,user_agent在多个里随机选,并使用了代理池(虽然不多),并且我电脑端也进行了局域网ip代理。

#定义第2个函数que_res,用来构建request发送请求,并返回响应response defque_res(url): #构建request的第一步――构建头部:headers USER_AGENTS=[ "Mozilla/5.0(compatible;MSIE9.0;windowsNT6.1;Trident/5.0)", "Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)", "Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Maxthon2.0)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TencentTraveler4.0)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TheWorld)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;AvantBrowser)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)", ] user_agent=random.choice(USER_AGENTS) headers={ 'Accept-Language':'zh-CN,zh;q=0.8', 'Connection':'keep-alive', 'Host':'www.某信托网.com', 'Referer':'http://www.某信托网.com/Product/Index.aspx', 'User-Agent':user_agent, 'X-Requested-With':'XMLHttpRequest'

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

代码区博客精选文章
分页:12
转载请注明
本文标题:用Python爬取金融市场数据
本站链接:https://www.codesec.net/view/627857.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(28)