买房?不进?

发布时间:2018-11-15  栏目:Python  评论:0 Comments

1、Python基础

Python是如出一辙栽面向对象、解释型自由语言,语法简洁清晰、基础代码库丰富,覆盖网、文件、GUI、数据库、文本等世界。并会和其余主流语言沟通协助制作。Python主要分为Cpython、Jpython、IronPython、PyPy等。解释型语言可移栽行好,但是运行速度没有编译型语言,其次解释型语言源码无法像编译型那样编译成二进制串加密。

图片 1

 

有的是时分咱们且觉着有点失去是以就之口径不同意或者是外因的侵扰,但深究下去就会意识装有的结果尚且是来源于我们内心深处的挑选。失去与收获都是一锤定音的。

1.1.2 Linux

安装Python3.x.x,通过pip安装需要之老三方库。


1.2 Python库

Python为开发者提供丰富代码库,开发者从不会从零开始开发,基础功能为主已生现成的熟的框架或库支持,因此大的晋级开发者的支出效率及增进代码健壮性。

图片 2

 

Python很爱学!小编有搞一个交流,互问互答,资源共享的交流学习基地,如果你也是Python的学习者或者大牛都迎接您来!㪊:548+377+875!一起
学习共同进步!

图片 3

 

深圳房价涨,但为阻止不了祖国各地人民来深圳买房的欲念。深圳房价动辄几百万,程序猿这种动物想以深圳安定压力山很。所以买房必然是人生一样首要决定,必须货比三家。当前各种房产中介,各种开发商,各种楼盘。信息多届我们鞭长莫及控制。因此次猿就用采取专业的优势通过一些计获得实惠数据,分析筛选最美妙之房源。

A先生极早来楼盘看的房屋,本地人口首法房刚用客户。楼盘属于刚出之区域周边的配套不是那么周,但价格是不折不扣区域最方便的,再者学校和医院菜市场这些核心的活着配套要时有发生,且距离的挺近的。刚好当时之购房政策好首付两改为,所以一切还碰巧好。A先生兴高采烈的说回家与太太说,等开盘便来定房。

2.1.1 Python教君买房维度指标体系

Python教您买房首先我们用规定我们购房时最为关注之维度体系与指标体系。关注重点维度与重点指标体系如图所示:

图片 4

 

Python教你买房,分为数据爬虫和深数目解析。首先通过爬虫方式获得到深圳房产交易网遂交易量和交易价格并得出深圳房价的主旋律,得到最适当的购房时段,确认最佳的上车时间。然后爬取链家网数据并按用户关注维度深度剖析帅选得出适宜的房舍,做好全方位上车的预备。

图片 5

 

过了一个几近星期A先生再恢复售楼部,这次除开带了无与伦比太外还带了情侣B先生与家里。在摸底项目之中心情况的早晚,B先生及妻子时不时的会晤因此家长话聊几句子,基本都是说道位置并不得当,他们之钱够不敷付首付,小孩上学是否便民类似之题材。A先生坐之前来过比较了解情况,有时候也会受他简单介绍下。两下量平时的关联都生好之,后来为下来聊的挺欢的,从老家的房屋到本的娃上学的从业还聊了只百分之百,后来聊到买房的转业,一直没怎么说话的A太极端终于打开了话匣子:“我们小老A向就是非是发生钱之命令,从结婚到今啊不是恃的我们好什么,这个你们吗了解妻子向依靠不达到。现在瞧大家还到城里来买房了就吧眼红了,那天回去就是和自己说啊呀的房舍小钱一相同,要无我们呢购得至同样效仿来,反正自己是道现在买不依赖谱,家里还少娃儿刚而费的当儿,明年坏之饶使高达高中了,这手里不能够没有接触钱吧。而且这屋这么多年了哇来镇是涨的理啊,哪有那么多人若是打屋的,还非是为他们炒起来的。”A先生正想张嘴太太一个白眼瞪过来为不吭声了,临走的时光B太极端积极加了自己的微信与要了联系方式说是回去想起有什么不知道的复来提问我。

2.1.2 Python教而买房框架

Python教你买房框架,主要分为5块,分别为主程序模块、代理IP模块、地图服务模块、可视化服务模块、目标页面模块等。主程序为率先启动代理IP模块,抓取带来IP并经过测试可用代理IP存入到代理池,定时线程定时清洗带来并拿无效的带来IP剔除出代理池,代理IP模块并提供外部API获取代理IP。主程序通过代理服务走访并抓取外部网页的灵光信息并以主程序模块理解习HTML并勾画副到地面文件。主程序会调用地图服务获得经纬度信息,并绘制热力图等。同时间可视化模块定时读取文件并生成可视化图形报表供业务侧分析应用。

