Python3 + selenium 获取疫情中高风险区数据
- 背景: 需要动态将疫情风险区数据和区域业务动作想结合, 赋能销售业务, 内部使用非商用哈
- 环境: Python3 + selenium 自动化测试软件中 Chrome 驱动 exe 文件
- 输出: 以 excel 的方式输出到本地E盘文件和Mysql数据库
- 原理: 通过脚本模拟浏览器去点击页面, 通过定位元素位置进行提取
- 风险: 太频繁就会失败, 性能不强, 不够稳定
源代码如下
import time
import pandas as pd
from lxml import etree
from selenium.webdriver import Chrome, ChromeOptions
from sqlalchemy import create_engine
def get_tab_page_data (html_dom):
"""将tab下面的所有页面的数据获取以dataframe方式返回"""
need_click_pages = int(html_dom.xpath(PATH_DATA_PAGES)[0])
print(f'一共 {need_click_pages} 页哦: ')
# 遍历每个区, 提取标题和明细 取所有显示数据
area_data_list = []
for page_num in range(1, need_click_pages):
html_dom = etree.HTML(chrome.page_source)
div_list = html_dom.xpath(PATH_DATA_AREAS)
for div in div_list:
# 获取 标题-到区: [省, 市, 区]
risk_title = div.xpath(PATH_RISK_TITLE)
area_data_list.append(risk_title)
time.sleep(SECONDS)
chrome.find_element_by_id(PATH_NEXT_BUTTON).click()
print(f'正在帮 杰哥 获取 第 {page_num} 页 数据, 一共有 {need_click_pages} 页, 冲鸭!')
# 最后将所有区域数据拼接为一个大的 dataframe
return pd.DataFrame(area_data_list)
# main
# ##################### config #############################
# 点击延迟时间 (秒)
SECONDS = 3
BASE_URL = 'http://bmfw.www.gov.cn/yqfxdjcx/risk.html'
# xpah, 所需数据在页面中的定位
PATH_TIME_UPPDATE = '//p[@class="tabs-header-title"]/text()'
PATH_DATA_PAGES = '//button[7]/text()'
PATH_DATA_AREAS = '//div[@class="risk-info-table"]'
PATH_RISK_TITLE = './div[@class="risk-info-table-title"]//text()'
PATH_NEXT_BUTTON = 'nextPage'
PATH_RISK_MIDDLE = '//div[@class="tabs-header-tab"][1]'
# ##################### config #############################
strat_time = time.time()
print('目标网站是全国卫健委官网: ', BASE_URL)
print('实现方式是通过 selenium 这种测试软件去模拟浏览器行为, 需要安装 driver 的哈')
print('然后通过 xpath 的方式去定位需要的数据并作提取')
print('过程中会在页面刷新和点击的时候设置 sleep 以伪装得更像人为操作')
print('go go go !!!')
print()
print('正在初始化一个浏览器~')
opt = ChromeOptions()
opt.headless = True
chrome = Chrome(options=opt)
# chrome = Chrome()
print('浏览器初始化成功!')
print()
print('正在帮杰哥获取 高风险地区数据, 需要时间去骗过校验, 等待时间较长,请耐心哦~')
chrome.get(BASE_URL)
html_dom = etree.HTML(chrome.page_source)
df_risk_high = get_tab_page_data(html_dom)
print()
print('为保证数据质量, 我先进行浏览器刷新一遍并降低速度以免被识别出来是机器哦~')
print('ok, 现帮杰哥获取 中风险地区数据, 即点击切换顶部的 tab 块获取中风险的数据~')
chrome.find_element_by_xpath(PATH_RISK_MIDDLE).click()
time.sleep(SECONDS)
html_dom = etree.HTML(chrome.page_source)
df_risk_mid = get_tab_page_data(html_dom)
print()
print('正在帮 杰哥 做最后的数据清洗~')
# ##################### data processing #####################################
update_time_str = str(html_dom.xpath(PATH_TIME_UPPDATE))
update_time = update_time_str[4:17] + ":00"
df_risk_area = pd.concat([df_risk_high, df_risk_mid])
df_risk_area.columns = ['area', 'risk_level']
df_expand_col = df_risk_area['area'].str.split(' ', expand=True)
df_risk_area[['province', 'city', 'district']] = df_expand_col
# 单独处理北京的 "城市" 是 "区" 的问题
df_area_bj = df_risk_area[df_risk_area['province'] == '北京市']
tmp_district = df_area_bj['city'].copy(deep=True)
df_area_bj['city'] = df_area_bj['province']
df_area_bj['district'] = tmp_district
df_not_bj = df_risk_area[df_risk_area['province'] != '北京市']
df_ret = pd.concat([df_area_bj, df_not_bj])
df_ret.drop(labels=['area'], axis=1, inplace=True)
df_ret['update_time'] = update_time
df_ret.to_excel('E:/疫情中高风险区明细.xlsx', index=False)
# 同时也存一份到 mysql 数据库中, 以覆盖的方式
engine = create_engine('mysql+pymysql://PWD:USER@HOST:PORT/DATABASE?charset=utf8')
# 每次都删表重写, 只保留最新数据
df_ret.to_sql(con=engine, name="risk_area_covid", if_exists='replace')
pd.read_sql("select * from risk_area_covid", con=engine)
# ##################### data processing #####################################
end_time = time.time()
used_minutes = round((end_time - strat_time) / 60, 1)
chrome.quit()
print()
print('处理成功!, 数据已存储在 E盘 和 Mysql 数据库啦, 快去查看吧!')
print(f'累计耗时: {used_minutes} 分钟')
运行过程
目标网站是全国卫健委官网: http://bmfw.www.gov.cn/yqfxdjcx/risk.html
实现方式是通过 selenium 这种测试软件去模拟浏览器行为, 需要安装 driver 的哈
然后通过 xpath 的方式去定位需要的数据并作提取
过程中会在页面刷新和点击的时候设置 sleep 以伪装得更像人为操作
go go go !!!
正在初始化一个浏览器~
浏览器初始化成功!
正在帮杰哥获取 高风险地区数据, 需要时间去骗过校验, 等待时间较长,请耐心哦~
一共 8 页哦:
正在帮 杰哥 获取 第 1 页 数据, 一共有 8 页, 冲鸭!
正在帮 杰哥 获取 第 2 页 数据, 一共有 8 页, 冲鸭!
正在帮 杰哥 获取 第 3 页 数据, 一共有 8 页, 冲鸭!
正在帮 杰哥 获取 第 4 页 数据, 一共有 8 页, 冲鸭!
正在帮 杰哥 获取 第 5 页 数据, 一共有 8 页, 冲鸭!
正在帮 杰哥 获取 第 6 页 数据, 一共有 8 页, 冲鸭!
正在帮 杰哥 获取 第 7 页 数据, 一共有 8 页, 冲鸭!
为保证数据质量, 我先进行浏览器刷新一遍并降低速度以免被识别出来是机器哦~
ok, 现帮杰哥获取 中风险地区数据, 即点击切换顶部的 tab 块获取中风险的数据~
一共 11 页哦:
正在帮 杰哥 获取 第 1 页 数据, 一共有 11 页, 冲鸭!
正在帮 杰哥 获取 第 2 页 数据, 一共有 11 页, 冲鸭!
正在帮 杰哥 获取 第 3 页 数据, 一共有 11 页, 冲鸭!
正在帮 杰哥 获取 第 4 页 数据, 一共有 11 页, 冲鸭!
正在帮 杰哥 获取 第 5 页 数据, 一共有 11 页, 冲鸭!
正在帮 杰哥 获取 第 6 页 数据, 一共有 11 页, 冲鸭!
正在帮 杰哥 获取 第 7 页 数据, 一共有 11 页, 冲鸭!
正在帮 杰哥 获取 第 8 页 数据, 一共有 11 页, 冲鸭!
正在帮 杰哥 获取 第 9 页 数据, 一共有 11 页, 冲鸭!
正在帮 杰哥 获取 第 10 页 数据, 一共有 11 页, 冲鸭!
正在帮 杰哥 做最后的数据清洗~
处理成功!, 数据已存储在 E盘 和 Mysql 数据库啦, 快去查看吧!
累计耗时: 1.5 分钟
结果呈现

