注: 上一篇《Python+Selenium爬取动态加载页面(1)》讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网。数据的获取过程跟人手动获取过程类似,所以也不会对服务器造成更大负荷。本文的代码见Selenium获取动态页面数据2.ipynb或Selenium获取动态页面数据2.py。同样在开始前需要准备环境,具体环境准备参考上一篇。

1、数据获取目标

图1-1 全国水雨情网

可以看到,其中并没有显示任何的数据,如果我们需要查看数据,还需要点击一下其中的几个按钮。比如,我们需要得到其中大型水库的数据,那么需要点击大型水库按钮,得到如下图1-2所示的结果。

图1-2 全国水雨情信息-大型水库

得到这个页面后,就可以从其中的HTML页面源码中解析数据了。

2、详细爬取过程

2.1 打开网页

运行下面代码,会自动弹出Chrome浏览器的窗口;如果用的browser = webdriver.PhantomJS(),则没有窗口出来。浏览器的窗口出来后,可以看到,它加载出我们的页面了。

import re

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()

# 这里经常出现加载超的异常,后面需要处理一下:捕获异常后,刷新浏览器

browser.get("http://xxfb.hydroinfo.gov.cn/ssIndex.html")

2.2 查找目标数据

页面加载完成后,接下需要定位我们的大型水库按钮,通过按浏览器的F12查看源码,可以得到这个按钮的xpath://*[@id="sscontent"]/table/tbody/tr/td/table/tbody/tr[1]/td/table/tbody/tr/td[3]/a,如图2-1所示。

图2-1 xpath定位

定位到按钮后,需要再点击一下。

# 找到大型水库的按钮---通过xpath

btn_water_xpath = "//*[@id=\"sscontent\"]/table/tbody/tr/td/table/tbody/tr[1]/td/table/tbody/tr/td[3]/a"

# 等待响应完成

wait = WebDriverWait(browser, 10)

wait.until(EC.presence_of_element_located((By.XPATH, btn_water_xpath)))

# 查找目标按钮

btn_water = browser.find_element_by_xpath(btn_water_xpath)

# 找到按钮后单击

btn_water.click()

2.2 得到页面源码

数据定位完成后,接下来得到页面源码。按照上面同样的方法,我们需要定位其中的数据表,并等待其加载完成,加载完成后,我们才能读取其页面源码。

# 大型水库的数据表--xpath

water_table_xpath = "//*[@id=\"sktable\"]/table/tbody"

# 得到新的页面,并等待其数据表加载完成

wait = WebDriverWait(browser, 10)

wait.until(EC.presence_of_element_located(

(By.XPATH, water_table_xpath)))

soup = BeautifulSoup(browser.page_source, 'lxml')

2.3 提取数据

得到页面源码后,可直接利用Pandas的read_html方法得以其中的表格数据,非常方便。同时我们还需要定位它的表头信息,来得到我们的表头。

# 表头信息

table_head_csel = "#skcontent>table:nth-child(3)>tbody>tr"

table_head = soup.select(table_head_csel)[0]

# 通过css选择器,找到水库表信息

table_css_select = "#sktable"

table_content = soup.select(table_css_select)[0]

df_table = pd.read_html(str(table_content))[0]

df_table.columns = [h.text for h in table_head.find_all("td")]

# df_table.columns = ['流域', '行政区', '河名', '库名', '库水位(米)', \

# '蓄水量(亿米3)', '入库(米3/秒)', '堤顶高程(米)']

查看提取数据的前5行,如表2.1所示。

表2.1 提取数据前5行

流域

行政区

河名

库名

库水位(米)

蓄水量(亿米3)

入库(米3/秒)

堤顶高程(米)

0

其他流域

新疆

乌伦古河

福海水库

575.14 ↓

1.756

0

579.00

1

其他流域

新疆

卡浪古尔河

喀浪古尔水库

988.26 —

0.126

1.23

1007.50

2

其他流域

新疆

三屯河

三屯河水库

1024.49 —

0.078

1.982

1039.60

3

其他流域

新疆

头屯河

头屯河水库

986.52 —

0.108

1.75

995.20

4

其他流域

新疆

乌鲁木齐河

红雁池水库

995.54 ↓

0.234

0

1009.00

2.4 保存数据

数据提取完成后,下面还将其表格的时间提取出来,以作为文件名,防止数据重复。这里利用了一个简单的正则表达式提时间信息,然后利用pandas的to_csv方法,得到两种编码格式的.csv文件。其中rvr_tab_2019_1_22_ch.csv为中文编码格式,可直接用excel打开,如图2-2所示。

# 找到水库信息的时间

table_time_csel = "#skdate"

time_text = soup.select(table_time_csel)[0].text

