• 背景: 需要动态将疫情风险区数据和区域业务动作想结合, 赋能销售业务, 内部使用非商用哈
  • 环境: 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 获取疫情中高风险区数据的更多相关文章

  1. python3+selenium获取列表某一列的值

    python3+selenium获取列表某一列的值 我们在坐自动化测试时,我们可能不想单纯的想验证一个选项卡,我们让脚本随机选择一个选项进行接下来的操作.例如我们想获取列表某一列的某一个数据(随机的) ...

  2. Python3+Selenium获取session和token供Requests使用教程

    一.背景说明 之前写了一款简单的api模糊测试工具,之前系统可以使用http Base认证现在改成session形式并加上了token. 最简单的改造方法,是自己先在浏览器手动登录,然后提取出sess ...

  3. python3 selenium模拟登陆斗鱼提取数据保存数据库

    # coding=utf-8from selenium import webdriverimport jsonimport timeimport pymongo class Douyu: def __ ...

  4. Python3 Selenium WebDriver网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作

    Python3 Selenium WebDriver网页的前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 通过selenium webdr ...

  5. python3爬虫-通过selenium获取TB商品

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  6. Python3.x:selenium获取iframe内嵌页面的源码

    Python3.x:selenium获取iframe内嵌页面的源码 前言 在一些网页中经常会看到ifrmae/frame标签,iframe是嵌入式框架一般用来在已有的页面中嵌入另一个页面,当一个元素在 ...

  7. python3 requests获取某网站折线图上数据

    比如要抓取某网站折线图上数据,如下截图: 借助Chrome开发者工具Network.经过分析发现获取上面的热度数据,找到对应的事件url:https://pcw-api.iqiyi.com/video ...

  8. selenium获取缓存数据

    爬虫呢有时候数据方便有时候登入获得cookies,以及获取他存缓存中的数据 一.获取缓存中的数据其实很简单js注入就好了 localStorage_1 = driver.execute_script( ...

  9. 【原创】Selenium获取请求头、响应头

    本文仅供学习交流使用,如侵立删! Selenium获取请求头.响应头 操作环境 win10 . mac Python3.9 selenium.seleniumwire selenium是没有办法直接获 ...

  10. Python3 Selenium多窗口切换

    Python3 Selenium多窗口切换 以腾讯网(http://www.qq.com/)为例,打开腾讯网,点击新闻,打开腾讯新闻,点击新闻中第一个新闻链接. 在WebDriver中封装了获取当前窗 ...

随机推荐

  1. Ansible - [03] Ansible ad-hoc模式

    Ansible ad-hoc是一种通过命令行批量管理的方式 格式:ansible 主机集合 -m 模块名 -a "参数" 其他参数: -k 使用密码远程.-i 指定主机列表文件 以 ...

  2. Linux - centos6忘记root密码怎么办?

    Linux的root密码修改不像Windows的密码修改找回,Windows的登录密码忘记需要介入工具进行解决.CentOS6和CentOS7的密码方法也是不一样的,具体如下 1.开机按esc   2 ...

  3. 【攻防世界】warmup

    warmup (反序列化与sql注入) 题目来源 攻防世界 NO.GFSJ0999 题目描述 题目提示:平平无奇的输入框 打开网址页面如下,没有有用信息. 题目给了附件,直接下载,得到源码如下: in ...

  4. Opera打不开网页解决办法

    打开目录C:\Users\用户名\AppData\Roaming\Opera Software\Opera Stable 2.查找{"country":"CN" ...

  5. CF2029C New Rating

    思路(二分 + 数据结构优化DP) 大致题意为:一个值 \(x\) 初始为 \(0\),然后有一个数组 \(a\),遍历一次数组. 如果 \(a_i > x\),则 \(x + 1\). 如果 ...

  6. web站点常见漏洞及解决方法

    1.PHP Web表单哈希冲突拒绝服务漏洞 漏洞分析:PHP 5.3.9之前版本在计算表单参数哈希值的实现上存在拒绝服务漏洞,该漏洞源于未提前限制哈希冲突.攻击者可利用该漏洞通过发送小量的特制webf ...

  7. Oracle 23ai TPC-H 测试环境部署

    最近,我在 Oracle Database 23ai 上进行了 TPC-H 100GB 测试,并整理了完整的实施步骤和优化经验.如果你也想评估 Oracle 数据库在决策支持场景下的性能,可以参考我的 ...

  8. bp安装+匹配规则(防止抓火狐的多余包)

    bp安装使用 BurpLoaderKeygen.jar: 2c8c7b95640f31985f83580402f26a06b78c55877fa33ef1f9d14d2ebb2d8ecd burpsu ...

  9. 吐血整理!2025 最好用 AI 工具全汇总,别再瞎找了!

    在当下这个 AI 蓬勃发展的时代,各类 AI 工具如雨后春笋般涌现,让人眼花缭乱.无论是职场人士想要提升工作效率,还是创作者渴望激发灵感.优化内容,亦或是学生期望找到学习的得力助手,都在苦苦寻觅真正好 ...

  10. JS中数组的操作方法大全

    常见的一些数组操作push . pop.unshift. shift push 语法: array.push(item1, item2, -, itemX) push( )方法:可以将一个或者更多的参 ...