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用什么数据库比较好
尽量不要用Sybase,很难用。
(不依赖Sybase的略过本答案即可)* Python-sybase项目几乎无更新。
* Bug多多。
* 暂时没找到其他项目代替。
其实很多数据库python都可以链接使用的,看你自己擅长使用什么数据库了,如果对数据库什么的不是很了解的话就用mongodb吧,配合pymongo很好使用的,当然其他的数据库如mysql postgressql 等等都无压力的。
如何用python获取股票数据
在Python的QSTK中,是通过s_datapath变量,定义相应股票数据所在的文件夹。
一般可以通过QSDATA这个环境变量来设置对应的数据文件夹。
具体的股票数据来源,例如沪深、港股等市场,你可以使用免费的WDZ程序输出相应日线、5分钟数据到s_datapath变量所指定的文件夹中。
然后可使用Python的QSTK中,qstkutil.DataAccess进行数据访问。
如何用python在掘金量化抓取数据
TuShare财经数据接口 – 可以直接抓取新浪财经、凤凰财经的网站数据,包括行情、基本面、经济数据等等。
完全免费,简洁易用,API设计得非常友好,提取的数据格式是Pandas的DataFrame。
同时可以获取非高频实时数据(取决于网站更新速度,同事经验大约是15秒),一个极好的非高频股票策略数据解决方案。
如何在python中进行数据库的添加
你可以访问Python数据库接口及API查看详细的支持数据库列表。
不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。
DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。
Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。
Python DB-API使用流程:引入 API 模块。
获取与数据库的连接。
执行SQL语句和存储过程。
关闭数据库连接。
什么是MySQLdb?MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。
如何安装MySQLdb?为了用DB-API编写MySQL脚本,必须确保已经安装了MySQL。
复制以下代码,并执行:#!/usr/bin/python# -*- coding: UTF-8 -*- import MySQLdb 如果执行后的输出结果如下所示,意味着你没有安装 MySQLdb 模块:Traceback (most recent call last):File "test.py", line 3, in import MySQLdb ImportError: No module named MySQLdb 安装MySQLdb,请访问 ,(Linux平台可以访问:)从这里可选择适合您的平台的安装包,分为预编译的二进制文件和源代码安装包。
如果您选择二进制文件发行版本的话,安装过程基本安装提示即可完成。
如果从源代码进行安装的话,则需要切换到MySQLdb发行版本的顶级目录,并键入下列命令:$ gunzip MySQL-python-1.2.2.tar.gz$ tar -xvf MySQL-python-1.2.2.tar$ cd MySQL-python-1.2.2$ python setup.py build$ python setup.py install 注意:请确保您有root权限来安装上述模块。
数据库连接 连接数据库前,请先确认以下事项:您已经创建了数据库 TESTDB.在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
连接数据库TESTDB使用的用户名为 "testuser" ,密码为 "test123",你可以可以自己设定或者直接使用root用户名及其密码,Mysql数据库用户授权请使用Grant命令。
在你的机子上已经安装了 Python MySQLdb 模块。
如果您对sql语句不熟悉,可以访问我们的 SQL基础教程 实例:以下实例链接Mysql的TESTDB数据库:#!/usr/bin/python# -*- coding: UTF-8 -*- import MySQLdb# 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# 使用execute方法执行SQL语句 cursor.execute("SELECT VERSION()")# 使用 fetchone() 方法获取一条数据库。
data = cursor.fetchone() print "Database version : %s " % data# 关闭数据库连接 db.close() 执行以上脚本输出结果如下:Database version : 5.0.45 创建数据库表 如果数据库连接存在我们可以使用execute()方法来为数据库创建表,如下所示创建表EMPLOYEE:#!/usr/bin/python# -*- coding: UTF-8 -*- import MySQLdb# 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# 如果数据表已经存在使用 execute() 方法删除表。
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")# 创建数据表SQL语句 sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL,LAST_NAME CHAR(20),AGE INT,SEX CHAR(1),INCOME FLOAT )""" cursor.execute(sql)# 关闭数据库连接 db.close() 数据库插入操作 以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录:#!/usr/bin/python# -*- coding: UTF-8 -*- import MySQLdb# 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 插入语句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME, AGE, SEX, INCOME) VALUES (\'Mac\', \'Mohan\', 20, \'M\', 2000)""" try:# 执行sql语句 cursor.execute(sql)# 提交到数据库执行 db.commit() except:# Rollback in case there is any error db.rollback()# 关闭数据库连接 db.close() 以上例子也可以写成如下形式:#!/usr/bin/python# -*- coding: UTF-8 -*- import MySQLdb# 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 插入语句 sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \\ LAST_NAME, AGE, SEX, INCOME) \\ VALUES (\'%s\', \'%s\', \'%d\', \'%c\', \'%d\' )" % \\(\'Mac\', \'Mohan\', 20, \'M\', 2000) try:# 执行sql语句 cursor.execute(sql)# 提交到数据库执行 db.commit() except:# 发生错误时回滚 db.rollback()# 关闭数据库连接 db.close() 实例:以下代码使用变量向SQL语句中传递参数:..................................user_id = "test123" password = "password" con.execute(\'insert into...
有哪些比较好用的Python数据库操作类库
尽量不要用Sybase,很难用。
(不依赖Sybase的略过本答案即可)* Python-sybase项目几乎无更新。
* Bug多多。
* 暂时没找到其他项目代替。
其实很多数据库python都可以链接使用的,看你自己擅长使用什么数据库了,如果对数据库什么的不是很了解的话就用mongodb吧,配合pymongo很好使用的,当然其他的数据库如mysql postgressql 等等都无压力的。
...