如何用python 爬虫抓取金融数据

Python05

如何用python 爬虫抓取金融数据,第1张

获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一。鉴于此,我拾起了Python这把利器,开启了网络爬虫之路。

本篇使用的版本为python3.5,意在抓取证券之星上当天所有A股数据。程序主要分为三个部分:网页源码的获取、所需内容的提取、所得结果的整理。

一、网页源码的获取

很多人喜欢用python爬虫的原因之一就是它容易上手。只需以下几行代码既可抓取大部分网页的源码。

import urllib.request

url='ar.com/stock/ranklist_a_3_1_1.html'  #目标网址headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0WOW64)"}  #伪装浏览器请求报头request=urllib.request.Request(url=url,headers=headers)  #请求服务器response=urllib.request.urlopen(request)  #服务器应答content=response.read().decode('gbk')   #以一定的编码方式查看源码print(content)  #打印页面源码

虽说抓一页的源码容易,不过在一个网站内大量抓取网页源码却经常遭到服务器拦截,顿时感觉世界充满了恶意。于是我开始研习突破反爬虫限制的功法。

1.伪装流浪器报头

很多服务器通过浏览器发给它的报头来确认是否是人类用户,所以我们可以通过模仿浏览器的行为构造请求报头给服务器发送请求。服务器会识别其中的一些参数来识别你是否是人类用户,很多网站都会识别User-Agent这个参数,所以请求头最好带上。有一些警觉性比较高的网站可能还会通过其他参数识别,比如通过Accept-Language来辨别你是否是人类用户,一些有防盗链功能的网站还得带上referer这个参数等等。

2.随机生成UA

证券之星只需带User-Agent这个参数就可以抓取页面信息了,不过连续抓取几页就被服务器阻止了。于是我决定每次抓取数据时模拟不同的浏览器发送请求,而服务器通过User-Agent来识别不同浏览器,所以每次爬取页面可以通过随机生成不同的UA构造报头去请求服务器,

3.减慢爬取速度

虽然模拟了不同浏览器爬取数据,但发现有的时间段可以爬取上百页的数据,有时候却只能爬取十来页,看来服务器还会根据你的访问的频率来识别你是人类用户还是网络爬虫。所以我每抓取一页都让它随机休息几秒,加入此句代码后,每个时间段都能爬取大量股票数据了。

4.使用代理IP

天有不测风云,程序在公司时顺利测试成功,回寝室后发现又只能抓取几页就被服务器阻止了。惊慌失措的我赶紧询问度娘,获知服务器可以识别你的IP,并记录此IP访问的次数,可以使用高匿的代理IP,并在抓取的过程中不断的更换,让服务器无法找出谁是真凶。此功还未修成,欲知后事如何,请听下回分解。

5.其他突破反爬虫限制的方法

很多服务器在接受浏览器请求时会发送一个cookie文件给浏览器,然后通过cookie来跟踪你的访问过程,为了不让服务器识别出你是爬虫,建议最好带上cookie一起去爬取数据;如果遇上要模拟登陆的网站,为了不让自己的账号被拉黑,可以申请大量的账号,然后再爬入,此处涉及模拟登陆、验证码识别等知识,暂时不再深究...总之,对于网站主人来说,有些爬虫确实是令人讨厌的,所以会想出很多方法限制爬虫的进入,所以我们在强行进入之后也得注意些礼仪,别把人家的网站给拖垮了。

二、所需内容的提取

获取网页源码后,我们就可以从中提取我们所需要的数据了。从源码中获取所需信息的方法有很多,使用正则表达式就是比较经典的方法之一。我们先来看所采集网页源码的部分内容。

为了减少干扰,我先用正则表达式从整个页面源码中匹配出以上的主体部分,然后从主体部分中匹配出每只股票的信息。代码如下。

pattern=re.compile('<tbody[\s\S]*</tbody>')  

body=re.findall(pattern,str(content))  #匹配<tbody和</tbody>之间的所有代码pattern=re.compile('>(.*?)<')

stock_page=re.findall(pattern,body[0])  #匹配>和<之间的所有信息

其中compile方法为编译匹配模式,findall方法用此匹配模式去匹配出所需信息,并以列表的方式返回。正则表达式的语法还挺多的,下面我只罗列所用到符号的含义。

