python+selenium+Chrome(無頭版)爬取國家地表水水質自動監測實時數據發佈系統(修改版)——動態網頁爬蟲

這是一篇動態網頁的爬蟲教程,新手可以操作一下,簡單實用。

一、前言

這篇blog跟python+selenium+phantomJS爬取國家地表水水質自動監測實時數據發佈系統——動態網頁爬蟲的爬蟲思路非常類似。
但由於原來的國家地表水水質自動監測實時數據發佈系統進行了改版,而且新版本的網頁向我們展示了更加全面的數據,那篇blog的代碼和工具已經無法順利爬取數據了,所以爬取代碼和工具需要做一個小小的修改。
針對新的國家地表水水質自動監測實時數據發佈系統的網頁,大家可以點擊,查看一下源代碼,看看有何不同。

二、查看網頁源文件

打開瀏覽器,F12:在這裏插入圖片描述
大家注意圖中的3個地方:
1、第③個位置是數據位置;
2、如果網頁返回了所有的數據,我們只需要定位這3個地方就可以一步步爬取到數據,這就跟之前的代碼沒什麼區別了;
3、難就難在,這個網頁固定返回60條數據,每一次滾動都會重新返回一下;
4、這樣的話,我們怎麼爬取也很難保證數據的完整性,要麼冗餘,要麼缺失;
5、但是,仔細查看網頁就會發現,網站提供另外一個接口,允許我們查看全部數據(看下圖);
在這裏插入圖片描述
6、只需要點擊“所有流域”,就會返回這一天內所有上報的數據;
7、我們只需要定位到“button”,點擊一下(click())就可以了。
8、明白了嗎?

三、代碼

#--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].values
	water_data = water_df.iloc[:,1].values
	row_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("數據提取完成!!")

四、代碼運行

1、運行
在這裏插入圖片描述
2、運行結果(.csv)
在這裏插入圖片描述
3、數據(98條數據,數據量每一天都不一樣,但不會差太多)
在這裏插入圖片描述

五、後記

網頁更改之後,數據爬取往往遇到瓶頸,但只要不發生大的變動,基本代碼修改下就可以了。
謝謝大家觀看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章