使用Python,HtmlParser来统计深圳市保障房申请人的原籍省份分布,年龄分布等。从侧面可以反映鹏城人的地域分布。以下python代码增大了每一次获取的记录数,从而少提交几次请求。如果按照WEB主页设定的每一次请求最多50个记录,那就得提交数千次请求,显然费时。另外,也可以使用多线程处理,快速获得数据,解析数据,然后使用pandas,matplotlib等工具进行数据处理和绘制。查询了系统,截止2016年2月,轮候系统的保障房人数大概4万多,公租房轮候人数大概5万,以下数据仅作学习使用,统计结果如下:

毫无疑问,广东本地人申请的占多数。前十名当中,和广东接壤的省份也占了不少比例,特别是两湖,江西,剩下的由人口大省占据。深圳保障房建设速度和规模居全国首位,但是因为人数众多,所以需要排队等候。远离XX的房东,避免年年涨的房租,那就加入排队轮候大军吧。

 # -*- coding:utf-8 -*-
import time
import json
import lxml.html
from lxml import etree
from HTMLParser import HTMLParser #使用beautifulsoup也可以 #http://www.crummy.com/software/BeautifulSoup/
#http://blog.csdn.net/my2010sam/article/details/14526223 try:
from urllib.request import urlopen,Request
except:
from urllib2 import urlopen, Request area={"":"北京","":"天津","":"河北","":"山西","":"内蒙古","":"辽宁","":"吉林","":"黑龙江","":"上海",
"":"江苏","":"浙江","":"安徽","":"福建","":"江西","":"山东","":"河南","":"湖北","":"湖南",
"":"广东","":"广西","":"海南","":"重庆","":"四川","":"贵州","":"云南","":"西藏","":"陕西",
"":"甘肃","":"青海","":"宁夏","":"新疆","":"台湾","":"香港","":"澳门","":"国外"}
ages =[0]*11
provinceCnt=[0]*91
RECORD_BY_EACH_PAGE = [10,15,30,50,5000]
currentYear=time.localtime()[0]#get year
URL_BY_PAGESIZE='http://bzflh.szjs.gov.cn/TylhW/lhmcAction.do?pageSize=%s&method=queryYgbLhmcInfo&waittype=2' #http://XXX.cn?pageSize=XXX&page=XXX,waittype=2 公租房,waittype=1 安居房
URL_BY_PAGE_PAGESIZE ='http://bzflh.szjs.gov.cn/TylhW/lhmcAction.do?pageSize=%s&method=queryYgbLhmcInfo&waittype=%s&page=%s' #Social_Housing_Items=[URL_BY_PAGE_PAGESIZE_GongZuFang,URL_BY_PAGE_PAGESIZE_AnJuFang] def getHomePage(url,pagesize):
try:
request = Request(url)
lines=urlopen(request,timeout=10).read()
if len(lines)<20:
return None #no data
except Exception as e:
print e
else:
if pagesize!=10 and pagesize!=15 and pagesize!=30 and pagesize!=50 and pagesize !=5000:
pagesize = 15 #default as 15 record each page
lines=lines.decode('utf-8')
splitLines=lines.split('\r\n')
for line in splitLines:
#if "pageSize" in line:
#print line[:50]
if "pagebanner" in line:
totalPage= line[:50].split('>')[1].split(' ')[0]
totalPage=totalPage.split(',')
if len(totalPage)>1:
pages=(int(totalPage[0])*1000+int(totalPage[1]))/pagesize
return pages def getRawData(url):
try:
request = Request(url)
lines=urlopen(request,timeout=10).read()
if len(lines)<20:
return None #no data
except Exception as e:
print e
else:
return lines.decode('utf-8') def getIdentityInfo(code):
"""
:param code: identity code showing province and date
:return: province,date
"""
provinceCode=code[:2]
cityCode = code[2:6]
date=code[6:10]
return provinceCode,date class Dataparser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.tr=False
self.td =0
self.data =False
def handle_starttag(self,tag,attrs):
"""
参数tag是标签名,比如td,tr',attrs为标签所有属性(name,value)列表,这里是[('class','para')]
:param tag:
:param attrs:
:return:
"""
if tag=='tr':
self.tr=True
if tag =='td'and self.tr==True:
self.data = True
for name,value in attrs:
print "name and value are",name,value
def handle_endtag(self,tag):
if tag=='td':
self.data = False
#print "a end tag:",tag,self.getpos() def handle_data(self,data):
if self.data and len(data)==18 and '\r\n' not in data:
#print data #ID card NO
provinceCode,date=getIdentityInfo(data)
ageRange=currentYear - int(date)
if ageRange>=100:
print 'test',ageRange
#ages[ageRange/10] +=1
#temp=area[provinceCode].decode('utf-8')
PC=int(provinceCode)
provinceCnt[PC]+=1 if __name__ =='__main__':
#计算总共页数,每页可以自己限定
for type in range(2):
pages=getHomePage(URL_BY_PAGE_PAGESIZE%(RECORD_BY_EACH_PAGE[0],type+1,1),RECORD_BY_EACH_PAGE[4])
parse=Dataparser()
while pages>=1:
#for page in range(pages):
lines=getRawData(URL_BY_PAGE_PAGESIZE%(RECORD_BY_EACH_PAGE[4],type+1,pages))
parse.feed(lines)
#parse.close()
pages-=1
parse.close()
if type==0:
print "深圳安居房申请人全国分布情况统计:"
for i in provinceCnt:
if i>0: #只打印有数据的省份
pIndex=str(provinceCnt.index(i))
print area[pIndex],i
provinceCnt =[0]*91
elif type==1:
print "深圳公租房申请人全国分布情况统计:"
for i in provinceCnt:
if i>0: #只打印有数据的省份
pIndex=str(provinceCnt.index(i))
print area[pIndex],i
provinceCnt =[0]*91

