python+selenium+phantomJS爬取国家地表水水质自动监测实时数据发布系统——动态网页爬虫

一、关于phantomjs

1、介绍

PhantomJS是一个为自动化而生的利器,它本质上是一个基于webkit内核的无界面浏览器,并可使用JavaScript或CoffeeScript进行编程。由于没有界面,它的使用就有点像curl, lynx之类的命令行式文本浏览器。但PhantomJS远不是文本浏览器那么简单,由于它是基于webkit内核的,因此拥有的完善的Javascript解析、页面渲染功能,你完全可用它来模拟一个现代浏览器在加载网页时所做的各种事件。
但是,PhantomJS早已宣布暂停开发,所有之前的关于PhantomJS 2.1.1之后的版本开发计划也已全部废弃。接下来,为了防止混淆,被废弃的版本的源码和二进制包也会被删除。在未来的通知之前,PhantomJS 2.1.1将会是已知最后的稳定版本。
值得一提的是chrome和firefox也开发出了他们的headless版本,selenium的最新版本转而支持chrome和firefox的headless版本,不建议使用phantomjs。大家以后可能要告别phantomjs了。
趁着selenium现有版本还能使用phantomjs2.1.1,赶紧使用一下。

2、下载phantomjs

网址:phantomjs下载

3、安装phantomjs

1)解压到合适路径;
2)将phantomjs.exe的路径复制到系统环境变量(path)中。

4、调用方式

python调用浏览器phantomjs、chrome、firefox。
from selenium import webdriver
1)driver = webdriver.phantomjs();
2)driver = webdriver.chrome();
3)driver = webdriver.firefox()。
chrome和firefox的headless版本另行学习。
本文仅对phantomjs进行讲解。

二、使用python+selenium+phantomjs爬取国家地表水水质自动监测实时数据发布系统数据

1、爬虫思路

网址:国家地表水水质自动监测实时数据发布系统
网站为动态加载页面,注意区别一般的静态页面。python+selenium+phantomJS爬取国家地表水水质自动监测实时数据发布系统——动态网页爬虫_第1张图片
右击查看网页源代码不能找到监测数据,因此跟之前的淘宝网页面有点区别。既然数据没有被写在网页源代码中,通过抓取源代码再进行正则表达式解析的方式肯定是不行的。
打开开发者工具,转到elements→审查→找到数据位置。
python+selenium+phantomJS爬取国家地表水水质自动监测实时数据发布系统——动态网页爬虫_第2张图片
分析结果:
1)这个网站的数据是动态更新的,每次仅显示10多条数据,很显然返回数据不仅仅是这些;
2)当我们打开“开发者工具”,发现加载的数据全在li标签中,数据有65条;
3)表头数据在class=panel-heading的div标签的td子标签中;
4)表数据在class=grid的ul标签的tr子标签中;
5)对于使用网页动态技术的页面的抓取,需要用到phantomjs和selenium来模拟浏览器登录后对网页进行解析;
6)分析结束,开始编写代码。

2、代码

--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
import time

browser = webdriver.PhantomJS()
print("打开网页中。。。")
browser.get("http://123.127.175.45:8082/")
print("网页响应中。。。")
wait = WebDriverWait(browser,20)
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("C:/Users/你杰哥/Desktop/python/selenium/%s_国家地表水水质自动监测系统检测数据.csv" % (data_str),index=None, encoding="GB18030")

print("数据提取完成!!")

三、开始爬虫

1、ctrl+B(本人使用sublime编写python代码),执行代码;
2、执行结果;代码执行结果
出现了"UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead"。
这不是代码执行错误,其大意是“不要再使用phantomjs”。
3、爬虫结果(2019年8月30日和31日,爬虫了两次);数据
4、使用excel打开.csv文件,查看表格数据。
2019年8月30日
python+selenium+phantomJS爬取国家地表水水质自动监测实时数据发布系统——动态网页爬虫_第3张图片
2019年8月31日python+selenium+phantomJS爬取国家地表水水质自动监测实时数据发布系统——动态网页爬虫_第4张图片

四、总结

1、对于动态页面的爬取,我们无法像爬取静态网页那样分析源代码进行爬虫,需要模拟浏览器登录再进行爬取数据;
2、selenium+phantomJS针对动态网页爬虫,简单可行,方便快捷;
3、虽然很快phantomJS可能很快会被淘汰,以至于无法使用,但是chrome和firefox的headless版本也可以下载进行使用了;
4、对浏览器开发者工具(ctrl+shift+I)认真研究,熟练使用,可以节省大量时间;
5、对于动态加载页面,需使用“审查”仔细研究“elements面板”。

你可能感兴趣的:(python)