当前位置: 澳门新濠3559 > 编程 > 正文

每只股票的行情下载过程中都需要完成下载、落

时间:2019-10-13 08:39来源:编程
2.2.10 卡萨布兰卡房子外界指数量化雷达图模型 //TODO 量化外界目标参数(学位,大巴间距,公共交通具体,公园分布,商圈等) 故此,还不会Python的,想买房的,飞快来上学了!限期抢

2.2.10 卡萨布兰卡房子外界指数量化雷达图模型

//TODO 量化外界目标参数(学位,大巴间距,公共交通具体,公园分布,商圈等)

故此,还不会Python的,想买房的,飞快来上学了!限期抢购哦!

Python 爬虫

要写三个爬虫, 能够用一些为主的库, 也能够用爬虫框架 :

php 爬虫:新浪客商数量爬取和分析 - 阅读 - 掘金队(Denver Nuggets)

背景表明:小拽利用php的curl写的爬虫,实验性的爬取了新浪5w客商的中央音信;同时,针对爬取的数据,进行了简短的解析显示。demo 地址 php的spider代码和顾客dashboard的变当代码,整理后上传github,在私有博客和民众号更新代码库,程序...

ts.get_h_data('002337', start='2015-01-01', end='2015-03-16') #两个日期之间的前复权数据

parameter:
code:string,股票代码 e.g. 600848
start:string,开始日期 format:YYYY-MM-DD 为空时取当前日期
end:string,结束日期 format:YYYY-MM-DD 为空时取去年今日
autype:string,复权类型,qfq-前复权 hfq-后复权 None-不复权,默认为qfq
index:Boolean,是否是大盘指数,默认为False
retry_count : int, 默认3,如遇网络等问题重复执行的次数
pause : int, 默认 0,重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题

return:
date : 交易日期 (index)
open : 开盘价
high : 最高价
close : 收盘价
low : 最低价
volume : 成交量
amount : 成交金额

2.2.7 布Rees班房源成交量热力模型

网址爬虫的大约思路是 :

  1. 模仿网址登入哀告
  2. 互连网伏乞获取网页源代码
  3. CSS selector 或 xpath 选定必要的成分, 获取内容属性等
  4. 结构化数据并积攒到数据库
  5. 按时,并发实践爬虫
  • 有关 iOS 的爬虫, 能够参照他事他说加以考察小编前面包车型客车小说 iOS 抓取 HTML ,CSS X帕特h 分析数据

单机 30 分钟抓取豆瓣电影 7 万 数据:论爬虫战术的首要性 - 后端 - 丹佛掘金队

第一报告下侦查标准和结果:硬件:普通Computer一台(MacPro),IP地址三个,无代理IP语言:使用Python语言中的requests库开展抓取框架:使用本身写的简短爬虫框架PSpider(PSpider框架)速度:开启九14个线程,1846 秒抓取 72500...

您大概感兴趣的篇章:

  • Python使用代理抓取网址图片(四线程)
  • Python代理抓取并表达使用四线程达成
  • Python达成三十二线程抓取妹子图
  • python二十四线程抓取天涯帖子内容示例
  • Python 十六线程抓取图片效能比较
  • 尝试采纳Python多线程抓代替理服务器IP地址的亲自去做
  • python完毕多线程抓取博客园客户
  • 每只股票的行情下载过程中都需要完成下载、落地2个步骤,先看完这 2 个教程其一。Python完成十二线程抓取网页功效实例详解
  • Python之多线程爬虫抓取网页图片的示范代码

2.2.4 布Rees班房源均价热力模型

如图浮现布Rees班费城房源均价热力模型。//TODO 待分析

图片 1

 

最后

文章是本身爬取 V2EX 的上学整理

我的 V2 爬虫 : V2EX_Crawler

Laravel 下使用 Guzzle 编写多线程爬虫实战 - 后端 - 丹佛掘金

表明 Guzzle 库是一套强大的 PHP HTTP 央浼套件。 本文重视示范如何利用 Guzzle 发起多线程央求。 参照他事他说加以考察 Github 官方顾客接口文书档案 Guzzle 并发要求文书档案 Laravel LTS 5.1 - Artisan 文档 创设命令 1...

调用方法

2.2.3 柏林房源数据模型

图片 2

 

爬虫框架

  1. Scrapy
  2. PySpider

鉴于公司原因, 我接触的是 Scrapy

Scrapy 是贰个针锋相对成熟的框架, 十六线程, 并发数, 中间件, 超时, 自定义 header, UA, 数据仓库储存款和储蓄, Log, 布署 等等都有饱经世故的缓解方案和示范, 那也是本人接纳使用它的原因.

千真万确的科目
scrapy爬虫框架教程(一)-- Scrapy入门
动用Scrapy爬取全体果壳网客户详细新闻并存至MongoDB(附录制和源码)

用php实现一个简短的爬虫,抓取电影网址的录像下载地址 - 掘金队(Denver Nuggets)