语法    说明  

.    匹配任意除换行符“\n”外的字符  

*    匹配前一个字符0次或无限次  

?    匹配前一个字符0次或一次  

\s    空白字符:[<空格>\t\r\n\f\v]  

\S    非空白字符:[^\s]  

[...]    字符集,对应的位置可以是字符集中任意字符  

(...)    被括起来的表达式将作为分组,里面一般为我们所需提取的内容  

正则表达式的语法挺多的,也许有大牛只要一句正则表达式就可提取我想提取的内容。在提取股票主体部分代码时发现有人用xpath表达式提取显得更简洁一些,看来页面解析也有很长的一段路要走。

三、所得结果的整理

通过非贪婪模式(.*?)匹配>和<之间的所有数据,会匹配出一些空白字符出来,所以我们采用如下代码把空白字符移除。

stock_last=stock_total[:] #stock_total:匹配出的股票数据for data in stock_total:  #stock_last:整理后的股票数据

if data=='':

stock_last.remove('')

最后,我们可以打印几列数据看下效果,代码如下

print('代码','\t','简称','   ','\t','最新价','\t','涨跌幅','\t','涨跌额','\t','5分钟涨幅')for i in range(0,len(stock_last),13):        #网页总共有13列数据

print(stock_last[i],'\t',stock_last[i+1],' ','\t',stock_last[i+2],'  ','\t',stock_last[i+3],'  ','\t',stock_last[i+4],'  ','\t',stock_last[i+5])

学完Python之后,可以从事以下工作岗位:

1、web开发:Python拥有非常完善的与web服务器进行交互的库,以及大量免费前端网页模板,有非常优秀而且成熟的diangoWEB框架,功能齐全。

2、Linux运维:通过shell脚本去实现自动化运维,但是编程能力较弱,可以使用功能的库很少,而Python作为胶水语言,可以很方便的与其他想结合,对各类工具进行二次开发,形成一套自己的运维管理系统。

3、游戏开发:在游戏开发方面可能Python无法匹敌C++,但是由于Python脚本化的优点,类似于游戏剧本、游戏玩法逻辑等这种非常灵活的设计上,修改起来非常方便。如果用于开发一款游戏程序,Python是非常具有优势的。

4、网络爬虫:在爬虫方面,Python可以说是独领风骚了,Python具有非常丰富的库去网页文档的接口api以及后期网页文档的快速处理。

5、桌面软件:在Windows系统桌面开发领域,C++等语言应用十分广泛,而Python可以实现与C++无缝对接,并且同时支持QT以及GTK。

6、数据分析:python作为一门工程性语言,对于数据处理的类库是相当丰富的,比如有高性能的科学计算类库NumPy和SciPy。

7、人工智能:其实可以写人工智能语言有很多,为何Python是首先呢?因为Python是胶水语言,具有独特优势才具有如此好的效果,主要使用python是因为CPython和底层原因的融合使得开发起来更加方便。

更多技术干货,可关注:

python语言为基础。使用numpy, matplotlib 和 pandas等包。

python的历史:

python的创始人是吉多·范罗苏姆(Guido van Rossum),人称“龟叔”,1989年圣诞节期间,Guido开始写Python语言的编译器。他希望这个叫做Python的语言能符合他的理想:创造一种C和shell之间,功能全面,易学易用,可拓展的语言。

web开发--Python web框架包括最火的Django(官方的标语把Django定义为the framework for perfectionist with deadlines-大意是一个为完全主义者开发的高效率web框架),支持异步高并发的Tornado,短小精悍的flask,bottle。

网络编程,支持高并发的Twisted网络框架,Python3引入的asyncio使异步编程变的非常简单。

爬虫领域,python几乎是霸主地位,Scrapy\Request\BeautifuSoap\urllib等,想爬什么爬什么。

解释型:

执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一由又相应语言的解释器"翻译成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件。

应用程序不能脱离其解释器(想运行,必须先装上解释器,就像跟老外说话必须有翻译在场),但这种方式比较灵活,可以动态地调整,修改应用程序。代表语言有Python、Java、PHP、Ruby等。

编译型:把源代码一次性编译成二进制,然后在执行。