文章出處

數模有一個題目要處理杭州自行車在每個站點可用數量和已經借出數量,這數據在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\n" % (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\n" % (data1, data2))

            if result[3:5]=="12":
                data1=result[2:3]
                data2=result[5:len(result)-2]
                f.write("%s %s\n" % (data1, data2))

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()