明天没什么事,先看一下影片,就用php写了多个爬虫在录像网址上进行录制下载地址的抓取,半个多钟头,大约抓取了3万多条ftp地址数据,效果仍是能够的。这里计算一下抓取进程中遇见的主题材料1:通过访问浏览器来实践php脚本这种访谈方式实际并不契合用来爬网页,因为要受到...

依照queue与threading模块的线程使用相似选拔以下的覆辙:

2.2.9 费城屋家内部指数量化雷达图模型

温哥华房子雷达图深入分析,程序首先会爬取到海量温哥华待售的房产音讯,品级差=(最高值-最低值)/10的艺术把均价,实际使用率,梯户比例,楼层,楼间隔等指标划分10等分,然后客户输入本身心仪的屋宇,程序将总计改屋企的指标在海量房产中的雷达地点,支持客商急速精通心仪房产的参数配置。效果图如下:

图片 3

 

#雷达图显示房屋关注指标def drawRadarMap(chartName, arrLables, arrData, labelNum):
 #数据校验
 if labelNum < 0 or labelNum >10: return -1
 if len(arrLables) != labelNum or len(arrData) != labelNum: return -2
 #=======自己设置开始============
 #标签
 labels = np.array(arrLables) #数据
 data = np.array(arrData) #========自己设置结束============
 angles = np.linspace(0, 2*np.pi, labelNum, endpoint=False)
 data = np.concatenate((data, [data[0]])) # 闭合
 angles = np.concatenate((angles, [angles[0]])) # 闭合
 fig = plt.figure()
 ax = fig.add_subplot(111, polar=True) # polar参数!!
 ax.plot(angles, data, 'bo-', linewidth=2) # 画线
 ax.fill(angles, data, facecolor='r', alpha=0.25)# 填充
 ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
 ax.set_title(chartName, va='bottom', fontproperties="SimHei")
 ax.set_rlim(0,10)
 ax.grid(True)
 plt.show()

HTML & CSS & JS

w3school 是入门基础, 要用爬虫获取数据, 必得先通晓 HTML 的组织

写个抓取微博云音乐精粹商酌的爬虫 - 丹佛掘金

被起诉,所以删掉了 笔者的今日头条Live「Python 程序员的入门和升级」 迎接关心本人的微信徒人号获取越多Python相关的剧情(也足以直接寻找「Python之美」):...

class ThreadRead(threading.Thread):
 def __init__(self, queue, out_queue):
  '''
  用于根据股票代码、需要读取的日期,读取增量的日行情数据,
  :param queue:用于保存需要读取的股票代码、起始日期的列表
  :param out_queue:用于保存需要写入到数据库表的结果集列表
  :return:
  '''
  threading.Thread.__init__(self)
  self.queue = queue
  self.out_queue = out_queue
 def run(self):
  while true:
   item = self.queue.get()
   time.sleep(0.5)
   try:
    df_h_data = ts.get_h_data(item['code'], start=item['startdate'], retry_count=10, pause=0.01)
    if df_h_data is not None and len(df_h_data)>0:
     df_h_data['secucode'] = item['code']
     df_h_data.index.name = 'date'
     print df_h_data.index,item['code'],item['startdate']
     df_h_data['tradeday'] = df_h_data.index.strftime('%Y-%m-%d')
     self.out_queue.put(df_h_data)
   except Exception, e:
    print str(e)
    self.queue.put(item) # 将没有爬取成功的数据放回队列里面去,以便下次重试。
    time.sleep(10)
    continue
   self.queue.task_done()

2.2.8 德国首都房源成交量和成交价Pearson周密

//TODO 总计Pearson周全,显明量价比关系,确认卡拉奇房源当前状态和展望接下去或然的情况(有价有市,有市无价,有价无市),决断当前是否改上车。

动态页面

  1. 些微页面包车型大巴数量是 JS 动态加载的, 比如懒加载图片, 滚动加载越多等
    • 那儿, 大家直接发送网络需要获取到的页面, 并未执行 JS 代码, 所以懒加载的因素都尚为加载出来, 大家须要下边 2 个库.
  2. Python 代码调控 PhantomJS 加载页面, 然后 Selenium 模拟客商点击, 滚动荧屏, 触发网页中的 AJAX 加载更加多内容的恳求, 等要素都加载完全, 再爬取数据

Selenium : web的自动测量试验工具, 模拟点击按键, 滚动页面等
PhantomJS : 未有分界面的浏览器

没有疑问的课程
Python爬虫利器五之Selenium的用法
Python爬虫利器四之PhantomJS的用法

Python 和讯爬虫(最新) - 后端 - 掘金队(Denver Nuggets)

条件:python3.x外界重视包:requestsgithub项目地址 重要的标题:模拟登录: 和讯现在改用https央浼了,数据加密,不过难题非常的小,首要的是网页数据变动了,何况在呼吁时后台会对爬虫做一些剖断,由此在每便央浼是都亟待丰硕request hea...

废话十分的少说,直接上代码,

2.1.3 Python教您买房种类

1、网页阅览

首先分明爬取化龙巷费城住房来源,鲜明开地方址 log勾选,清空Filter后刷新网页,观望网页html代码。

2、网页爬取

透过Python3的requests库提供的HTTP央浼Get/Post通用方法模拟浏览器央浼生成全体相符法规的URL放入到行列,并循环需要符合要求的住房来源音信。央求响应html通过BeautifulSoup深入分析html,并透过find_all协作正则表达式提取到html有效数据并写入到文件待剖判。

3、多线程

爬虫最后目的正是爬取到越来越多契合顾客需要的多少,若是单线程试行,抓取成效有限,因而爬虫要求丰硕二十四线程机制。多线程的落到实处格局有多样,如thread,threading,multithreading,在那之中thread偏底层,threading对thread实行了必然打包。Python完成二十四线程的办法有二种函数或类包装。

 #多线程方式
 for i in generate_allurl(user_in_nub, user_in_city): #获取某城市
 print(i) for url in get_allurl(i):
 my_thread = threading.Thread(target=main, args=(url, arrIPList))
 my_thread.start() print(url)
 my_thread.join() print("current has %d threads" % (threading.activeCount() - 1)) #当前存活线程
 #线程池方式
 pool.map(main, [url for url in get_allurl(i)])

4、Headers设置

为规避反爬虫战术,后端乞求须求效法客户平日顾客从浏览器诉求,因此要求加多要求头。设置格局如下:

