基於大資料的房價分析--2.資料解析
單單隻有地址資訊是沒法在echarts上畫出散點圖的,必須有經度緯度資訊,利用百度地圖API可以將地址資訊解析為經緯度資訊,該API每日可以調取6000次,在申請認證開發者資訊後每日可以調取三十萬次,足夠解析資料了,認證之後按如下操作建立應用
其中應用名稱隨便輸,應用型別選擇服務端,IP白名單選擇你的IP或者如圖中輸入預設所有IP都可以訪問
1.解析方法
通過訪問如下請求,獲得解析結果
http://api.map.baidu.com/geocoder/v2/?address=北京市海淀區上地十街10號&output=json&ak=您的ak&callback=showLocation
2.程式碼
使用非同步請求,大大加快解析速度,這裡用的是我比更熟悉的python3的urllib.request庫
#coding=utf-8
import pymongo
from gevent.pool import Pool
import urllib.request
import json
import urllib.parse
import socket
from gevent import monkey
from parseSettings import *
import gevent
import time
import datetime
monkey.patch_all() #修改標準庫
socket.setdefaulttimeout(2)
class LocationParser(object):
#用於地址解析的類
def __init__(self,ak,baseUrl):
self.ak = ak
self.baseUrl = baseUrl
def parse(self,address,output,city=None):
#通過api獲取json資料
url = self.baseUrl+"?ak="+self.ak+"&address="+urllib.parse.quote(address)+"&output=" +output
if city:
url = url + "&city="+urllib.parse.quote(city)
try:
result = urllib.request.urlopen(url)
except:
print("連線錯誤")
return None,url
jsonresult = json.load(result)
return jsonresult,url
class LocationDumper():
def __init__(self,ip,port,locationDB,locationCol,sourceDB,sourceCol,requestNum = 10,city = None):
#資料庫連線
self.client = pymongo.MongoClient(ip,port)
#地址解析器
self.bParser = LocationParser("vxc9SN7XHCI1M6y8djyBD98Upx5CCprX",
"http://api.map.baidu.com/geocoder/v2/")
#併發數量控制
self.requestNum = requestNum
#帶解析資料集合
self.sourceCol = self.client[sourceDB][sourceCol]
#用於儲存結果的集合
self.locationCol = self.client[locationDB][locationCol]
self.oklength = 0
self.errorlength = 0
#用於解析每一條資料的方法
def parseData(self,data):
#資料集中沒有帶解析的資料,解析該條資料
if self.locationCol.count({"_id":data["_id"]}) <= 0:
if self.locationCol.count({"address":data["address"]}) > 0:
print("同一地址不再解析"+data['address'])
content = self.locationCol.find_one({"address":data["address"]})
a = {'_id':data['_id'],
"size":data['size'],
"orient":data['orient'],
"roomNum":data['roomNum'],
"url":data['fromUrl'],
"unitPrice":data['unitPrice'],
"sumPrice":data['sumPrice'],
"ln":content['ln'],
"lat":content['lat'],
"address":data['address'],
"time":data['nowTime'],
"city":data['city']}
self.locationCol.insert(a)
self.sourceCol.update({"_id":data["_id"]},{"$set":{"status":"OK"}})
return
result = self.bParser.parse(data["address"],"json",data["city"])
#根據返回碼判斷解析結果是否正確,如果不正確,去掉城市引數重試
if result[0] and result[0]['status'] != 0:
result = self.bParser.parse(data["address"],"json")
if not result[0]:
return
jsonResult = result[0]
urlResult = result[1]
ln = None
lat = None
if jsonResult['status'] == 0:
ln = jsonResult['result']['location']['lng']
lat = jsonResult['result']['location']['lat']
else:
try:
print("地址解析錯誤,status:"+str(jsonResult['status'])+",msg:"+jsonResult['msg']+",errorUrl:"+urlResult)
self.sourceCol.update({"_id":data["_id"]},{"$set":{"status":"ERROR"}})
self.errorlength += 1
except:
print("沒有錯誤資訊,直接輸出資訊"+str(jsonResult))
return
try:
a = {'_id':data['_id'],
"size":data['size'],
"orient":data['orient'],
"roomNum":data['roomNum'],
"url":data['fromUrl'],
"unitPrice":data['unitPrice'],
"sumPrice":data['sumPrice'],
"ln":ln,
"lat":lat,
"address":data['address'],
"time":data['nowTime'],
"city":data['city']}
except:
print("儲存資料異常,檢查該條資料sumprice:"+data['sumPrice']+data['address'])
self.sourceCol.update({"_id":data["_id"]},{"$set":{"status":"ERROR "}})
return
self.locationCol.insert(a)
self.oklength += 1
print("成功插入第%s條資料,解析的地址為:%s"%(self.oklength,data['address']))
self.sourceCol.update({"_id":data['_id']},{"$set":{"status":"OK"}})
else:
self.sourceCol.update({"_id":data['_id']},{"$set":{"status":"OK"}})
print("已經存在,不需要解析,狀態設定為以解析")
#解析main方法
def parse(self,Number = None):
pool=gevent.pool.Pool(self.requestNum)
datas = self.sourceCol.find({"status":"SUBSPENDING"})
if Number:
datas = datas.limit(Number)
for data in datas:
greenlet = gevent.spawn(self.parseData,data)
pool.add(greenlet)
pool.join()
print("解析完畢,共成功%s條,失敗%s條"%(self.oklength,self.errorlength))
def __del(self):
self.client.close()
if __name__ == "__main__":
starttime = datetime.datetime.now()
d = LocationDumper(MONGO_IP,
MONGO_PORT,
LOCATION_DB,
LOCATION_COLL,
SOURCE_DB,
SOURCE_COLL,
requestNum = REQUEST_NUM)
d.parse()
endtime = datetime.datetime.now()
print((endtime-starttime).seconds)
解析結果如下
相關推薦
基於大資料的房價分析--2.資料解析
單單隻有地址資訊是沒法在echarts上畫出散點圖的,必須有經度緯度資訊,利用百度地圖API可以將地址資訊解析為經緯度資訊,該API每日可以調取6000次,在申請認證開發者資訊後每日可以調取三十萬次,足夠解析資料了,認證之後按如下操作建立應用 其中應用
基於大資料的房價分析--1.資料爬取
爬取資料用的是python2.6+scrapy爬蟲框架,一開始我寫的是一個全站爬蟲,可以根據一個種子url爬取58同城所有房價資訊,但有個問題就是必須使用代理IP,否則爬蟲很快就會被封禁,於是我想了個辦法就是在linux中每五分鐘執行一次爬蟲程式,每次只爬取一個
HIVE數倉資料血緣分析工具-SQL解析
一、數倉經常會碰到的幾類問題: 1、兩個資料報表進行對比,結果差異很大,需要人工核對分析指標的維度資訊,比如從頭分析資料指標從哪裡來,處理條件是什麼,最後才能分析出問題原因。 2、基礎資料表因某種原因需要修改欄位,需要評估其對數倉的影響,費時費力,然後在做方
易學筆記-第6章 資料管理/6.2 資料卷容器
資料卷容器 在一個映象內建立一個數據卷,然後其他容器共用 建立資料卷容器dbdata: [[email protected] localwys]# docker run -it --name datadocker -v /dbd
R語言資料探勘(2) 資料預處理
一 、資料清理 檢查資料質量的重要性 除了在建立模型之前需要完成資料清理,在對資料結構的探索和對模型的描述和預測過程中都需要不斷檢查資料質量 探索的過程中,出現任何異常情況都需要解釋和處理。 比如分類變數應該注意頻率特別低的類別,它可能是錯誤分類或者原本屬於相鄰類別的資料
Impala原始碼分析(2)-SQL解析與執行計劃生成
Impala的SQL解析與執行計劃生成部分是由impala-frontend(Java)實現的,監聽埠是21000。使用者通過Beeswax介面BeeswaxService.query()提交一個請求,在impalad端的處理邏輯是由void ImpalaServer::query(QueryHandle
基於大資料的房價分析
大二自學的是python和java,大三卻找了個和前端相關的實習工作,好在不是很忙,工作之餘做一些自己以前想做懶得做的東西,複習一下python和java,也能增強自己的工作技能,第一個專案就是基於房價的大資料分析 1.前置準備 1.工具 使用的是
基於Hi3559AV100 RFCN實現細節解析-(2)RFCN資料流分析
下面隨筆系列將對Hi3559AV100 RFCN實現細節進行解析,整個過程涉及到VI、VDEC、VPSS、VGS、VO、NNIE,其中涉及的內容,大家可以參考之前我寫的部落格: Hi3559AV100的VI細節處理說明: https://www.cnblogs.com/iFrank/p/14374658.
大資料linux系統部分命令解析(2)0912
1.檢視ip ifconfig 解釋: ifconfig 常用命令關閉網絡卡,檢視ip。請看幫助! NAME ifconfig - configure a network interface SYNOPSIS ifconf
[大資料專案]-0016-基於Spark2.x新聞網大資料實時分析視覺化系統
2018最新最全大資料技術、專案視訊。整套視訊,非那種淘寶雜七雜八網上能免費找到拼湊的亂八七糟的幾年前的不成體系浪費咱們寶貴時間的垃圾,詳細內容如下,視訊高清不加密,需要的聯絡QQ:3164282908(加Q註明51CTO)。 課程介紹 本專案基於某新聞網使用者日誌分析系統進行講解
基於大資料分析的精準營銷系統研究及實現
**基於大資料分析的精準營銷系統研究及實現** 基於大資料分析的精準營銷系統研究及實現mysql資料庫建立語句 基於大資料分析的精準營銷系統研究及實現oracle資料庫建立語句 基於大資料分析的精準營銷系統研究及實現sqlserver資料庫建立語句 基於大資料分析的
基於大資料分析的安全管理平臺技術研究及應用
http://www.venustech.com.cn/NewsInfo/531/25566.Html 【內容摘要】本文首先通過介紹大資料的起因,給出了大資料的定義和特徵描述,並簡要說明了當前大資料的研究概況。接下來,本文闡釋了大資料分析技術,對大資料在資訊保安領域尤其是安全管理平臺領域的應用做了深入分
資料探勘——基於R文字情感分析(2)
姑且算是搞定了這個。 最後使用的是在twitter中搜索。因為callback url的關係,之前一直無法直接搜尋twitter內容,今天直接把callback url刪除了就成功了。 推薦兩個很好的
大資料實戰:基於Spark SQL統計分析函式求分組TopN
做大資料分析時,經常遇到求分組TopN的問題,如:求每一學科成績前5的學生;求今日頭條各個領域指數Top 30%的頭條號等等。Spark SQL提供了四個排名相關的統計分析函式: dense_rank() 返回分割槽內每一行的排名,排名是連續的。 rank() 返回分割槽
基於大資料做文字分析
在對大資料的認識中,人們總結出它的4V特徵,即容量大、多樣性、生產速度快和價值密度低,為此產生出大量的技術和工具,推動大資料領域的發展。為了利用好大資料,如何有效的從其中提取有用特徵,也是重要的一方面,工具和平臺化必須依靠正確的資料模型和演算法才能凸顯出其重要的價值。 現在
深度解析 Twitter Heron 大資料實時分析系統
所有的老的生產環境的topology已經執行在Heron上, 每天大概處理幾十T的資料, billions of訊息 為什麼要重新設計Heron: 【題外話】這裡完全引用作者吐槽的問題, 不少問題,其實JStorm已經解決 (1)debug-ability 很差, 出現問題,很難發現 1.1 多個t
基於大資料的輿情分析系統架構
前言 網際網路的飛速發展促進了很多新媒體的發展,不論是知名的大V,明星還是圍觀群眾都可以通過手機在微博,朋友圈或者點評網站上發
大資料線上分析處理和常用工具
大資料線上分析處理的特點 . 資料來源源不斷的到來; 資料需要儘快的得到處理,不能產生積壓; 處理之後的資料量依然巨大,仍然後TB級甚至PB級的資料量; 處理的結果能夠儘快的展現; 以上四個特點可以總結為資料的收集->資料的傳輸->資料的處理-&g
資料分析、資料探勘、演算法工程師、大資料分析師的區別是什麼?爬招聘網站用資料來全方位分析
大資料行業經過幾年的發展和沉澱,大資料專案崗位細分領域已經趨於完善,本文主要探討在大資料分析這個領域,通過爬蟲爬取各個招聘網站的相關資料,對細分崗位進行深入分析,本文的呈現,感謝科多大資料資料分析培訓班第10期學員“NO.1”團隊的技術支援。 此次分析結果呈現經歷三個階段: 細分查詢目
hadoop 大資料實戰(2)mongodb安裝
mongodb-win32-x86_64-2008plus-ssl-4.0.3.zip 1、下載地址: https://www.mongodb.com/download-center 2、配置 1.建立路徑,C:\mongodb 2.在C:\mongodb下減壓下載的zip檔案,然後在C