注: 最近有一小任务,须要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网。因为这两个网站的数据都是动态加载出来的,因此我用了Selenium来完成个人数据获取。数据的获取过程跟人手动获取过程相似,因此也不会对服务器形成更大负荷。这是我写的第1个爬虫,初次接触,还请各位多多指教。本文的代码见Selenium获取动态页面数据1.ipynb或Selenium获取动态页面数据1.py。css
工欲善其事,必先装好环境,耐心地把下面的环境装好。html
安装Selenium和其一些必要的包:python
pip install pandas pip install bs4 pip install selenium
pandas
自没必要多说,很是强大的数据分析库,网上教程很是丰富。bs4
是一个比较方便的html页面解析的包,详细的能够自由百度教程,网上有不少,固然也有它的Beautiful Soup官网文档,这是中文的,比较良心。selenium
可以用于自动测试咱们的网页,模拟咱们的浏览器,也很强大,它的说明文档在此。最后咱们须要安装浏览器的支持,若是电脑上已安装有Chrome
浏览器,则还需下载chromedirver,注意须要安装与浏览器对应的版本,下载完成后,须要将其添加至系统的Path
中。也能够安装PhantomJS,这是一个无界面的浏览器,速度更快一些,体积也不大。一样,下载好后,须要将其添加至系统的Path
中。web
另外,关于Python的学习环境,建议安装一个Jupyter。chrome
打开咱们的国家地表水水质自动监测实时数据发布系统:http://123.127.175.45:8082/以下图2-1所示,咱们能够看到它的数据是动态地在更新,每次只显示了十多条数据,可是这只是一个假象,其实在咱们打开页面,加载完成后,全部的数据已经加载过来了,只是没有显示出来,不信咱们能够按F12,<li></li>
标签下的数据就是加载完成后的数据,共100条数据(有时候也只有99条)。api
运行下面代码,会自动弹出Chrome浏览器的窗口;若是用的browser = webdriver.PhantomJS()
,则没有窗口出来。浏览器的窗口出来后,能够看到,它加载出咱们的页面了。浏览器
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 # 打开chrome浏览器(需提早安装好chromedriver) browser = webdriver.Chrome() # browser = webdriver.PhantomJS() print("正在打开网页...") browser.get("http://123.127.175.45:8082/")
网页完成后打开完成后,还须要等待一下它的加载,只有等数据加载完成,咱们才能去获取它的HTML页面源码。服务器
print("等待网页响应...") # 须要等一下,直到页面加载完成 wait = WebDriverWait(browser, 10) wait.until(EC.presence_of_element_located((By.CLASS_NAME, "grid"))) print("正在获取网页数据...") soup = BeautifulSoup(browser.page_source, "lxml") browser.close()
经过CSS选择器定位到咱们的表头数据和表数据,以下图2-2和图2-3所示less
# 表头和表数据 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])
咱们查看water_df
能够获得以下数据表头:学习
断面名称 | 测量时间 | pH | 溶解氧 | 氨氮 | 高锰酸盐指数 | 总有机碳 | 水质类别 | 断面属性 | 站点状况 |
---|
上面咱们从表数据中的tr
标签得到全部数据行后,将其全部数据提取出来,添加到咱们前面定义好的water_df
中。
print("提取网页数据中...") for i, data_row in enumerate(data_rows): # 以名字为地名和时间标识符,以防止数据重复 water_loc = water_df.iloc[:, 0].values water_date = water_df.iloc[:, 1].values row_dat = [r.text for r in data_row] water_df.loc[i] = row_dat
查看我获取的数据前5行,以下表
断面名称 | 测量时间 | pH | 溶解氧 | 氨氮 | 高锰酸盐指数 | 总有机碳 | 水质类别 | 断面属性 | 站点状况 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 四川攀枝花龙洞 | 2019-01-22 12:00 | 7.98 | 10.72 | 0.05 | -- | -- | I | 仪器故障 | |
1 | 四川宜宾凉姜沟 | 2019-01-22 12:00 | 7.75 | 10.77 | 0.07 | 2.18 | -- | II | 入长江前 | 正常 |
2 | 云南红河州河口 | 2019-01-22 12:00 | 7.41 | 9.09 | 0.21 | 3.4 | -- | II | 中-越出境 | 仪器故障 |
3 | 云南昆明观音山 | 2019-01-22 12:00 | 8.51819 | 8.69207 | 0.27 | 7.51 | -- | IV | 湖体 | 正常 |
4 | 云南昆明西苑隧道 | 2019-01-22 12:02 | 7.9 | 8.7 | 0.24 | 3.5 | -- | II | 湖体 | 正常 |
获得数据后,通常要保存咱们的数据,pandas
给咱们提供了很是方便的方法,能够保存为各类常见格式的数据,下面咱们将其保存为.csv
文件格式,因为这里面有中文编码,因此另外还保存了一个GB18030
编码格式的文件,这样直接用excel打开,不会出现乱码。平时若是处理数据,还里建议用下面的utf-8
编码的文件。
data_str = datetime.datetime.now().strftime('%Y_%m_%d') water_df.to_csv("data_water_%s_ch.csv" % (data_str), index=None, encoding="GB18030") water_df.to_csv("data_water_%s.csv" % (data_str), index=None) print("数据提取完成!!")
数据提取完成后,能够看到下面2个文件:data_water_2019_01_22.csv、data_water_2019_01_22_ch.csv,直接用excel
打开第2个文件,能够看到以下图2-4。
此次,咱们主要用selenium
模型浏览器获得动态加载的HTML页面源码,而后利用BeautifulSoup
解析其中的数据,最后利用Pandas
处理咱们数据。
这也是我第1次写爬虫,还请各位不吝赐教。这次数据的获取还比较简单,下一篇《Python+Selenium爬取动态加载页面(2)》再来写一下要点击按钮的,稍微复杂一点点。