python爬取地表水水质监测数据(爬虫)
文章目錄
- 前言
- 一、參考博客
- 二、分析說明
- 三、查看源碼
- 四、相關變量改動
- 五、代碼運行
- 六、運行結果
- 七、注意
前言
第一篇博客,也是一個新手,寫博客的目的也是為記錄下自己的學習和解決問題的過程,同時也為其他有需要的小伙伴提供一些幫助。本人來自某高校一名小博士生,主要研究方向為水資源環境遙感,最近老板讓我爬取下地表水水質監測數據,查閱了很多博客,參考了些他人的博客,加上一些變量改動,最后運行成功。本人非專業編程人士,僅提供參考。
一、參考博客
鏈接地址
鏈接地址
二、分析說明
(一)原文介紹
該網站爬取的難度在于其是個動態網站,相信大家也聽說過八爪魚,一款非常好用的數據爬取軟件,但該地表水水質監測網站是個動態網頁,本人做了相應嘗試,發現只能爬取一部分數據,并不能爬取完整的數據,后轉戰python,在前人的基礎上稍作修改,最后成功運行。下面我們來看看(參考博客的介紹)
大家注意圖中的3個地方:
1、第③個位置是數據位置;
2、如果網頁返回了所有的數據,我們只需要定位這3個地方就可以一步步爬取到數據,這就跟之前的代碼沒什么區別了;
3、難就難在,這個網頁固定返回60條數據,每一次滾動都會重新返回一下;
4、這樣的話,我們怎么爬取也很難保證數據的完整性,要么冗余,要么缺失;
5、但是,仔細查看網頁就會發現,網站提供另外一個接口,允許我們查看全部數據(看下圖);
6、只需要點擊“所有流域”,就會返回這一天內所有上報的數據; 7、我們只需要定位到“button”,點擊一下(click())就可以了。
代碼如下(示例):
#--author--張俊杰@Nick 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') #使不使用headless版本,也許你想感受一下瀏覽器自動打開,自動點擊的快感,也不一定 browser = webdriver.Chrome(chrome_options=chrome_options,executable_path = 'C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chromedriver.exe') #chromedriver下載下來之后復制到chrome.exe同文件夾下即可 print("打開網頁中。。。") browser.get("http://106.37.208.243:8068/GJZ/Business/Publish/Main.html") print("網頁響應中。。。") wait = WebDriverWait(browser,20)#畢竟代碼運行的速度和瀏覽器打開的速度不再一個量級,一個閃電俠,一個奧特曼 wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,"mainframe")))#這一步很關鍵 browser.find_element_by_id('ddm_River').click()#模擬點擊“流域” browser.find_element_by_xpath("/html/body/div[1]/div[2]/div/ul/li[1]").click()#模擬點擊“所有流域” wait.until(EC.presence_of_element_located((By.CLASS_NAME,"grid")))#定位到數據 print("獲取網頁數據中。。。") time.sleep(10) soup = BeautifulSoup(browser.page_source,"lxml") browser.close() data_head = soup.select(".panel-heading")[0] grid_data = soup.select(".grid")[0] data_colhead = data_head.findAll("td") data_rows = grid_data.findAll("tr") water_df = pd.DataFrame(columns=[c.text for c in data_colhead]) print("提取網頁數據中。。。") for i,data_row in enumerate(data_rows):water_loc = water_df.iloc[:,0].valueswater_data = water_df.iloc[:,1].valuesrow_dat = [r.text for r in data_row]water_df.loc[i] = row_dat #系統時間 data_str = datetime.datetime.now().strftime('%Y_%m_%d') #可修改保存路徑 water_df.to_csv("E:/python/國家地表水爬蟲/%s_國家地表水水質自動監測系統檢測數據.csv" % (data_str),index=None, encoding="GB18030") print("數據提取完成!!")(二)原因分析
相信有很多朋友都直接copy代碼去運行了,當然最后的結果肯定是報錯。我們來簡單分析了相關原因:細心的朋友發現現有網站和原博客介紹的網站又有所變化了,所以拿以前的代碼爬取新的網站當然是行不通的。
三、查看源碼
在google瀏覽器上登錄相應網站,按F12查看源碼,我們來看看改動的有哪些地方
1.如圖所示
2. 如圖所示
四、相關變量改動
廢話不多說,直接上圖,圖中紅色框中的都是需要改動的地方。
另外,博主在代碼運行中發現26行soup = BeautifulSoup(browser.page_source,“lxml”)處也進行了報錯,在嘗試了多種方法后,終于解決。將其改為如下即可:
五、代碼運行
將第四章節中介紹的需改動變量部分進行修正,代碼如下:
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') #使不使用headless版本,也許你想感受一下瀏覽器自動打開,自動點擊的快感,也不一定 browser = webdriver.Chrome(chrome_options=chrome_options,executable_path = 'E:/Google/Chrome/Application/chromedriver.exe') #chromedriver下載下來之后復制到chrome.exe同文件夾下即可 print("打開網頁中。。。") browser.get("http://106.37.208.243:8068/GJZ/Business/Publish/Main.html") print("網頁響應中。。。") wait = WebDriverWait(browser,20)#畢竟代碼運行的速度和瀏覽器打開的速度不再一個量級,一個閃電俠,一個奧特曼 wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,"MF")))#這一步很關鍵 browser.find_element_by_id('ddm_Area').click()#模擬點擊“區域” browser.find_element_by_xpath("/html/body/div[1]/div[1]/div/ul/li[1]").click()#模擬點擊“所有區域” wait.until(EC.presence_of_element_located((By.CLASS_NAME,"panel")))#定位到數據 print("獲取網頁數據中。。。") time.sleep(10) soup = BeautifulSoup(browser.page_source,"html.parser") browser.close() data_head = soup.select(".panel-heading")[0] grid_data = soup.select(".panel")[0] data_colhead = data_head.findAll("td") data_rows = grid_data.findAll("tr") water_df = pd.DataFrame(columns=[c.text for c in data_colhead]) print("提取網頁數據中。。。") for i,data_row in enumerate(data_rows):water_loc = water_df.iloc[:,0].valueswater_data = water_df.iloc[:,1].valuesrow_dat = [r.text for r in data_row]water_df.loc[i] = row_dat #系統時間 data_str = datetime.datetime.now().strftime('%Y_%m_%d_%H') #可修改保存路徑 water_df.to_csv("填寫相應的保存路徑/%s_國家地表水水質自動監測系統檢測數據.csv" % (data_str),index=None, encoding="GB18030") print("數據提取完成!!")六、運行結果
七、注意
此外,需注意的是,本人運用pycharm版本為2021.2.3版本,python編譯器為3.7。
附上pycharm和python下載地址
PyCharm下載安裝教程
python下載地址
總結
以上是生活随笔為你收集整理的python爬取地表水水质监测数据(爬虫)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让我摘下星星送给你_想摘下星星给你摘下月
- 下一篇: 说起刘慈欣,不要只知道《三体》和《流浪地