自动采集发布系统(国家地表水水质自动监测实时数据发布系统——动态网页爬虫)

优采云 发布时间: 2021-12-04 06:12

  自动采集发布系统(国家地表水水质自动监测实时数据发布系统——动态网页爬虫)

  这是一个动态网页爬虫教程,新手也可以操作,简单实用。

  一、前言

  本博客与python+selenium+phantomJS爬取全国地表水质自动监测实时数据发布系统——动态网络爬虫的爬虫思路非常相似。但是由于原国家地表水质自动监测实时数据发布系统已经修改,新版网页向我们展示了更全面的数据,该博客的代码和工具无法再抓取数据很顺利,所以爬取的代码和工具需要稍微修改一下。新的国家地表水水质自动监测实时数据发布系统的网页,可以点击查看源代码,看看有什么不同。

  二、查看网页源文件

  打开浏览器,F12:

  

  请注意图中的3个位置: 1、 第三个位置是数据位置;2、 如果网页返回了所有的数据,我们只需要定位到这3个地方就可以一步步抓取了。数据,这个和之前的代码没什么区别;3、 难点是这个页面会返回60条数据,每次滚动都会返回;4、 这种情况下,我们如何爬取数据的完整性也很难保证,要么冗余要么缺失;5、 但是,如果你仔细看网页,你会发现网站 提供了另一个界面,可以让我们查看所有数据(见下图);

  

  6、点击“所有盆地”,当天上报的所有数据都会返回;7、我们只需要定位到“按钮”并点击(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("数据提取完成!!")

12345678910111213141516171819202122232425262728293031323334353637383940414243

  四、代码运行

  1、运行

  

  2、运行结果 (.csv)

  

  3、数据(98条数据,每天数据量不同,但差别不大)

  

  五、后记

  网页改版后,数据爬取经常会遇到瓶颈,但只要没有大的改动,基本的代码就可以修改了。谢谢大家观看。

  完整项目代码加群:1136192749

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线