Python爬虫抓取动态数据
一個月前實習(xí)導(dǎo)師布置任務(wù)說通過網(wǎng)絡(luò)爬蟲獲取深圳市氣象局發(fā)布的降雨數(shù)據(jù),網(wǎng)頁如下:
心想,爬蟲不太難的,當年跟zjb爬煎蛋網(wǎng)無(mei)聊(zi)圖的時候,多么清高。由于接受任務(wù)后的一個月考試加作業(yè)一大堆,導(dǎo)師也不催,自己也不急。
但是,導(dǎo)師等我一個月都得讓我來寫意味著這東西得有多難吧。。。今天打開一看的確是這樣。網(wǎng)站是基于Ajax寫的,數(shù)據(jù)動態(tài)獲取,所以無法通過下載源代碼然后解析獲得。
從某不良少年寫的抓取淘寶mm的例子中收到啟發(fā),對于這樣的情況,一般可以同構(gòu)自己搭建瀏覽器實現(xiàn)。phantomJs,CasperJS都是不錯的選擇。
導(dǎo)師的要求是獲取過去一年內(nèi)深圳每個區(qū)每個站點每小時的降雨量,執(zhí)行該操作需要通過如上圖中的歷史查詢實現(xiàn),即通過一個時間來查詢,而這個時間存放在一個hidden類型的input標簽里,當然可以通過js語句將其改為text類型,然后執(zhí)行send_keys之類的操作。然而,我失敗了。時間可以修改設(shè)置,可是結(jié)果如下圖。
為此,僅抓取實時數(shù)據(jù)。選取python的selenium,模擬搭建瀏覽器,模擬人為的點擊等操作實現(xiàn)數(shù)據(jù)生成和獲取。selenium的一大優(yōu)點就是能獲取網(wǎng)頁渲染后的源代碼,即執(zhí)行操作后的源代碼。普通的通過 url解析網(wǎng)頁的方式只能獲取給定的數(shù)據(jù),不能實現(xiàn)與用戶之間的交互。selenium通過獲取渲染后的網(wǎng)頁源碼,并通過豐富的查找工具,個人認為最好用的就是find_element_by_xpath("xxx"),通過該方式查找到元素后可執(zhí)行點擊、輸入等事件,進而向服務(wù)器發(fā)出請求,獲取所需的數(shù)據(jù)。
# coding=utf-8 from testString import * from selenium import webdriver import string import os from selenium.webdriver.common.keys import Keys import time import sys default_encoding = 'utf-8' if sys.getdefaultencoding() != default_encoding:reload(sys)sys.setdefaultencoding(default_encoding)district_navs = ['nav2','nav1','nav3','nav4','nav5','nav6','nav7','nav8','nav9','nav10'] district_names = ['福田區(qū)','羅湖區(qū)','南山區(qū)','鹽田區(qū)','寶安區(qū)','龍崗區(qū)','光明新區(qū)','坪山新區(qū)','龍華新區(qū)','大鵬新區(qū)']flag = 1 while (flag > 0):driver = webdriver.Chrome()driver.get("http://www.szmb.gov.cn/article/QiXiangJianCe/")# 選擇降雨量driver.find_element_by_xpath("//span[@id='fenqu_H24R']").click()filename = time.strftime("%Y%m%d%H%M", time.localtime(time.time())) + '.txt'#創(chuàng)建文件output_file = open(filename, 'w')# 選擇行政區(qū)for i in range(len(district_navs)):driver.find_element_by_xpath("//div[@id='" + district_navs[i] + "']").click()# print driver.page_sourcetimeElem = driver.find_element_by_id("time_shikuang")#輸出時間和站點名output_file.write(timeElem.text + ',')output_file.write(district_names[i] + ',')elems = driver.find_elements_by_xpath("//span[@οnmοuseοver='javscript:changeTextOver(this)']")#輸出每個站點的數(shù)據(jù),格式為:站點名,一小時降雨量,當日累積降雨量for elem in elems:output_file.write(AMonitorRecord(elem.get_attribute("title")) + ',')output_file.write('\n')output_file.close()driver.close()time.sleep(3600) 文件中引用的文件testString只是修改輸出格式,提取有效數(shù)據(jù)。 #Encoding=utf-8 def OnlyCharNum(s, oth=''):s2 = s.lower()fomart = 'abcdefghijklmnopqrstuvwxyz0123456789,.'for c in s2:if not c in fomart:s = s.replace(c, '')return sdef AMonitorRecord(str):str = str.split(":")return str[0] + "," + OnlyCharNum(str[1])
一小時抓取一次數(shù)據(jù),結(jié)果如下:
參考網(wǎng)站:http://cuiqingcai.com/2599.html
總結(jié)
以上是生活随笔為你收集整理的Python爬虫抓取动态数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 狐狸的悲哀
- 下一篇: websocket python爬虫_p