注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统全国水雨情网。由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取。数据的获取过程跟人手动获取过程类似,所以也不会对服务器造成更大负荷。这是我写的第1个爬虫,初次接触,还请各位多多指教。本文的代码见Selenium获取动态页面数据1.ipynb或Selenium获取动态页面数据1.py

1、准备环境

工欲善其事,必先装好环境,耐心地把下面的环境装好。

  • 建议安装Python3的版本,一般来说越新越好。这是官网下载安装,或者网上其它教程

  • 安装Selenium和其一些必要的包:

    pip install pandas
    pip install bs4
    pip install selenium

    pandas自不必多说,非常强大的数据分析库,网上教程非常丰富bs4是一个比较方便的html页面解析的包,详细的可以自由百度教程,网上有很多,当然也有它的Beautiful Soup官网文档,这是中文的,比较良心。selenium能够用于自动测试我们的网页,模拟我们的浏览器,也很强大,它的说明文档在此

  • 最后我们需要安装浏览器的支持,如果电脑上已安装有Chrome浏览器,则还需下载chromedirver,注意需要安装与浏览器对应的版本,下载完成后,需要将其添加至系统的Path中。也可以安装PhantomJS,这是一个无界面的浏览器,速度更快一些,体积也不大。同样,下载好后,需要将其添加至系统的Path

  • 另外,关于Python的学习环境,建议安装一个Jupyter

2、详细爬取过程

2.1 分析待爬取网页

打开我们的国家地表水水质自动监测实时数据发布系统:http://123.127.175.45:8082/如下图2-1所示,我们可以看到它的数据是动态地在更新,每次只显示了十多条数据,但是这只是一个假象,其实在我们打开页面,加载完成后,所有的数据已经加载过来了,只是没有显示出来,不信我们可以按F12,<li></li>标签下的数据就是加载完成后的数据,共100条数据(有时候也只有99条)。

图2-1 国家地表水水质自动监测实时数据发布系统

2.2 利用Selenium提取数据

(1)打开网页

运行下面代码,会自动弹出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/")

(2)得到页面源码

网页完成后打开完成后,还需要等待一下它的加载,只有等数据加载完成,我们才能去获取它的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()

(3)定位数据

通过CSS选择器定位到我们的表头数据和表数据,如下图2-2和图2-3所示

图2-2 CSS选择(.panel-heading)表头

图2-3 CSS选择(.grid)表数据
# 表头和表数据
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 溶解氧 氨氮 高锰酸盐指数 总有机碳 水质类别 断面属性 站点情况

(4)提取数据

上面我们从表数据中的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行,如下表

表2.1 获取的数据表前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 湖体 正常

(5)保存数据

得到数据后,一般要保存我们的数据,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。

图2-4 最终获取的数据

总结

这次,我们主要用selenium模型浏览器得到动态加载的HTML页面源码,然后利用BeautifulSoup解析其中的数据,最后利用Pandas处理我们数据。

这也是我第1次写爬虫,还请各位不吝赐教。此次数据的获取还比较简单,下一篇《Python+Selenium爬取动态加载页面(2)》再来写一下要点击按钮的,稍微复杂一点点。

Python+Selenium爬取动态加载页面(1)的更多相关文章

  1. Python+Selenium爬取动态加载页面(2)

    注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...

  2. Scrapy 框架 使用 selenium 爬取动态加载内容

    使用 selenium 爬取动态加载内容 开启中间件 DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMidd ...

  3. 爬虫再探实战(三)———爬取动态加载页面——selenium

    自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的 ...

  4. 爬虫再探实战(四)———爬取动态加载页面——请求json

    还是上次的那个网站,就是它.现在尝试用另一种办法——直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造request ...

  5. Python爬虫爬取异步加载的数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:努力努力再努力 爬取qq音乐歌手数据接口数据 https://y.qq ...

  6. C#使用phantomjs,爬取AJAX加载完成之后的页面

    1.开发思路:入参根据apiSetting配置文件,分配静态文件存储地址,可实现不同站点的静态页生成功能.静态页生成功能使用无头浏览器生成,生成之后的字符串进行正则替换为固定地址,实现本地正常访问. ...

  7. 转:从pickle看python类成员的动态加载和类的定位

      pickle是Python轻便的对象序列化工具.使用pickle可以方便地把python对象写入文件对象中,或者像soap那样在socket间传送.     按照python的一贯作风,类的成员在 ...

  8. ExtJS 4.1 TabPanel动态加载页面并执行脚本【转】

    ExtJS 4.1 TabPanel动态加载页面并执行脚本 按照官方示例,可以动态加载页面,可是脚本不执行,于是查SDK.google,发现scripts需要设置为true,于是设置该属性,整个代码如 ...

  9. div动态加载页面

    div动态加载页面 /* /// method 1 var url="<%=basePath%>/qne.do?p=pessegerCountSet"; $.post( ...

随机推荐

  1. [Linux]《鸟哥的私房菜》笔记 (缓慢更新)

    暂时不更新了..这几天一看起书来发现内容很多,这样写blog太慢,也没意义.所以现在是每天看书,在笔记本上记笔记,再配合着<操作系统>和 linux内核 加深理解.往后会以心得体会为主写一 ...

  2. 基于MD5的增强型摘要算法

    message-digest algorithm 5(信息-摘要算法),md5的长度,默认为128bit,也就是128个0和1的二进制串.但是,这样表达是很不友好的,所以将二进制转成了16进制,每4个 ...

  3. 用JS实现控制浏览器F12与右键功能

    本文出至:新太潮流网络博客 用JS实现控制浏览器F12与右键功能,防止恶意窃取代码,或其他直接复制进去就好 //禁用右键 document.oncontextmenu = function () { ...

  4. Web Services 根据wsdl生成代理类

    生成代理类步骤: 一:找到Visual Studio 的工具文件夹 二:用管理员方式打开本机工具命令提示 三:输入要执行的脚本 wsdl /language:C# /n:xxxx.HermesMobi ...

  5. 【linux命令】lscpu、etc/cpuinfo详解

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 i2000:~ # lscpu Architecture:          x86_ ...

  6. Windows 下的文件被占用问题解决

    windows下,经常容易出现文件被其他程序占用的现象,令人十分头疼.更头疼的是,还看不到被谁占用. 实际上是有办法看到占用的进程的. 话不多说,以Win10为例: 1.打开资源监视器 a.直接程序栏 ...

  7. /etc/sudoers文件的分析以及sudo的高级用法

    高级用法总结: sudo命令是普通用户的提权操作指令.在权限控制中,我们可以使用/etc/sudoers文件中来进行设置.基本的用法比较熟悉.比如设置一个普通用户可拥有root用户的运行权限,那么设置 ...

  8. time模块案例演示

    案例01: 2008年8月8日20:08:08 往后88,888,888秒是哪天?星期几? 日期->时间戳(浮点数)->可以做数学运算 演示: import time # 构造日期的元组, ...

  9. 修改win下ras/pppoe/l2tp等连接数限制

    最近宽带重新拔号一直不换ip,拔了十几分钟IP仍然不变,想起几年前的pppoe多拔,多拔几个PPPOE占着老IP,再拔新的IP出来用 注册表路径,子项中查看MatchingDeviceId判断协议类型 ...

  10. Linux基础第二课——系统架构

    网址 192.168.0. 172.16. 10.0. 以上是内网网段 127.0.0.1 这是本地回环网卡 表示本身 查看网络是否连通 windows Linux 都是通过 ping 先ping网关 ...