time_info = re.search(r"(\d{4})年(\d{1,2})月(\d{1,2})", time_text).groups()

df_table.to_csv("rvr_tab_%s_%s_%s.csv" % time_info, index=None)

# 换一个编码方式,此文件可以直接用excel打开,不会出现乱码

df_table.to_csv("rvr_tab_%s_%s_%s_ch.csv" % time_info,encoding="GB18030", index=None)

图2-2 获取的数据

总结

本文的方法与上一篇《Python+Selenium爬取动态加载页面(1)》的方法类似,只是多一个按钮点击的过程。

从这两篇博文的数据提取过程来看,简单地,其数据获取有如下图所示的过程。

动态网页数据提取流程

python爬虫动态加载页面_Python+Selenium爬取动态加载页面(2)相关推荐

  1. Python爬虫:最牛逼的 selenium爬取方式!

    Python爬虫:最牛逼的 selenium爬取方式! 作为一个男人 在最高光的时刻 这是小编准备的python爬虫学习资料,加群:700341555即可免费获取! Python爬虫:最牛逼的 sel ...

  2. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)

    文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...

  3. 使用scrapy +selenium爬取动态渲染的页面

    背景 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现 ...

  4. 【爬虫】Selenium爬取动态网页的base64图片

    文章简介 Selenium爬取动态网页的base64图片,并解决页面完整加载缓慢,base64字符串的获取和格式转码,一些页面不存在,部分照片无法加载等问题.后附源码. 目录 1,需求 2,环境和使用 ...

  5. 踩坑的Python爬虫:新手如何在一个月内学会爬取大规模数据?

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得 ...

  6. Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

    Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...

  7. Python爬虫之scrapy框架360全网图片爬取

    Python爬虫之scrapy框架360全网图片爬取 在这里先祝贺大家程序员节快乐,在此我也有一个好消息送给大家,本人已开通了微信公众号,我会把资源放在公众号上,还请大家小手动一动,关注过微信公众号, ...

  8. Python爬虫实例 wallhaven网站高清壁纸爬取。

    文章目录 Python爬虫实例 wallhaven网站高清壁纸爬取 一.数据请求 1.分析网页源码 2.全网页获取 二.数据处理 1.提取原图所在网页链接 2.获取高清图片地址及title 三.下载图 ...

  9. Python爬虫系列之抖音热门视频爬取

    Python爬虫系列之抖音热门视频爬取 主要使用requests库以及手机抓包工具去分析接口 该demo仅供参考,已经失效,需要抖音2019年5月最新所有接口请点击这里获取 抖音资源获取接口文档请点击 ...

最新文章

  1. 以太坊开发者工具的最新清单
  2. codewars??? Is my friend cheating?
  3. 数据分析师+做过名企项目+懂运营+985毕业=跳槽失败?
  4. centos7.4下安装mysql_Linux(Centos7.4)服务器下安装mysql
  5. div中的p标签于img设置同一水平_HTML网页制作常用标签及说明——前端开发入门...
  6. java classnotfoundexception e_关于解释class文件时出现java.lang.ClassNotFoundException的问题...
  7. iOS之友盟简单分享(第三方)及sso授权问题
  8. 【POJ-2796】Feel Good【单调栈】
  9. Xshell使用教程
  10. [python]LDA模型使用流程及代码
  11. maya 阿诺德水晶材质_Maya自带Arnold中的Ai Standard Surface材质如何渲染透明贴图?...
  12. 关于净推荐值(NPS)的理解
  13. 概要设计的过程和任务
  14. 什么叫单模光纤_单模光纤和多模光纤的区别,以及作用是什么?
  15. 华为普工一个月的工资是多少?
  16. 华为云全流程护航《流浪方舟》破竹首发,打造口碑爆款
  17. 零基础轻松学python青少年趣味编程pdf_零基础轻松学PYTHON:青少年趣味编程(全彩版) 快学习教育编著 著...
  18. 不同工资的男生睡前在想什么 vs 不同工资的女生睡前在想什么
  19. 微信小程序之map地图
  20. Android SAF

热门文章

  1. 【Hyperledger Fabric】学习笔记1—— 区块链介绍
  2. 旅游类APP-Android模块分析
  3. 若依管理系统windows本地运行教程
  4. C语言程序设计——结构体
  5. Pandas函数方法分类 参数说明+实例分析!!
  6. 基于8086的家庭安全防盗系统proteus制作
  7. MPC5748G S32_SDK_PA_RTM_3.0.0 GPIO 调试仿真设置
  8. 高尔顿与回归分析的起源
  9. 人脸验证(图片/视频) tensorflow、pytorch框架、dlib库(face_recognition)和opencv库————附带详细步骤和代码,可实际运行
  10. 华为手机双击确认怎么取消_华为双击屏幕放大怎么取消