原文发表时间:2016-08-19 10:57:01
作者:雷中华
FME是个优秀的平台,并保持快速且持续的增长——更多的函数模块、更多的输入输出格式支持。Python是胶水语言,最大的特点就是扩展模块丰富,与FME一拍即合。
一方面,FME借助PythonCaller实现了平台承载功能的扩展,在FME里嵌入Python,融合其他IT技术,彰显FME的平台特性;另一方面,FME自身功能凝聚到pyfme,组合到其他系统中提供专业的fme技术。
本文通过一个网络数据挖掘的范例,介绍在FME平台中,借助PythonCaller融合urllib2、re(正则)、BeautifulSoup(网页信息结构化分析)的实践。
前言
Python凭借简单易上手、跨平台、扩展模块丰富等特点,程序YUAN、数据处理分析、运维等人士喜爱。
阅读本文前,仔细参照下面两篇乱马、lkfree、毛毛虫翻译和撰写的文章,动手试试。
Python与FME(一)http://blog.163.com/antufme@126/blog/static/14049249220101024104836424
Python与FME(二)http://blog.163.com/antufme@126/blog/static/140492492201011216593633
Python在FME中的使用(一)启动和关闭Python脚本
http://blog.163.com/antufme%40126/blog/static/140492492201171810595703/
用PythonCaller转换器调用ArcGIS的gp工具http://blog.163.com/antufme@126/blog/static/1404924922014111591813199/
案例:获取肯德基中国全国门店名称及地址信息
背景
平时瞎折腾,想弄到肯德基中国全国门店数据,找到了地址http://www.kfc.com.cn/kfccda/storelist/index.aspx。稍加分析,发现门店数据的手工查询获取步骤如下:
1、选择网页底部“餐厅查询”标签;
2、点“按省份”或者“按城市”,选择城市;
3、出来页面是该城市的门店清单;
4、点网页下方下一页,翻页查询。
至此,经过四个步骤,某一个城市的肯德基门店信息(名称、地址、特色服务)数据就查询到了。
分析
1、种子页面,就是整个数据挖掘的起点
此案例里,“种子页面”为http://www.kfc.com.cn/kfccda/storelist/index.aspx
①城市选择,分别按省份、按城市
②餐厅具体信息,包括名称、地址、特色服务
③翻页信息
2、城市清单,使用Firefox的Firebug来分析
这个页面里城市基本是在<ul class="shen_info">下面的<li id="xxx">下,html页面分析,比较流行的是BeautifulSoup(4.0+版本之后叫bs4)
代码片段:
root_s
= BeautifulSoup.BeautifulSoup(urllib2.urlopen(root_url).read()) ##根据url获取html页面,再转为BeautifulSoup
shen_info
= root_s.find('ul',attrs={'class':'shen_info'}) ##根据分析的城市所在标签特征,来搜索
3、切换城市,使用HttpFox来抓取post数据包信息以及返回结果
①是post提交的页面
②是postData,是程序里构建post数据的依据。此案例里有4个参数,分别为cname,pid,pageindex,pagesize,其中Pagesize看起来默认值10可以调整
③返回数据,看起来是Json串
Json第一部分是rowcount是该城市门店数,下面是具体的门店信息
FME实现
先想办法把种子页面解析好,然后分别提交查询,获取到Json
其实就一个转换器,PythonCreator。这个转换器与PythonCaller的区别是它没有输入仅有输出,所以是整个转换的起点。具体代码如下
①解析种子页面获取城市清单;
②遍历提交查询;
③获取结果,并将结果输出到构造的Feature中。
输出结果为
下一篇介绍拆分Post部分到PythonCaller中去实现
第三篇介绍如何拆分解析Json结果
第四篇介绍如何根据百度地图地理编码API解析门店经纬度(前面有一篇博文已经介绍了
#GIS#[FME]不懂编程怎样批量根据地址获取经纬度
http://dwz.cn/nocode_bdgeocodeapi)
这个系列大致内容就是这些。
拓展阅读
之前有介绍过类似案例,参见
http://dwz.cn/pachong_lzh