这是一篇动态网页的爬虫教程,新手可以操作一下,简单实用。
一、前言
这篇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("数据提取完成!!") 12345678910111213141516171819202122232425262728293031323334353637383940414243
四、代码运行
1、运行
2、运行结果(.csv)
3、数据(98条数据,数据量每一天都不一样,但不会差太多)
五、后记
网页更改之后,数据爬取往往遇到瓶颈,但只要不发生大的变动,基本代码修改下就可以了。谢谢大家观看。
完整项目代码加群:1136192749