python爬取全國水雨情信息詳解

分析.png

分析

我們沒有找到接口,所以打算利用selenium來爬取。

代碼

import datetime
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options #建議使用谷歌瀏覽器
import time
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome()

# 存儲中英文對應的變量的中文名
word_dict = {"poiBsnm": "流域",
             "poiAddv": "行政區",
             "rvnm": "河名", 
             "stnm": "站名",
             "tm": "時間", 
             "zl": "水位(米)",
             "ql": "流量(立方米/秒)",
             "wrz": "警戒水位(米)"}
# 空df接收結果
rain_total = pd.DataFrame([])

url = 'http://xxfb.mwr.cn/sq_dxsk.html'
driver.get(url)
time.sleep(5)
infos = driver.find_elements_by_xpath("/html/body//tbody[@id='DataContainer']/tr")
# pd.set_option('display.max_columns', None)#所有列
# pd.set_option('display.max_rows', None)#所有行

# 列表提取
for info in infos:
    poiBsnm = info.find_element_by_xpath("./td[1]").text
    poiAddv = info.find_element_by_xpath("./td[2]").text
    rvnm = info.find_element_by_xpath("./td[3]").text
    stnm = info.find_element_by_xpath("./td[4]").text
    tm = info.find_element_by_xpath("./td[5]").text
    zl = info.find_element_by_xpath("./td[6]").text
    ql = info.find_element_by_xpath("./td[7]").text
    wrz = info.find_element_by_xpath("./td[8]").text
# 組成pandas對象
    rain_data = [[poiBsnm,poiAddv,rvnm,stnm,tm,zl,ql,wrz]]  
    rain_df = pd.DataFrame(data=rain_data,columns=list(word_dict.values()))
    rain_total = pd.concat([rain_total,rain_df])
    print(rain_total)
# 關閉瀏覽器
driver.close()
# 保存數據
data_str = datetime.datetime.now().strftime('%Y_%m_%d')
rain_total.to_csv("%s_全國水雨情信息.csv" % (data_str),index=None, encoding="GB18030")

結果

結果.png

總結

時間爬取出現瞭一點問題,我也很不理解,其次,循環哪裡應該可以簡潔代碼,寫的不是很好,第三,沒有形成模塊化的代碼。還有就是謝謝崔工的支持。

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: