利用Python来协助姑妈买房!Python“买”房比她自己买便宜二十万

利用Python来协助姑妈买房!Python“买”房比她自己买便宜二十万,第1张

概述1、Python基础Python是一种面向对象、解释型自由语言,语法简洁清晰、基础代码库丰富,覆盖网络、文件、GUI、数据库、文本等领域。并能和其他主流语言沟通协助制作。Python主要分为Cpython、Jpython、IronPython、P 1、Python基础

Python是一种面向对象、解释型自由语言,语法简洁清晰、基础代码库丰富,覆盖网络、文件、GUI、数据库、文本等领域。并能和其他主流语言沟通协助制作。Python主要分为cpython、Jpython、IronPython、PyPy等。解释型语言可移植行好,但是运行速度不及编译型语言,其次解释型语言源码无法像编译型那样编译成二进制串加密。

1.1.2 linux

安装python3.x.x,通过pip安装需要的第三方库。

1.2 Python库

Python为开发者提供丰富代码库,开发者从不会从零开始开发,基础功能基本已经有现成的成熟的框架或库支持,因此大幅度的提升开发者的开发效率和提高代码健壮性。

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

深圳房价飞涨,但也阻挡不了祖国各地人民来深圳买房的欲望。深圳房价动辄几百万,程序猿这种动物想在深圳安居压力山大。所以买房必然是人生一重大决定,必须货比三家。当前各种房产中介,各种开发商,各种楼盘。信息多到我们无法掌握。因此程序猿就需要利用专业的优势通过一些方式获取有效数据,分析筛选最优秀的房源。

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

Python教你买房首先我们需要确定我们购房时最关注的维度体系和指标体系。关注主要维度和关键指标体系如图所示:

Python教你买房,分为数据爬虫和大数据分析。首先通过爬虫方式获取到深圳房产交易网成功交易量和交易价格并得出深圳房价的趋势,得到最合适的购房时间段,确认最佳的上车时间。然后爬取链家网数据并按用户关注维度深度分析帅选得出适宜的房子,做好一切上车的准备。

2.1.2 Python教你买房框架

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

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 @R_403_5105@/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 @R_403_5105@/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,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',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',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)
          热力图功能示例