图片 6

 

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="https://code.jquery.com/jquery-3.2.1.min.js"
 integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
 crossorigin="anonymous"></script>
 <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=DD279b2a90afdf0ae7a3796787a0742e"></script>
 <script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></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

新生买房的当儿偏偏发3独人口来了,没错A太太没来,说是不思量来听我们忽悠。选房的上B先生自还看好一个楼宇更强的户型的,但考虑到房价和家里一样商量就决定或选低几叠的以及一个户型。后来少独人口舒心的尽管顶了钱拿房定下来了。两单人口全程有商有量的于人口格外羡慕,一直讲的互济大概就是是其一样子吧。而A先生则在一侧好郁闷。

2.1.3 Python教您买房系列

1、网页观察

先是确定爬取链家网深圳房源,确定开场地址http://sz.lianjia.com。通过上一页和下一页完整的URL比较组装符合筛选条件的房源链接。通过chrom的开发者工具的network,并把preserve
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

相差B先生买房半年晚,有一天A斯文突然与自家关系,问楼盘是否发生房屋了,带顶绝过来看,因为老婆终于允许买房了。我生心疼之告诉A先生今天的首付款比例上调了千篇一律改成又这期的房价以上期的基础及上涨了,要购置真要赶紧了。后来A最好绝就一直觉得温馨吃亏了,要多花钱买和一个小区的房舍,遂作罢。

2.2数据解析 //TODO

不行数目时之网络爬虫爬取到有效信息,需要经三番五次清洗、加工、统计、分析、建模等拍卖方法。数据解析是构成中信息并详细研究以及包形成定论的过程。在实用中,数据解析可辅助人们作出判断,以便使适度行动。

新兴便直接传闻A先生与妻子到处去押房屋了,贵的购置不由,便宜的羁押无齐。就如此一边懊恼着一边看正在。

2.2.1 深圳购房词云分析

冲链家爬取样3199长长的待售房源,买卖二手房产我们绝关系的参数指标词云图。如图所示我们太关注之满五牛,户型方正等。在购房的底时刻我们好以这词说图详细摸底每个需要我们关心之参数指标,心有成竹。

图片 7

 

#词云图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()

再有对客户有过之而无不及,也是儒生先来拘禁之房屋,觉得每方面还恰到好处就决定要采购,第二带顶极端过来看,可即最绝挑三拣四的虽是匪情愿买房,动不动还扯出以前生活被之矛盾来说,搞的片单人口在售楼部就吵起来了,后面丢下一致词不买了就算回到了。过了区区个星期日两单人口而来了,说若买可是那时他俩看的那么套没有了,有别的楼层相同的户型的其实呢一致,太太就是毫无还非说是一锤定音了与其没缘,有钱尚怕买无顶房子就是走了。后来传闻要回家里因了栋房屋。

2.2.2 深圳房源维度分析

深圳房源按多维度分析成交量/成交价趋势和皮尔逊系数分析;放盘量和反叛价分析;房源内部参数(如2.1.1)量化分析,房源外部参数量化分析等方法。最终解释我们购房时比较关心问题而怎么买的向往之好房,何时是买房最好的空子等。

图片 8

 

多下买房是只机遇,不管刚用还是投资都是,遇到合适的即将果断的破才不至于懊悔。希望每个人都能是了。

2.2.3 深圳房源数据模型

图片 9

 

2.2.4 深圳房源均价热力模型

设图展示深圳深圳房源均价热力模型。//TODO 待分析

图片 10

 

2.2.5 深圳房源均价涨速热力模型

//TODO
确定涨速最抢,最富有投资价值的区域,数据来源官网深圳房地产信息体系:http://ris.szpl.gov.cn/default.aspx

2.2.6 深圳房源成交量热力模型

//TODO

2.2.7 深圳房源成交量热力模型

2.2.8 深圳房源成交量与成交价皮尔逊系数

//TODO
计算皮尔逊系数,确定量价比关系,确认深圳房源当前状态及预测接下去或者的图景(有价有市,有市无价,有价无市),判断当前是不是改变上车。

2.2.9 深圳房里面指数量化雷达图模型

深圳房子雷达图分析,程序首先会爬取到海量深圳待售的房产信息,等级差=(最高值-最低值)/10之计将均价,实际使用率,梯户比例,楼层,楼间距等指标分10等分,然后用户输入好心仪的房,程序将计改变房子的指标在海量房产受到之雷达位置,帮助用户快速了解心仪房产的参数配置。效果图如下:

图片 11

 

#雷达图显示房屋关注指标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()

2.2.10 深圳房外部指数量化雷达图模型

//TODO 量化外部指标参数(学位,地铁去,公交具体,公园分布,商圈等)

故,还不见面Python的,想买房的,赶快来学了!限时抢购哦!

留下评论

网站地图xml地图