使用Python统计深圳市公租房申请人省份年龄统计的更多相关文章

  1. spark 省份次数统计实例

    //统计access.log文件里面IP地址对应的省份,并把结果存入到mysql package access1 import java.sql.DriverManager import org.ap ...

  2. jieba (中文词频统计) 、collections (字频统计)、WordCloud (词云)

    py库: jieba (中文词频统计) .collections (字频统计).WordCloud (词云) 先来个最简单的: # 查找列表中出现次数最多的值 ls = [1, 2, 3, 4, 5, ...

  3. 【PHP】php+txt实现网页计数器(限IP统计方式和不限IP统计方式)

    一般的网页计数器制作实现思路:首先设定存放统计数据的文件(counter.txt)——读取文件中的内容存入字符串——自加操作——以写入方式打开文件写入数据——从文件中输出统计数据——关闭文件. 代码: ...

  4. Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)

    Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...

  5. sql按月统计数量和按月累加统计数量

    1.简单的,按月统计数量 SELECT CREATE_DATE, DATE_FORMAT(CREATE_DATE, '%Y-%m') AS month , COUNT(*) AS sum FROM p ...

  6. 【python调用windows CLI】调用adb统计Android app的流量消耗

    主要记录python如何调用windows CLI 手机连接PC,adb devices可以看到手机sn 通过adb 获取指定app的processID UID 读取Android  /proc/ne ...

  7. python之pygal:掷一个骰子统计次数并以直方图形式显示

    源码如下: # pygal包:生成可缩放的矢量图形文件,可自适应不同尺寸的屏幕显示 # 安装:python -m pip intall pygal-2.4.0-py2.py3-none-any.whl ...

  8. 用Python实现小说中的汉字频率统计

     环境: Python 3的代码,亲测可用. 思路: 是先把每个字符提出来放在列表里:再过滤掉其中的标点符号:最后用字典对某个字出现的频率进行累加. 扩展: 用处很多,稍微改改,既可以用来统计小说或文 ...

  9. 统计学习:《贝叶斯思维统计建模的Python学习法》中文PDF+英文PDF+代码

    用数学工具解决实际问题仅有的要求可能就是懂一点概率知识和程序设计.而贝叶斯方法是一种常见的利用概率学知识去解决不确定性问题的数学方法,对于一个计算机专业的人士,应当熟悉其应用在诸如机器翻译,语音识别, ...

随机推荐

  1. 一些用过的我常忘记的小知识(web前端)

    背景图片固定:background-attachment:fixed 将图片的尺寸从中心点开始改变:backgroun-position:center   background-size: ** 旋转 ...

  2. java分享第十二天(接口测试jsoup&cookie)

    一.Cookies到底是什么鬼?简单来说,Cookies就是服务器暂时存放在客户端(你的电脑里)的资料(.txt格式的文本文件),好让服务器用来辨认 你的计算机.当你在浏览网站的时候,Web服务器会先 ...

  3. Lua面向对象

    lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,如下: 1 Account = {balance = 0}2 function Account.withdraw(v)3 Acc ...

  4. 反射-----学习Spring必学的Java基础知识之一

    Java允许通过程序化的方式间接对Class进行操作,Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数.属性 ...

  5. USACO翻译:USACO 2014 JAN三题(2)

    USACO 2014 JAN 一.题目概览 中文题目名称 队伍平衡 滑雪录像 滑雪场建设 英文题目名称 bteams recording skicourse 可执行文件名 bteams recordi ...

  6. Git 恢复某个文件指定版本

    1. git reflog  找到comit id 2. git reset edf92f a.txt 3. git commit -m "ssss" 4. git checkou ...

  7. osip2 代码分析

    主要类型定义: 1.osip_t /** * Structure for osip handling. * In order to use osip, you have to manage at le ...

  8. Git系列教程二 基础介绍

    一.存储方式 如果让我们设计一个版本控制系统,最简单的方式就是每做一次更改就生成一个新的文件. 这样的方式太占用空间,所以传统的版本控制系统都是保存一个文件的某个版本的全部内容以及其他版本相对于这个版 ...

  9. NorthWind 数据库整体关系

    http://blog.csdn.net/bergn/article/details/1502150 今天看到一张非常有用的图,说明有关Northwind数据库整体关系的图,以前一直在用,但是没有一个 ...

  10. JavaScript slice() 方法

    JavaScript slice() 方法  JavaScript Array 对象 实例 在数组中读取元素: var fruits = ["Banana", "Oran ...