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

2024-05-19 01:49

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

获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一。鉴于此,我拾起了Python这把利器,开启了网络爬虫之路。
本篇使用的版本为python3.5,意在抓取证券之星上当天所有A股数据。程序主要分为三个部分:网页源码的获取、所需内容的提取、所得结果的整理。
一、网页源码的获取
很多人喜欢用python爬虫的原因之一就是它容易上手。只需以下几行代码既可抓取大部分网页的源码。

import urllib.requesturl='ar.com/stock/ranklist_a_3_1_1.html'  #目标网址headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64)"}  #伪装浏览器请求报头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('')  body=re.findall(pattern,str(content))  #匹配之间的所有代码pattern=re.compile('>(.*?)和<之间的所有信息
其中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 爬虫抓取金融数据

2. 如何利用python抓取美股数据

一 准备环境
  1 安装tushare模块包。
pip install tushare
二 注册tushare账号,获取token(目前tushare pro版本必须有token值才能正常访问)
  访问https://tushare.pro/register?reg=380388  tushare官网进行注册,然后记录token值备用。
三 开始python编程
Python代码:
import tushare as ts
#设置token
token='你自己的token'
pro = ts.pro_api(token)
#获取002242.SZ日行数据
pa=pro.daily(ts_code='002242.SZ', start_date='20200701',end_date='20200716')
# 打印获取数据
print(pa)
 
运行程序,可见如下打印,002242.SZ最近两周的数据都在这里了。

3. 如何用python 接入实时行情数据

有专门的实时行情API接口,例如微盛的实时行情API接口,通过类似这样的接口就可以接入了。

如何用python 接入实时行情数据

4. 如何通过Python获取外汇数据

这个和用不用python没啥关系,是数据来源的问题。 调用淘宝API,使用 api相关接口获得你想要的内容,我 记得api中有相关的接口,你可以看一下接口的说明。 用python做爬虫来进行页面数据的获龋 希望能帮到你。

5. 如何用python获取股票数据

在Python的QSTK中,是通过s_datapath变量,定义相应股票数据所在的文件夹。一般可以通过QSDATA这个环境变量来设置对应的数据文件夹。具体的股票数据来源,例如沪深、港股等市场,你可以使用免费的WDZ程序输出相应日线、5分钟数据到s_datapath变量所指定的文件夹中。然后可使用Python的QSTK中,qstkutil.DataAccess进行数据访问。

如何用python获取股票数据

6. 如何利用python爬虫获取数据

北京买房时链家的房价只给了一小部分数据,远远不能满足需求。花了几个小时写了一个爬虫,爬下北京所有的小区信息及北京所有小区的历史成交记录,这样是不是很酷的爬虫。

7. python 中如何获取表单数据

使用Python访问网页主要有三种方式: urllib, urllib2, httplib urllib比较简单,功能相对也比较弱,httplib简单强大,但好像不支持session 1. 最简单的页面访问 res=urllib2.urlopen(url) print res.read() 2. 加上要get或post的数据 data={"na...

python 中如何获取表单数据

8. 如何通过网页抓取实时汇率 详细点,谢谢

python抓取汇率

1 # -*- coding: utf-8 -*- 2 """ 3 获取实时汇率 4 Created on Fri Oct 18 13:11:40 2013 5  6 @author: alala 7 """ 8  9 import httplib10 import re11 import MySQLdb12 import datetime13 14 URL = 'fx.cmbchina.com' #网站名15 PATH = '/hq/'           #页面路径16 HOST = 'localhost'      #数据库地址(ip)17 DB = "money"            #数据库名称18 USER = 'root'           #数据库用户名19 PSWD = 'sheet'          #数据库密码20 21 httpClient = None22 23 try:24     #抓去网页内容25     httpClient = httplib.HTTPConnection(URL, 80, timeout=30)26     httpClient.request('GET', '/hq/')27     response = httpClient.getresponse()28     html = response.read()    29     #print html30     31     #用正则表达式抓去汇率数据32     reg = re.compile(r"""33     \s*\s*(?P\S+)\s*\s*         #交易币34     \s*(?P\d+)\s*\s*                  #交易币单位35     \s*(?P\S+)\s*\s*  #基本币    36     \s*(?P\d+\.\d+)\s*\s*       #中间价37     \s*(?P\d+\.\d+)\s*\s*                     #卖出价38     \s*(?P\d+\.\d+)\s*\s*                     #现汇买入价39     \s*(?P\d+\.\d+)\s*\s*                     #现钞买入价40     \s*(?P\d+:\d+:\d+)\s*\s*                       #时间41     """, re.MULTILINE | re.X)42     rows = reg.findall(html)43     #打印汇率数据44     for r in rows:45         print ','.join(map(str,r)), '\n'46         47     #数据库操作48     #确保mysqldb已经安装,可以用下面的命令安装49     #pip install MySQL-python50 51     #建立和数据库系统的连接52     conn = MySQLdb.connect(host=HOST, user=USER,passwd=PSWD)53 54     #获取操作游标55     cursor = conn.cursor()56     #执行SQL,创建一个数据库.57     cursor.execute("CREATE DATABASE IF NOT EXISTS " + DB)58 59     #选择数据库60     conn.select_db(DB);61     #执行SQL,创建一个数据表.62     cursor.execute("""CREATE TABLE IF NOT EXISTS exchange_rate(63                     name VARCHAR(50) COMMENT '交易币' PRIMARY KEY, 64                     unit INT COMMENT '交易币单位',65                     base VARCHAR(50) COMMENT '基本币',66                     midPrice FLOAT COMMENT '中间价',67                     sellPrice FLOAT COMMENT '卖出价',68                     buyPrice1 FLOAT COMMENT '现汇买入价',69                     buyPrice2 FLOAT COMMENT '现钞买入价',70                     time DATETIME COMMENT '时间' ) """)71     records = []                72     for r in rows:73         (name,unit,base,midPrice,sellPrice,buyPrice1,buyPrice2,time) = r74         time = datetime.datetime.strptime(datetime.datetime.now().strftime('%Y-%m-%d')75             + " " + time,'%Y-%m-%d %H:%M:%S')76         record = (name,int(unit),base,float(midPrice),float(sellPrice),77                   float(buyPrice1),float(buyPrice2),time)78         records.append(record)79     #print records80     #更新汇率81     cursor.executemany("REPLACE exchange_rate VALUES(%s,%s,%s,%s,%s,%s,%s,%s)"82             ,records);83     conn.commit()84 85     #关闭连接,释放资源86     cursor.close();87         88 except Exception,e:89     print e90 finally:91     if httpClient:92         httpClient.close()

最新文章
热门文章
推荐阅读