• 背景: 需要动态将疫情风险区数据和区域业务动作想结合, 赋能销售业务, 内部使用非商用哈
  • 环境: 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. 5分钟搞定!用比扬云SD-WAN远程访问飞牛NAS全攻略

    作为一个NAS重度用户,我最近遇到了一个头疼的问题:如何在外部安全地访问家里的飞牛NAS?经过一番摸索,我发现比扬云SD-WAN是个不错的解决方案,今天就来分享我的实战经验. 一.为什么选择比扬云SD ...

  2. ABB喷涂机器人维护保养

    正确规范的ABB喷涂机器人保养能够最大限度保证机器人正常运行, 保证经济效率并提高产量.因此,预防性喷涂机器人保养是一项不可或缺的工作. ABB喷涂机器人正常运行每3年或10000小时后,则需要做一次 ...

  3. Qt QFileSystemModel 的使用

    Model 指的是数据 View 指的是界面,View不用设置,只需要和Model进行绑定,绑定完成之后就是Model的格式了 例子:本例子中QListView QTableView QTreeVie ...

  4. 洛谷P4390 [BalkanOI2007] Mokia 摩基亚 题解

    题目传送门. 想必 我的另外一篇题解 已经把这道题的思路说的很清楚了,但是那道题是把所有的修改全部告诉你,然后再一个一个问你矩阵和,但是这道题他是修改中夹着询问,但是没有关系,我们照样可做. 考虑将所 ...

  5. 多机器的键鼠互通——Synergy/Deskflow配置记录

    Synergy (1.14.6) 情况一样,那么感觉就是机器之间TCP连接有问题,测试不同 一些测试命令 ss -tlnp | grep 24800 # 查看端口情况 sudo lsof -i :24 ...

  6. Assignment to property of function parameter 'XXX' no-param-reassign 记录

    在react项目中写了一个工具方法将两个数组数据进行整合,用了双重for循环,但是在提交代码时报了eslint的no-param-reassign 结果效果是有了,但是报lint错误,图片中已是解决后 ...

  7. PIL或Pillow学习2

    接着学习下Pillow常用方法: PIL_test1.py : ''' 9, Pillow图像降噪处理 由于成像设备.传输媒介等因素的影响,图像总会或多或少的存在一些不必要的干扰信息,我们将这些干扰信 ...

  8. StringBuilder的介绍、构造方法及成员方法

    1.StringBuilder的介绍 1.StringBuilder是字符串缓冲区,可以认为是一种容器,能装任何类型的数据,但被装入的数据都会变为字符串 如图 无论是什么类型的数据,被装入字符串缓冲区 ...

  9. Solana编译失败探讨(OpenEuler RISC-V版)

      Solana 是 2017 年由 Anatoly Yakovenko 创立的开源项目,旨在打造高性能.去中心化且低成本的区块链平台2.它采用独特的 Proof of History(PoH)共识机 ...

  10. DataPermissionInterceptor源码解读

    本文首发在我的博客:https://blog.liuzijian.com/post/mybatis-plus-source-data-permission-interceptor.html 一.概述 ...