Scrapy提供了基于XPath和CSS的Selector方式对网页文件进行解析,根据系统自动选择最优的解析方法,可解析HTML和XML两种文件类型。在XPath中,‘//’表示从文档节点开始抓取,‘/’表示从上一级标签节点开始抓取,@href表示提取标签超链接。实现提取小区超链接代码如下:
foreachhouse in houses:
#从
提取href的属性值
xq=eachhouse.xpath('div[@class="info-panel"]/h2/a/@href')
xq_href='http://sh.lianjia.com'+str(xq[0])
2.3 解析网页文件
在Scrapy中,解析函数命名为parse,传入参数为服务器返回值response。直接返回的response需要程序提取所需数据。首先需要生成一个selector实例sel,对其可使用XPath等方法解析。以安居客在售二手房(http://shanghai.anjuke.com/sale/)信息为例,说明解析步骤。观察当前在售房屋信息,在view-source中寻找对应源码。面对嵌套标签,可利用类似于list的提取方式提取嵌套标签的同胞标签。
HTML解析函数代码如下:
def parse(self,response): #返回的response传入parse解析
sel=Selector(response) #声明选择器对象sel
datalist=sel.XPath('//div[@class="house-details"]/div[2]')
#抓取属性为class="house-details"的div标签下嵌套的第二个div标签
items=[]
item=ConItem()#声明Items
item['address']=sel.xpath('//span[@class="comm-address"]/@title')
for data in datalist:
item['area']=data.xpath('.//span[1]')
#抓取的面积数据存放在area中
item['area']=item['area'].xpath('string(.)')
#读取span标签下面的文本
item['price']=data.xpath('.//span[3]')
item['price']=item['price'].XPath('string(.)')
item['btime']=data.XPath('.//span[5])
item['btime']=item['btime].XPath('string(.)')
items.append(item)
return items
2.4 存储数据
从网页中抓取的文本数据一般可以选择存储为CSV、JSON等形式。为避开编码问题,将网页数据存储为JSON格式。打开ajkspider所在文件夹路径的命令提示符,直接输入:scrapy crawl ajkspider -o ajkdata.json -t json,即可在根目录中找到数据文件。Python中自带JSON模块解析,将原始数据存储规范格式后存储为Excel文件。
3 房产数据的空间定位
在链家网中,网页中含有百度地图的经纬度坐标,可以直接获取;而在安居客网站中,可直接抽取地理信息为地址,因此需要进一步地理编码,从而得到地理坐标。根据上述两种地理信息类型来介绍房产数据的空间坐标获取方法。
3.1 坐标纠偏
一般移动设备上安装GPS芯片或北斗芯片,获取WGS84坐标系下的经纬度,谷歌地图应用WGS84坐标系。根据国家测绘地理信息局国土测绘司在2006年发布的文件《导航电子地图安全处理技术基本要求》,导航电子地图在公开出版时必须进行空间位置技术处理,该技术由指定机构采用国家规定办法统一实现,因此开放给大众的地理坐标是经过首次技术处理的。高德地图、谷歌中国地图和搜搜地图应用该坐标系,而百度地图使用百度坐标系。针对不同的地理坐标数据,需要统一坐标系统,才可进行下一步研究。
3.2 地理编码
链家小区数据中含有地理坐标,因此只需要坐标转换即可,而安居客房屋只有地址,因此需要使用地图API得到地理坐标。选用百度API,一方面是因为目前较为主流的地图API为高德和百度,而百度API当日可返回数据量高于高德;另一方面是考虑到抓取链家小区经纬度坐标时,该网站采用的是百度API接口,以保持地理坐标的一致性。使用API类似于爬虫的原理,区别是百度的坐标返回只有单一数据,在浏览器中打开也是一组文本数据,因此读写方便。
首先在百度官网(http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding)申请密钥AK,在对百度服务器的请求中输入AK和要返回坐标的地址。而后对服务器返回的JSON结果进行函数解析。实现上述功能的代码示例如下:
def parseaddress(url): #对返回结果解析函数
response=urllib2.urlopen(url)
s=response.read()
dic=json.loads(s) #声明一个JSON实例
status=dic.get('status',11)#读取JSON中status的值,0为成功返回结果
if status==0:#如果返回结果成功,那么依次读取参数值
bd_lng=dic["result"]["location"]["lng"] #规范JSON数据格式
bd_lat=dic["result"]["location"]["lat"]
precise=dic["result"]["precise"]
confidence=dic["result"]["confidence"]
else:
bd_lng,bd_lat,precise,confidence=0,0,0,0
data.extend([status,precise,confidence])
return data#返回"longitude","latitude","status","precise","confidence"
urlAddress='http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=申请的
AK'%(‘上海市’+address) #向服务器请求数据,输入参数为AK和地址address
dataAddress=parseaddress(urlAddress)#使用函数解析,得到结果
4 房产信息在线分析工具开发
根据上述方法,开发可内嵌在浏览器中的房产信息在线分析工具,Web中数据量膨胀的同时也要求数据分析结果的同步。该工具集成房产数据获取与空间定位功能,用户只需输入要爬取的房产网站,即可获得网站实时数据。同时,工具按照用户选择的统计方法,以地图和图表方式即时显示房产信息的特征。在线工具界面如图4所示。
图4 房产信息在线分析工具使用界面
该工具基于PyQt等模块开发,轻量级,用户可以直接下载并运行.exe文件即可,不需要配置Python环境。在线分析工具主要针对普通用户,使用基本的科学计算方法与直观的地图可视化实现对网站数据的进一步分析。由于其开源的设计,在数据分析方面用户可以自行加入一些计算方法,来设计更符合自身需求的在线分析工具。面对Web中大量的房产数据,如何在短时间内高效处理大量数据才是工具面对的关键问题。同时,由于网速等的限制,浏览器加载工具时更希望工具是轻量级的,而不是几十兆、几百兆的应用程序。房产信息开发工具考虑了上述两点,旨在开发面向大众的轻量级工具。以安居客网站和链家网为例,以上海市为研究区域演示工具运行。
4.1 房产信息获取
选择网站:
在“网址”处输入需要抓取的房产网站网址。单击“开始并保存”按钮,获取全网数据。抓取数据存入Excel中。考虑到两点因素:一是大量的数据会占用系统内存空间,拖慢计算机运行速度;二是网站中的数据抓取下来可能存在格式错误或无效数据,需要进一步的数据清洗才可以进行分析。由于每次爬虫抓取是向服务器请求当前全部界面,遇到错误数据不得不重新请求相同的网页,对资源造成浪费。基于上述两点,抓取的数据存入Excel。
以安居客、链家网作为输入URL,上海市作为抓取城市,截止2016年4月20日,共抓取上海市16个行政区(不包括崇明县)小区数据21 371条,二手房在售数据41 849条,在售信息中,获取房产属性包括小区名称,地址,所售楼层与该楼房总层数,建造时间,该房屋售价,房屋面积等。小区信息中,“房产属性”包括小区名称地址,建成时间,总楼栋数,总户数,绿化率,容积率等。
4.2 房产的空间分布
(1)转化为Shapefile文件。
在爬虫抓取数据的同时,会相应返回房产经纬度坐标。利用ArcGIS中自带的Python接口,导入ArcPy模块,将点对经纬度坐标转化为点要素并存储在ESRI Shapefile文件中。
(2)地图可视化。
在“地图可视化”组合框中设置各项参数,“城市”选择“上海市”,“建造时间”根据用户需要,单个年份显示,例如1981年,1982年,或者选择周期性年份,如1980年以前,1981年-1990年等。同时勾选“显示底图”复选框,可将点要素与地图叠合在一起。在图框右侧有“放大”和“缩小”按钮实现对地图缩放操作。
4.3 不同类型房屋数据分析
选择统计分析指标:
在“房源种类”中包括二手房、新房、租房、商业写字楼、海外房产等,工具按照不同类型分析数据。数据分析的指标包括“房产属性”中的价格、面积等。可在“统计类型”中选择不同的统计方式显示结果。
环线二手房、新房房价与出售数量统计图如图5所示。
(1)折线图统计分析。
在“房源种类”中选择二手房,“房产属性”选择价格,“统计类型”选择折线图。以上海市三条交通环线为分割线,将区域划分为四部分,分别是内环以内区域,内环—中环区域,中环—外环区域,外环以外区域。(截止2016年4月20日)内环—中环区域二手房出售数量占16%,中环—外环区域占12%,与同一时期新房相比,内环—中环区域,中环—外环区域的二手房,新房均出售较少,反映出该区域是住宅密度较大的城市生活区。内环以内区域,外环以外区域出现了二手房出售的高峰,相对的外环以外区域出现了新房出售的高峰,体现出人们生活水平的提高。从前在郊区住的人会选择靠近市区买房,因此出现郊区售楼高峰;而从前在市中心居住的人们希望在郊区买到环境质量更好的房屋,因此出现了市中心二手房出售和郊区新房出售的高峰。
(2)饼状图统计分析。
在“房源种类”中选择二手房,“房产属性”选择建造年份,“统计类型”选择饼状图,生成图表表示上海市不同建造年份二手房占比,数据标签在饼图中标出。其中2001年-2010年的二手房数量占在售二手房的50%,其次是1991年-2000年,占比为25%,2011年至今的二手房占18%,而这一数字将持续上涨。用户在为自己选择二手房时,可参考该统计数据判断房屋新旧和价格的合理性,纠正决策。
图5 环线二手房、新房房价与出售数量统计图
5 结束语
房产在线分析工具包括抓取数据、统计分析、地图可视化三大功能,旨在面向大众对Web数据做进一步的数据分析处理。工具抓取数据方法使用Scrapy爬虫,根据Python的多线程特点,可快速抓取全网数据,但同时向服务器发送请求也给网站服务器带来了负担。用户可选择所需数据类型进行抓取并保存,减轻服务器压力,也可以设置定时抓取,例如每一个月抓取一次数据,存储在本机中,这同样也是一种历史数据保存方式,便于对房产数据做长期数据分析时使用。其统计分析功能利用Python科学计算方法,在工具中即时计算结果,并直观显示在图表中。虽然Python相较于C语言没有计算速度优势,但是万级单位数据还是影响不大的,另外Python数据处理方面有很多第三方包,数据可视化同样不亚于C语言,其代码比C语言要简洁得多,因此将Python作为在线工具开发的编程语言。工具的地图可视化借助ArcPy函数自动生成地图结果,实时显示在工具界面,使用户对房产数据有一定的空间认识。如今网页已经不仅仅是向人们展示数据,同时也可以帮助人们计算指标,量化分析数据,更加便于人的决策。在线工具实际上是对网页功能的弥补,轻量级和开源性是在线工具的特点,其优势在于弥补了数据获取与分析的不同步情况,以便用户在短期内掌握房产变化动态,预测趋势等。在线工具经过不断的完善和发展,将不仅局限于对特定网站的数据获取以及分析,还可应用于各个领域。但其局限性也是显而易见的,并不能具备应用程序完整的数据分析功能。就像电子书和纸质书一样,两者永远不会相互替代,反而是相辅相成共同进步。
[1] Liu Bing,Crossman R,Zhai Yanhong.Mining data records in web pages[C]//KDD2003.[s.l.]:[s.n.],2003:601-606.
[2] Zhai Y,Liu B.Web data extraction based on partial tree alignment[C]//International conference on world wide web.[s.l.]:[s.n.],2005:76-85.
[3] 梅 雪,程学旗,郭 岩,等.一种全自动生成网页信息抽取Wrapper的方法[J].中文信息学报,2008,22(1):22-29.
[4] 欧健文,董守斌,蔡 斌.模板化网页主题信息的提取方法[J].清华大学学报:自然科学版,2005,45(S1):1743-1747.
[5] 王 曙,吉雷静,张雪英,等.面向网页文本的地理要素变化检测[J].地球信息科学学报,2013,15(5):625-634.
[6] 廖邦固,徐建刚,梅安新.1947~2007年上海中心城区居住空间分异变化—基于居住用地类型视角[J].地理研究,2012,31(6):1089-1102.
[7] 邹高禄,渠文晋,邓 沛,等.二手房价格对于住房特征和区位变化敏感性分析[J].西南师范大学学报:自然科学版,2005,30(3):552-555.
[8] 李晓文,方精云,朴世龙.上海城市土地利用形成、变化及其空间作用机制[J].长江流域资源与环境,2006,15(1):34-40.
[9] 郭太飞,何洁月.归纳学习XPATH Web信息提取规则[J].计算机技术与发展,2007,17(3):98-101.
[10] 赫特兰.Python基础教程[M].第2版.北京:人民邮电出版社,2010.
[11] Shaw Z A.笨办法学Python[M].王巍巍,译.北京:人民邮电出版社,2014.
[12] Beazley D,Jones B K.Python cookbook[M].南京:东南大学出版社,2014.
[13] Bird S,Klein E,Loper E.Python自然语言处理[M].陈 涛,译.北京:人民邮电出版社,2014.
[14] McKinney W.利用Python进行数据分析[M].唐学韬,译.北京:机械工业出版社,2013.
[15] 高 军,杨冬青,唐世渭,等.基于树自动机的XPath在XML数据流上的高效执行[J].软件学报,2005,16(2):223-232.
Data Acquisition and Development of Online Analysis Tools Based on Real Estate Transaction Websites
WANG Jin-zi,LAI Wen-jie
(School of Geographic Sciences,East China Normal University,Shanghai 200241,China)
Real estate transaction websites provide every detail about the real estate data.It would be helpful for people to know better about real estate,which is helpful for final decision.Development of online analysis tools meets the trend to analyze big data on real estate with less code to expect the integration of data mining with data analysis in real time owning the function no less than practical programs as new favorite in tool development.This analysis tool online has been developed with Python language as well as third party modules including Scrapy,ArcPy etc. to acquire information on real estate and to monitor and analyze spatial distributions and variations of real estate information from various types of data.Taking two trade websites of real estate,Network for Linking Family and Dwelling Guest,as examples,real estate data in Shanghai has been acquired to display spatial distributions and variations of housing prices as well as percents of real estates in diverse districts for convenience to analysis.
real estate transaction websites;website spiders;geocoding;ArcPy
2016-06-10
2016-09-15 网络出版时间:2017-03-07
国家自然科学基金资助项目(41001270);上海市自然科学基金项目(14ZR1412200);闵行区中小企业技术创新计划项目(2014MH011)
王荩梓(1995-),女,研究方向为数据挖掘、GIS开发与应用;导师:吴健平,教授,博导,研究方向为地理信息系统开发。
http://kns.cnki.net/kcms/detail/61.1450.TP.20170307.0922.074.html
TP39
A
1673-629X(2017)05-0154-06
10.3969/j.issn.1673-629X.2017.05.032