header = {'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.8', 'Cache-Control': 'max-age=0', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36', 'Connection': 'keep-alive', 'Referer': 'http://www.baidu.com/'}
res = requests.get(url, headers=header)

5、Session设置

6、IP代理池

爬虫出现就出生了反爬虫,反爬虫的面世就催生了反反爬虫,国学家黑格尔说过存在就是有理。因而不菲技能正是在伯仲之间中国和东瀛渐成长。找房网是有反爬虫IP封锁机制,为了防止万一反爬虫链接网限制爬取到越来越多多少样本支持与剖判。因而利用IP代理池的情势,每便必要都随便获得IP和端口访谈外界网址。获取IP代理池的法子有付费的和无需付费的办法可自动网络抓取并分析。

proxies={"http":"http://10.14.36.109:8080"}res = requests.get(url, headers=header, proxies=proxies)

7、监控

爬虫抓取是一个耗费时间较长的工程,由此需求加上监察和控制,定时报告抓取进度到业务方,确认整个爬虫程序是不是不奇怪奉行。//TODO

爬虫

PHP 爬虫之百万等级微博客商数量爬取与剖判 - 后端 - 掘金队(Denver Nuggets)

本次抓取了110万的客商数据,数据分析结果如下:开荒前的预备安装Linux系统(Ubuntu14.04),在VMWare虚构机下安装二个Ubuntu;安装PHP5.6或上述版本;安装MySQL5.5或以上版本;安装curl、pcntl扩大。使用PHP的curl...

依附python此中threading模块与Queue模块组合能够平价的落到实处基于生产者-费用者模型的多线程模型。吉米my大神的tushare一直是常见python数据剖析以至业余量化爱好者心爱的免费、开源的python财政和经济数据接口包。

2.2.5 尼科西亚房源均价涨速热力模型

//TODO 明确涨速最快,最具投资价值的区域,数据来自官方网址布里斯班房土地资金财产消息体系:

Ref

woodenrobot 的 blog
崔庆才的个人博客

作用

2.2.6 温哥华房源成交量热力模型

//TODO

部署

在 Scrapy 官网 能够见见, 官方的布局指南,

  • scrapy/scrapyd 用来本地陈设
  • Scrapinghub Platform 是三个好像 Heroku 的云平台, 特地安排 Scrapy 爬虫

连带接口

2.2数据剖析 //TODO

大数量时期的互连网爬虫爬取到有效新闻,需求经过三翻五次洗涤、加工、计算、深入分析、建立模型等拍卖措施。数据分析是整合有效新闻并详细钻探和满含产生结论的历程。在实用中,数据深入分析可接济大家作出决断,以便利用适度行动。

1. 又只怕, 你学习爬虫只是想急速的抓取数据, 你能够品味上面包车型客车软件(网址), 能够不用写代码, 可视化的编纂抓取数据的天职
  • scrapinghub/portia
  • 火车头
  • 八爪鱼
  • import.io

1,股票(stock)列表消息接口

2.2.2 温哥华房源维度深入分析

卡萨布兰卡房源按多维度深入分析成交量/成交价趋势和Pearson周全剖析;放盘量和反叛价分析;房源内部参数(如2.1.1)量化深入分析,住房来源外部参数量化深入分析等办法。末了然释大家购房时相比较关注难点如怎么买的想望的好房,曾几何时是买房最棒的火候等。

图片 4

 

其它

成本者线程,当地存款和储蓄

1.2 Python库

Python为开采者提供丰盛代码库,开垦者从不会从零初叶开采,基础意义基本已经有现存的多谋善算者的框架或库帮忙,由此大幅的升官开垦者的开垦功效和增进代码强壮性。

图片 5

 

Python很轻便学!小编有弄三个沟通,互问互答,资源分享的沟通学习营地,假若您也是Python的学习者或然大拿都应接你来!㪊:548 377 875!一齐学习共同进步!

图片 6

 

柏林房价飞涨,但也阻挡不住祖国外省人民来布拉迪斯拉发买房的欲望。卡萨布兰卡房价动辄几百万,技士这种动物想在布拉迪斯拉发牢固压力山大。所以买房必然是人生一第一决定,必得货比三家。当前各类房产中介,种种开采商,各样楼盘。音讯多到大家鞭长莫及左右。由此技士就需求使用标准的优势通过一些办法获得有效数据,剖判筛选最优秀的房源。

Python 语言

大多数人学 Python 都以用作第二语言来学的, 所以既然已经有了别样语言的根基, 小编就推荐 2 个小而美的学科, 百页左右, 不啰嗦

  • 廖雪峰的 Python3 教程
  • A Byte of Python
    • 中文版 : 简明 Python 教程

先看完那 2 个教程其一, 就足以起头写 Python 了... 境遇不领悟的地点再去详细询问, 比方 generator, yield

总结

2.1.1 Python教您买房维度目的系列

Python教你买房首先大家须要鲜明大家购房时最关切的维度体系和指标种类。关怀器重维度和根本指标连串如图所示:

图片 7

 

Python教您买房,分为数据爬虫和大额深入分析。首先通过爬虫格局赢获得卡塔尔多哈房产交易网成功交易金额和交易价格并搜查缉获布拉迪斯拉发房价的势头,获得最合适的购房时间段,确认最好的上车时间。然后爬取优客逸家数据并按顾客关心维度深度分析帅选得出适宜的房子,做好一切上车的希图。

图片 8

 

2. 举个例子你未曾协和的服务器, VPS , 能够动用

mLab : 云 MongoDB 服务

生产者线程,读取市价

1.1.2 Linux

安装Python3.x.x,通过pip安装供给的第三方库。

基本库

  1. Beautiful Soup : 从 HTML 获取钦点的节点及数码
  2. Requests: HTTP for Humans : 网络央求库

最基本的就是那 2 个模块, 此外的数量存款和储蓄, 按时职务, 三十二线程等皆感到虎添翼

精确的课程
Python爬虫利器一之Requests库的用法
Python爬虫利器二之Beautiful Soup的用法
Scrapy笔记11- 模拟登入
Scrapy随机更改User-Agent和促成IP代理池

思路

1、Python基础

Python是一种面向对象、解释型自由语言,语法简洁清晰、基础代码库足够,覆盖互连网、文件、GUI、数据库、文本等领域。并能和别的主流语言交流协理制作。Python主要分为Cpython、Jpython、IronPython、PyPy等。解释型语言可移植行好,不过运维速度未有编译型语言,其次解释型语言源码不只怕像编写翻译型那样编写翻译成二进制串加密。

图片 9

 

   open high close low  volume  amount
date
2015-03-16 13.27 13.45 13.39 13.00 81212976 1073862784
2015-03-13 13.04 13.38 13.37 13.00 40548836 532739744
2015-03-12 13.29 13.95 13.28 12.96 71505720 962979904
2015-03-11 13.35 13.48 13.15 13.00 59110248 780300736
2015-03-10 13.16 13.67 13.59 12.72 105753088 1393819776
2015-03-09 13.77 14.73 14.13 13.70 139091552 1994454656
2015-03-06 12.17 13.39 13.39 12.17 89486704 1167752960
2015-03-05 12.79 12.80 12.17 12.08 26040832 966927360
2015-03-04 13.96 13.96 13.30 12.58 26636174 1060270720
2015-03-03 12.17 13.10 13.10 12.05 19290366 733336768

2.2.1 布Rees班购房词云深入分析

基于链家爬取样3199条待售房源,购买贩卖二手房产大家最关系的参数目的词云图。如图所示大家最关注的满五牛,户型方正等。在购房的的时候大家得以按此词云图详细驾驭各样须求大家关切的参数指标,心有成竹。

图片 10

 

#词云图def drawWordCloud(fileName):

d = path.dirname(__file__) # Read the whole text.

text = open(path.join(d, fileName), encoding='utf-8').read() # Generate a word cloud image 中文必得钦点地点汉语编码

wordcloud = WordCloud(font_path="C:WindowsFontssimsun.ttc", width=2400, height=1800).generate(text) # Display the generated image:

plt.imshow(wordcloud)

plt.axis("off") # lower max_font_size

wordcloud = WordCloud(max_font_size=40).generate(text)

plt.figure()

plt.imshow(wordcloud)

plt.axis("off")

plt.show()

class ThreadWrite(threading.Thread):
 def __init__(self, queue, lock, db_engine):
  '''
  :param queue: 某种形式的任务队列,此处为tushare为每个股票返回的最新日复权行情数据
  :param lock: 暂时用连接互斥操作,防止mysql高并发,后续可尝试去掉
  :param db_engine: mysql数据库的连接对象
  :return:no
  '''
  threading.Thread.__init__(self)
  self.queue = queue
  self.lock = lock
  self.db_engine = db_engine

 def run(self):
  while True:
   item = self.queue.get()
   self._save_data(item)
   self.queue.task_done()

 def _save_data(self, item):
   with self.lock:
    try:
     item.to_sql('cron_dailyquote', self.db_engine, if_exists='append', index=False)
    except Exception, e: # 如果是新股,则有可能df_h_data是空对象,因此需要跳过此类情况不处理
     print str(e)

2.1.2 Python教您买房框架

Python教您买房框架,首要分为5块,分别为主程序模块、代理IP模块、地图服务模块、可视化服务模块、指标页面模块等。主程序为第一运维代理IP模块,抓取带来IP并通过测验可用代理IP存入到代理池,定期线程定期洗涤带来并把无效的带动IP剔除出代理池,代理IP模块并提供外界API获替代理IP。主程序通过代理服务拜谒并抓取外界网页的有用信息并在主程序模块精通习HTML并写入到当麻芋果件。主程序会调用地图服务赢得经纬度音讯,并绘制热力图等。同一时间间可视化模块按期读取文件并转移可视化图形报表供业务侧深入分析应用。

图片 11

 

1、主服务模块

主程块通过Api提要求前端客户登陆和获取顾客交互输入,通过参数剖判获取得到顾客的急需组装诉求,获代替理IP转载呼吁到对象地点获取指标数据,再次回到数据经过html分析获得管用数据写入到文件地图服务和可视化推销员产自身的图纸报表,辅佐得出Python教你买房的数量扶持。

2、IP代理服务模块

#!/usr/bin/env python3# -*- coding: utf-8 -*-# function:定时抓取免费代理IP,并检查可用性,可用proxy存入数据库供业务方调用获取# Author:elideng# date: 2017-11-11import requestsfrom bs4 import BeautifulSoupimport tracebackimport pymysqlimport threadingimport time'''
*@Function【爬取IpProxy】
*@Request: 请求 [in]
* param1 int iReqGetNum: 请求获取代理量
*@Response:响应 [out]
* param1 int iFinalGetNum: 最终获取代理量
*@Return:返回值 int : 0(成功) 其它失败
'''def GrabIpProxy():
 arrIpList = []
 User_Agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'
 header = {}
 header['User-Agent'] = User_Agent #url = 'http://www.xicidaili.com/nn/1'
 url = 'http://www.baidu.com'
 res = requests.get(url, headers=header) if res.status_code == 200:
 info = {}
 soup = BeautifulSoup(res.text, 'lxml')
 ips = soup.findAll('tr') for x in range(1, len(ips)):
 ip = ips[x]
 tds = ip.findAll("td")
 ip_port = tds[1].contents[0]   ":"   tds[2].contents[0]
 arrIpList.append(ip_port) #后续加上代理可用校验,非可用踢出代理池
 #print(ip_port)
 #计算列表量
 return arrIpList'''
*@Function【测试ipProxy是否可用】
*@Request: 请求 [in]
* param1 String desUrl: 测试目的地址
* param2 String ipProxy:代理IP端口
* param3 int iTimeout:超时时间
* param4 String feature:目的地址特征
*@Response:响应 [out]
* param1 int iFinalGetNum: 最终获取代理量
*@Return:返回值 :成功返回代理Proxy 失败返回空
'''def checkProxyIP(desUrl, ipProxy, iTimeout=3, feature=""): #确认带来iPaddress 2秒内能否
 #desUrl = 'http://www.baidu.com'
 header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'}
 proxies = {'http': 'http://'   ipProxy} #组装代理
 res = None # 声明
 exMsg = None
 try: #res = requests.get(url=desUrl, headers=header, proxies=proxies, timeout=iTimeout)
 res = requests.get(desUrl, proxies=proxies, timeout=iTimeout) # 代理方式请求,防止反爬虫
 soup = BeautifulSoup(res.text, 'lxml') #feature=""
 #print(soup.findAll(feature))
 except:
 exMsg = '* '   traceback.format_exc() if exMsg: return -1
 if res.status_code != 200: return -1
 if res.text.find(feature) < 0: return -1
 return 0#更新代理池IPdef updateProxy(ipProxy, vaildFlag="N"):
 smysql = pymysql.connect(host='127.0.0.1', user='root', passwd='elideng', db='test')
 cursor = smysql.cursor() try:
 cursor.execute('update t_proxy set FvaildFlag="%s" where Fproxy="%s" limit 1' % (ipProxy, vaildFlag))
 smysql.commit() #提交执行
 except:
 smysql.rollback()
 smysql.close() return 0#新增代理池IPdef insertProxy(ipProxy, vaildFlag="Y"):
 smysql = pymysql.connect(host='127.0.0.1', user='root', passwd='elideng', db='test')
 cursor = smysql.cursor() try:
 cursor.execute('insert into t_proxy values("%s", "%s", now(), now())' % (ipProxy, vaildFlag))
 smysql.commit() #提交执行
 except:
 smysql.rollback()
 smysql.close() return 0#获取Proxydef getProxy(proxyNum):
 smysql = pymysql.connect(host='127.0.0.1', user='root', passwd='elideng', db='test')
 cursor = smysql.cursor()
 proxyList=[] try: if proxyNum == -1:
 cursor.execute('select Fproxy from t_proxy where FvaildFlag='Y'') else:
 cursor.execute('select Fproxy from t_proxy where FvaildFlag='Y' limit %s' % (proxyNum))
 results = cursor.fetchall() for row in results:
 proxyList.append(row[0]) except: # Rollback in case there is any error
 smysql.rollback()
 smysql.close() return proxyListdef CheckIpProxyTimer():
 arrIpList = []
 arrIpList = getProxy(-1) #获取代理池全量有效代理IP
 #测试地址
 #feature = 'xxx' #目标网页的特征码, 暂时不启用
 desUrl = "http://www.baidu.com"
 for ipProxy in arrIpList:
 iRes = checkProxyIP(desUrl, ipProxy) if iRes: #Proxy验证通过
 setProxy(ipProxy, "Y") else:
 setProxy(ipProxy, "N") #失效无效代理if __name__ == '__main__': #0、爬取免费代理IP
 GrabIpProxy() #1、启动定时线程,定时测试并清洗数据库代理IP
 timer = threading.Timer(3600, CheckIpProxyTimer)
 timer.start() #2、设置定时器失效时间
 time.sleep(5)
 timer.cancel() #5秒后停止定时器,程序可一直执行

3、地图服务模块

#!/usr/bin/env python3# -*- coding: utf-8 -*-# Author:elideng# date: 2017-11-08from urllib.request import urlopen, quoteimport jsonfrom bs4 import BeautifulSoupimport os#根据地址获取经纬度def getlnglat(address):
 url = 'http://api.map.baidu.com/geocoder/v2/'
 output = 'json'
 ak = 'ATzU2rqfrFoQcImvG9mvGm9bxchxjLYL'
 add = quote(address) #由于本文地址变量为中文,为防止乱码,先用quote进行编码
 uri = url   '?'   'address='   add   '&output='   output   '&ak='   ak
 req = urlopen(uri)
 res = req.read().decode()
 temp = json.loads(res)
 lat=0
 lng=0
 if 0 == temp['status']:
 lat=temp['result']['location']['lat']
 lng=temp['result']['location']['lng'] return lat,lng#根据两个经纬度计算距离def getPlaceDistance():
 return 0#根据两个地点计算各类交通时间def getPlaceTime():
 return 0def drawHeatChart(date):
 file = open("data.js", "a ") #data.js
 file.seek(3) # 定位到第0行
 file.writelines(date) #写入源数据到热力图源文件
 file.close() return 0if __name__ == '__main__':
 HeatChartSrcFile = input('输入热力图源文件:') #data.js
 drawHeatChart(HeatChartSrcFile)

<!DOCTYPE html><html><head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
 <script
 src="http://www.stelionai.com/uploads/allimg/191013/0S92G916-11.jpg"
 integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
 crossorigin="anonymous"></script>
 <script type="text/javascript" src="http://www.stelionai.com/uploads/allimg/191013/0S92K255-12.jpg"></script>
 <script type="text/javascript" src="http://www.stelionai.com/uploads/allimg/191013/0S92LK1-13.jpg"></script>
 <script type="text/javascript" src="./data.js"></script>
 <title>热力图功能示例</title>
 <style type="text/css">  ul,li{list-style: none;margin:0;padding:0;float:left;}  html{height:100%}  body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}  #container{height:500px;width:100%;}  #r-result{width:100%;} </style></head><body>
 <div id="container"></div>
 <div id="r-result">
  <input type="button" onclick="openHeatmap();" value="显示热力图"/><input type="button" onclick="closeHeatmap();" value="关闭热力图"/>
 </div></body><script type="text/javascript">
 var map = new BMap.Map("container"); // 创建地图实例
 var point = new BMap.Point(114.061087, 22.528578); //自定义地图中点
 map.centerAndZoom(point, 12); // 初始化地图,设置中心点坐标和地图级别
 map.enableScrollWheelZoom(); // 允许滚轮缩放
 if(!isSupportCanvas()){
  alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')
 }
 heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":20});
 map.addOverlay(heatmapOverlay); var param = {data:window.points,max:100}; //读取data.js热力源数据并生成热力图
 console.log(param);
 heatmapOverlay.setDataSet(param); //是否显示热力图
 function openHeatmap(){
 heatmapOverlay.show();
 } function closeHeatmap(){
 heatmapOverlay.hide();
 setTimeout(function(){
 location.reload();
 }, 10000)
 }
 closeHeatmap(); function setGradient(){  var gradient = {};  var colors = document.querySelectorAll("input[type='color']");
  colors = [].slice.call(colors,0);
  colors.forEach(function(ele){
   gradient[ele.getAttribute("data-key")] = ele.value;
  });
 heatmapOverlay.setOptions({"gradient":gradient});
 } //判断浏览区是否支持canvas
 function isSupportCanvas(){ var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d'));
 }</script></html>

4、可视化模块

#!/usr/bin/env python3# -*- coding: utf-8 -*-# function:可视化服务# Author:elideng# date: 2017-11-05import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport plotlyimport plotly.plotly as pyimport plotly.graph_objs as go
plotly.tools.set_credentials_file(username='elideng', api_key='tsc3809760')#雷达图显示房屋关注指标def drawRadarMap(chartName, arrLables, arrData, labelNum):
 #数据校验
 if labelNum < 0 or labelNum >10: return -1
 if len(arrLables) != labelNum or len(arrData) != labelNum: return -2
 #=======自己设置开始============
 #标签
 labels = np.array(arrLables) #数据
 data = np.array(arrData) #========自己设置结束============
 angles = np.linspace(0, 2*np.pi, labelNum, endpoint=False)
 data = np.concatenate((data, [data[0]])) # 闭合
 angles = np.concatenate((angles, [angles[0]])) # 闭合
 fig = plt.figure()
 ax = fig.add_subplot(111, polar=True) # polar参数!!
 ax.plot(angles, data, 'bo-', linewidth=2) # 画线
 ax.fill(angles, data, facecolor='r', alpha=0.25)# 填充
 ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
 ax.set_title(chartName, va='bottom', fontproperties="SimHei")
 ax.set_rlim(0,10)
 ax.grid(True)
 plt.show()#皮尔逊作图def drawPearson():
 return 0

收获沪深上市公司核激情况。属性包罗:

提供期货(Futures)上市以来全部历史数据,默以为前复权,读取后存到本地,作为后续剖判的根基

  name industry area  pe outstanding  totals totalAssets
code
600606 金丰投资  房产服务 上海  0.00  51832.01 51832.01 744930.44
002285 世联行  房产服务 深圳 71.04  76352.17 76377.60 411595.28
000861 海印股份  房产服务 广东 126.20  83775.50 118413.84 730716.56
000526 银润投资  房产服务 福建 2421.16  9619.50 9619.50  20065.32
000056 深国商  房产服务 深圳  0.00  14305.55 26508.14 787195.94
600895 张江高科  园区开发 上海 171.60 154868.95 154868.95 1771040.38
600736 苏州高新  园区开发 江苏 48.68 105788.15 105788.15 2125485.75
600663 陆家嘴  园区开发 上海 47.63 135808.41 186768.41 4562074.50
600658 电子城  园区开发 北京 19.39  58009.73 58009.73 431300.19
600648 外高桥  园区开发 上海 65.36  81022.34 113534.90 2508100.75
600639 浦东金桥  园区开发 上海 57.28  65664.88 92882.50 1241577.00
600604 市北高新  园区开发 上海 692.87  33352.42 56644.92 329289.50

日常向来有在用Ali云服务器通过tushare的接口自动落地相关经济数据,但日复权增势数据曾在串行下载的经过个中,速度相当的慢,不常遭逢互联网原因还亟需重下。每只期货(Futures)的增势下载进程中都急需变成下载、落地2个步骤,叁个大概供给网络花费、一个内需数据库mysql的存取成本。2者原来就足以单独并行实行,是个杰出的“生产者-开销者”模型。

施行作用

实现

作用

code,代码
name,名称
industry,所属行业
area,地区
pe,市盈率
outstanding,流通股本(亿)
totals,总股本(亿)
totalAssets,总资产(万)
liquidAssets,流动资产
fixedAssets,固定资产
reserved,公积金
reservedPerShare,每股公积金
esp,每股收益
bvps,每股净资
pb,市净率
timeToMarket,上市日期
undp,未分利润
perundp, 每股未分配
rev,收入同比(%)
profit,利润同比(%)
gpr,毛利率(%)
npr,净利润率(%)
holders,股东人数

原先须要2,3个钟头技巧实行到位的天天复权市场价格增量落地,有效裁减至了1钟头之内,这里线程数并不上越来越多越好,由于复权市场价格读的是新浪接口,在高并发境况下会回到HTTP 503服务器过载的不当,其他高并发下可能供给接纳IP代理池,下载的时刻也必要尝试多个时刻举办。初次尝试,假若有越来越好的不二法门大概何地有考虑不周的地点应接留言建议依旧指正。

2,日复权市场价格接口

概念主线程

from Queue import Queue
stock_queue = Queue()
data_queue = Queue()
lock = threading.Lock()
def main():
 '''
 用于测试多线程读取数据
 :return:
 '''
 #获取环境变量,取得相应的环境配置,上线时不需要再变更代码
 global stock_queue
 global data_queue
 config=os.getenv('FLASK_CONFIG')
 if config == 'default':
  db_url='mysql pymysql://root:******@localhost:3306/python?charset=utf8mb4'
 else:
  db_url='mysql pymysql://root:******@localhost:3306/test?charset=utf8mb4'
 db_engine = create_engine(db_url, echo=True)
 conn = db_engine.connect()
 #TODO 增加ts.get_stock_basics()报错的处理,如果取不到信息则直接用数据库中的股票代码信息,来获取增量信息
 #TODO 增加一个标志,如果一个股票代码的最新日期不是最新日期,则需标记该代码不需要重新获取数据,即记录该股票更新日期到了最新工作日,
 df = ts.get_stock_basics()
 df.to_sql('stock_basics',db_engine,if_exists='replace',dtype={'code': CHAR(6)})
 # 计算距离当前日期最大的工作日,以便每日定时更新
 today=time.strftime('%Y-%m-%d',time.localtime(time.time()))
 s1=("select max(t.date) from cron_tradeday t where flag=1 and t.date <='"  today "'")
 selectsql=text(s1)
 maxTradeay = conn.execute(selectsql).first()
 # 计算每只股票当前加载的最大工作日期,支持重跑
 s = ("select secucode,max(t.tradeday) from cron_dailyquote t group by secucode ")
 selectsql = text(s)
 result = conn.execute(selectsql) # 执行查询语句
 df_result = pd.DataFrame(result.fetchall())
 df_result.columns=['stockcode','max_tradeday']
 df_result.set_index(df_result['stockcode'],inplace=True)
 # 开始归档前复权历史行情至数据库当中,以便可以方便地计算后续选股模型

 for i in range(3):#使用3个线程
  t = ThreadRead(stock_queue, data_queue)
  t.setDaemon(True)
  t.start()
 for code in set(list(df.index)):
  try:
   #如果当前股票已经是最新的行情数据,则直接跳过,方便重跑。
   #print maxTradeay[0],df_result.loc[code].values[1]
   if df_result.loc[code].values[1] == maxTradeay[0]:
    continue
   startdate=getLastNdate(df_result.loc[code].values[1],1)
  except Exception, e:
   #如果某只股票没有相关的行情,则默认开始日期为2015年1月1日
   startdate='2015-01-01'
  item={}
  item['code']=code
  item['startdate']=startdate
  stock_queue.put(item) # 生成生产者任务队列
 for i in range(3):
  t = ThreadWrite(data_queue, lock, db_engine)
  t.setDaemon(True)
  t.start()
 stock_queue.join()
 data_queue.join()

再次回到效果

如上即是那篇作品的全体内容了,希望本文的开始和结果对大家的学习或然职业有所自然的参照学习价值,假设非常我们能够留言调换,谢谢我们对剧本之家的支持。

调用方法

producerQueue=Queue()
consumerQueue=Queue()
lock = threading.Lock()
class producerThead(threading.Thread):
 def __init__(self, producerQueue,consumerQueue):
 self.producerQueue=producerQueue
 self.consumerQueue=consumerQueue



 def run(self):
 while not self.thread_stop:
  try:
  #接收任务,如果连续20秒没有新的任务,线程退出,否则会一直执行
  item=self.producerQueue.get(block=True, timeout=20)
  #阻塞调用进程直到有数据可用。如果timeout是个正整数,
  #阻塞调用进程最多timeout秒,
  #如果一直无数据可用,抛出Empty异常(带超时的阻塞调用)
  except Queue.Empty:
  print("Nothing to do!thread exit!")
  self.thread_stop=True
  break
  #实现生产者逻辑,生成消费者需要处理的内容 consumerQueue.put(someItem)
  #还可以边处理,边生成新的生产任务
  doSomethingAboutProducing()
  self.producerQueue.task_done()
 def stop(self):
 self.thread_stop = True

class consumerThead(threading.Thread):
 def __init__(self,lock, consumerQueue):
 self.consumerQueue=consumerQueue
 def run(self):
 while true:
  try:
  #接收任务,如果连续20秒没有新的任务,线程退出,否则会一直执行
  item=self.consumerQueue.get(block=True, timeout=20)
  #阻塞调用进程直到有数据可用。如果timeout是个正整数,
  #阻塞调用进程最多timeout秒,
  #如果一直无数据可用,抛出Empty异常(带超时的阻塞调用)
  except Queue.Empty:
  print("Nothing to do!thread exit!")
  self.thread_stop=True
  break
  doSomethingAboutConsuming(lock)# 处理消费者逻辑,必要时使用线程锁 ,如文件操作等
  self.consumerQueue.task_done()
#定义主线程
def main():
 for i in range(n):#定义n个i消费者线程
 t = ThreadRead(producerQueue, consumerQueue)
 t.setDaemon(True)
 t.start()
 producerTasks=[] #定义初始化生产者任务队列
 producerQueue.put(producerTasks)
 for i in range(n):#定义n个生产者钱程
 t = ThreadWrite(consumerQueue, lock)
 t.setDaemon(True)
 t.start() 
 stock_queue.join()
 data_queue.join()
import tushare as ts
ts.get_stock_basics()

回去结果

编辑:编程 本文来源:每只股票的行情下载过程中都需要完成下载、落

关键词: 澳门新濠3559