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

1、准备环境

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

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

pip install pandas
pip install bs4
pip install selenium

2、详细爬取过程

2.1 分析待爬取网页

fig2-1-web_analysis_fig1.png

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
'''

想要学习Python?Python学习交流群:1004391443满足你的需求,资料都已经上传群文件,可以自行下载!

'''
# 打开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选择器定位到我们的表头数据和表数据

fig2-2-web_css_select1.png

 

fig2-3-web_css_select2.png

# 表头和表数据
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可以得到如下数据表头:

(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行,如下表

 断面名称测量时间pH溶解氧氨氮高锰酸盐指数总有机碳水质类别断面属性站点情况
0四川攀枝花龙洞2019-01-22 12:007.9810.720.05----I 仪器故障
1四川宜宾凉姜沟2019-01-22 12:007.7510.770.072.18--II入长江前正常
2云南红河州河口2019-01-22 12:007.419.090.213.4--II中-越出境仪器故障
3云南昆明观音山2019-01-22 12:008.518198.692070.277.51--IV湖体正常
4云南昆明西苑隧道2019-01-22 12:027.98.70.243.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个文件,可以看到如下图。

fig2-4-web_data_excel

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值