Python3 + selenium 获取疫情中高风险区数据的更多相关文章
- python3+selenium获取列表某一列的值
python3+selenium获取列表某一列的值 我们在坐自动化测试时,我们可能不想单纯的想验证一个选项卡,我们让脚本随机选择一个选项进行接下来的操作.例如我们想获取列表某一列的某一个数据(随机的) ...
- Python3+Selenium获取session和token供Requests使用教程
一.背景说明 之前写了一款简单的api模糊测试工具,之前系统可以使用http Base认证现在改成session形式并加上了token. 最简单的改造方法,是自己先在浏览器手动登录,然后提取出sess ...
- python3 selenium模拟登陆斗鱼提取数据保存数据库
# coding=utf-8from selenium import webdriverimport jsonimport timeimport pymongo class Douyu: def __ ...
- Python3 Selenium WebDriver网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作
Python3 Selenium WebDriver网页的前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 通过selenium webdr ...
- python3爬虫-通过selenium获取TB商品
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...
- Python3.x:selenium获取iframe内嵌页面的源码
Python3.x:selenium获取iframe内嵌页面的源码 前言 在一些网页中经常会看到ifrmae/frame标签,iframe是嵌入式框架一般用来在已有的页面中嵌入另一个页面,当一个元素在 ...
- python3 requests获取某网站折线图上数据
比如要抓取某网站折线图上数据,如下截图: 借助Chrome开发者工具Network.经过分析发现获取上面的热度数据,找到对应的事件url:https://pcw-api.iqiyi.com/video ...
- selenium获取缓存数据
爬虫呢有时候数据方便有时候登入获得cookies,以及获取他存缓存中的数据 一.获取缓存中的数据其实很简单js注入就好了 localStorage_1 = driver.execute_script( ...
- 【原创】Selenium获取请求头、响应头
本文仅供学习交流使用,如侵立删! Selenium获取请求头.响应头 操作环境 win10 . mac Python3.9 selenium.seleniumwire selenium是没有办法直接获 ...
- Python3 Selenium多窗口切换
Python3 Selenium多窗口切换 以腾讯网(http://www.qq.com/)为例,打开腾讯网,点击新闻,打开腾讯新闻,点击新闻中第一个新闻链接. 在WebDriver中封装了获取当前窗 ...
随机推荐
- Linux挂载U盘,SD卡
Linux挂载U盘,SD(TF)卡 1.插入U盘,执行如下指令后能看到设备则说明连接成功 sudo fdisk -l #查看外接设备名称,一般为/dev/sd...,这里假设为/dev/sdc1 2. ...
- idea debug时提示”Method breakpoints may dramatically slow down debugging“的解决办法
- Spark1.6和2.0版本区别(一) 累加器
1.6版本 2.0版本
- VMware虚拟机上安装CentOS8详细教程
1.准备工作 1.1.需要准备好已安装完成的VMware虚拟机,如果您的电脑未安装VMware虚拟机,请参考以下连接:https://www.cnblogs.com/x1234567890/p/148 ...
- echarts柱形图给X轴坐标类目添加点击事件
在项目中遇到这么个需求要在柱形图上的x轴添加点击事件,当点击对应x轴文字的时候要弹出模态框展示子图表 根据echarts的Api给图表实例绑定点击事件 myChartInstance?.on('cli ...
- go 逐行读取文件
前言 文件 I/O,特别是对文件的读写是编程语言中重要的功能.通常,我们需要逐行读取文件. GO 提供了 bufio 软件包,实现了有缓冲的 I/O.它包装一个 io.Reader 或 io.Writ ...
- vue 判断某个时间小于当前时间
如下 new Date().getTime() 获取当前时间(毫秒) 我需要对比的时间为秒,所以需要除于1000 <div v-if="scope.row.created_at < ...
- MySQL 8.0 误删了root用户怎么办
MySQL 8.0 误删了root用户怎么办 修改配置文件 修改配置文件,让其可以无账号登录 默认的文件为: /etc/my.cnf 添加:skip-grant-tables 重启服务 service ...
- 算法图解,关于数组,链表,以及大O表示法
有关数组.链表以及大O表示法 关于数组 [1] 连续性:数组在内存中连续储存,就像是看电影的一群人排排坐. [2] 易读性:数组中的元素可以随意读取. [3] 难改性:由于连续的特性,增减元素都会导致 ...
- CentOS7 安装 Redis 7.0.2
安装 Redis # 首先安装依赖gcc, 后面需要使用make编译redis yum install gcc -y # 进入 /usr/local/src 目录, 把源码下载到这里 cd /usr/ ...