zoukankan      html  css  js  c++  java
  • 当Python与数模相遇

    数模有一个题目要处理杭州自行车在每个站点可用数量和已经借出数量,这数据在www.hzbus.cn上可以获取,它是10分钟更新一次的。这些数据手动获取,需要不停的刷页面,从6:00am到9:00pm,显然不可取。
     
    过程:
    先用Chrome抓包,找到了相应数据的页面URL,然后写个脚本把此URL的html代码,并且设置计时器,保存到本地;分析html代码,获得数据所在处的特点,然后写个脚本提取它们,并保存到指定文件中.
     
    具体:
    1.抓包就掠过吧,Chrome还是有很多开发人员应该掌握的工具的
    2.找到URL页面后,发现Python有现成代码可用(urllib2),保存到本地就很方便
    代码:
    import urllib2
    import time
    url='http://www.hzbus.cn/Page/BicyleSquare.aspx?rnd=2&area=10'
    for i in range(1,110):
    	t1=time.time()
    	t1=int(t1)
    	#filename="D:/data.txt"
    	t0=time.strftime('%H-%M',time.localtime(time.time()))
    	print t0
    	filename='''D:/%s.txt'''%(t0)
    	f=open(filename, "w")
    	response = urllib2.urlopen(url) 
    
    	html = response.read() 
    
    	f.write("%s
    " % (html))
    	t2=time.time()
    	t2=int(t2)
    	t3=t1-t2
    	time.sleep(600-t3-2)
    	print i
    print "OK"
    3.计时:10分钟计时一次,我使用sleep函数,不过urllib那里的response时间要好几秒,这会积少成多导致计时不准确,需要sleep时候减去消耗的时间。另外发现sleep函数比设定时间多sleep2秒,不知道为什么
    4.本地数据处理:自行车数量,总数是21,不过已经借出数量(data1)和可用数量(data2),可能是1位数,可能是2位数,需要分类讨论。用正则的话,第一我不熟练,第二没必要。用filter函数过滤出所有数字,发现除了需要的两个data,还有html页面中的font-size,吐槽一下写那个页面的人,css什么的没有完全分离。。然后获取的数据可以是122112012也可以是120122112两种情况,都是先去掉首尾的12(表示字体大小)然后发现两个data之间的12,也是字体大小,判断,如果filter之后的子串s[4:6]是12那么表示data1是两位数,data2取后几位就好;如果s[3:5]是12那么表示data1是一位数,...
    5.然后是遍历所有保存的html文件了,(其实我保存为“小时-分钟.txt”的格式),发现os模块的listdir和系统的dir或者linux的ls命令一样,都是按照文件名字按顺序列出,这就省去了我们自行处理。
    eg:
    import os
    allfile=os.listdir("D:/data/")
    outfile=open("D:/result/result.txt", 'a')
    for filename in allfile:
        f=open("D:/data/"+filename)
        for eachline in f:
            outfile.write(eachline)
        f.close
    6.用追加模式,保存数据到指定文件  参数是a表示append
     
    最终代码:
    import os
    allfile=os.listdir("D:/data/")#列出目录下所有文件
    #filename="D:/02-54.txt"
    resultfile="D:/result/result.txt"  #最终所有处理好的数据存储的文件
    f=open(resultfile,"a")  #a: append,追加模式
    for filename in allfile:
        file=open("D:/data/"+filename)
        for i in range(1,89):
            line=file.readline()
            if i==88:           
                result=filter(str.isdigit, line)
    
                if result[4:6]=="12":
                    data1=result[2:4]
                    data2=result[6:len(result)-2]
                    f.write("%s %s
    " % (data1, data2))
    
                if result[3:5]=="12":
                    data1=result[2:3]
                    data2=result[5:len(result)-2]
                    f.write("%s %s
    " % (data1, data2))
  • 相关阅读:
    eclipse取消validation验证
    VMware12 pro装unlocker207补丁后依然没有apple mac选项,问题解决
    OSG学习:使用OSG中预定义的几何体
    技嘉主板+AMD CPU开启CPU虚拟化方法
    OSG学习:用多通道(multiple passes)实现透明度
    shader language学习(1)——shader language简介背景
    OSG学习:阴影代码示例
    代码整洁之道_条件判断
    springboot使用hibernate validator校验
    解决spring boot在RabbitMQ堆积消息情况下无法启动问题
  • 原文地址:https://www.cnblogs.com/zjutzz/p/3210681.html
Copyright © 2011-2022 走看看