整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Power Query抓取网络数据的方法,CSV格式取URL

们使用Power BI Desktop来制作上面这个图形,需要历年保险保费收入的数据作为依据,网站上有数据公布:

这个页面的地址:

/web/site0/tab5205/info4129096.htm

每个月都会有一个对应的地址,要到那里找到这些个地址呢?

我们找到了这样一个页面:

这个页面里有我们需要的每个月的数据的连接,这样的页面一共有8个,这8个页面的URL是连续的。

web/site0/tab5205/module14413/page1.htm

就是page1到page8

我们打开Power BI Desktop的Power Query,建立一个1到8的表

并且把ID这一列设置成文本,这是第一步。

第二步:要建立一个查询,从web获取数据,设置乘csv格式

复制地址栏里的公式,备用。(实在记不住这些函数,这样偷点懒,嘻嘻)

第三步:回到开始的表,自定义列,用刚才复制的公式,修改一下。

page后面的数字用ID替换一下。

第四步:数据清理,我们要的是每个月的URL,这个过程稍微有点复杂,但是用到的功能很简单,就是符号分列,筛选,替换。

1、用<a href="分列,会直接把我们需要的URL分离出来

2、筛选出带有info的行

3、再分列,用双引号分列

至此已经得到了我们想要的URL.

4、为了能够区分年月,还需要做些处理,取title后面的列,提取出来年和月,这部分就略过了。结果是这样的:

第五步:获取具体数据,如果不记得函数,还是先建立一个自web的查询,复制公式,然后自定义列。

用URL替换网址后面的部分。

第六步:展开并整理数据,这里要注意几个地方

1、删除列要修改一下,保留年和月两列

2、筛选掉所有的非省市名称的行

3、统一所有的省市名称,自己想想办法吧

4、逆透视列

最终的结果:

剩下的工作就回到Power BI Desktop用DAX建立度量值,作图就可以了。

总结一下,如果想从网页中获得需要的信息,就要抓住关键信息,Web信息有几种格式,要从源码中找信息,就用CSV格式,要找网页中的信息,就用HTML格式。不管用PQ还是PY网络抓取数据,都是一个找规律的过程,找到了规律,就能行。

存路径:D:\python\用Python读取csv文件中的沪深300指数历史交易数据

程序名称:readcsvhs300.py;

数据名称:沪深300指数历史交易数据.csv;

开发环境:Win7;

开发工具:Python 3.8.2 IDLE;

Python安装路径:D:\python。

1、下载沪深300指数历史交易数据

在浏览器中打开网址http://quotes.money.163.com/trade/lsjysj_zhishu_399300.html,于网页的右侧点击下载数据按钮,下载沪深300指数历史交易数据,其下载界面如图1所示:


图1:沪深300指数历史交易数据的下载界面图

将下载结果保存到保存路径下,命名为:沪深300指数历史交易数据.csv。

2、查看csv文件中的数据

用Excel打开沪深300指数历史交易数据.csv文件,查看下载的沪深300指数历史交易数据,效果如图2所示:


图2:用Excel打开沪深300指数历史交易数据.csv的效果图

3、编程读取csv文件中的数据

运行Python 3.8.2 IDLE开发工具,编程读取csv文件中沪深300指数历史交易数据的源代码,将源代码保存到保存路径下,命名为:readcsvhs300.py。

源代码及其注释如下所示:

import csv #导入csv模块 
csv_file=csv.reader(open('沪深300指数历史交易数据.csv','r')) #以只读方式打开csv文件
csv_content=[] #定义存储整个csv文件的列表
for line in csv_file: #按行对csv文件进行循环
    csv_content.append(line) #按行将csv文件读取到列表中
for line in range(0,20,1): #对前20行进行循环
    print(csv_content[line][0]+'  '+csv_content[line][3]) #打印每行的第0列和第3列

4、运行程序

在Python 3.8.2 IDLE开发工具中,按F5键,运行readcsvhs300.py程序,运行结果如图3所示:


图3:用Python读取csv文件中的沪深300指数历史交易数据运行结果图

ablib 是 requests 库作者常年维护的一个 python 第三方库,可以操作 Excel 等多种文件格式变成一种通用数据集。

tablib 支持的主要数据格式有:

  • xls, 老版 office 的 Excel 文件格式;
  • xlsx 系列,新版 office 文件格式;
  • JSON
  • YAML
  • HTML
  • CSV
  • df,(pandas 的 DataFrame, 需要安装 pandas)

tablib 操作测试用例的基础使用非常简单,你只需要记住以下 2 点:

  1. 使用 import_set 导入 Excel 文件
  with open('demo.xls', 'rb') as f:
    # 接受 2 个参数,读出来的数据和读取的文件格式
    data = tablib.import_set(f.read(), 'xls')
    print(data)
复制代码
  1. 使用 DataSet 创建 Excel 表格
  data = tablib.Dataset(*data_list, headers=headers,title='测试用例')
复制代码

现在来进行更精确的操作:

行列数据操作

先通过加载 Excel 文件获取到数据

  a = tablib.import_set(f.read(), 'xls')
复制代码

a 得到的是一个列表,每个元素是每一行数据。

  1. 获取行
  # 获取第一行第一列
print(a[0][0])

# 获取第一行的 url 列
print(a.dict[0]['url'])

# 获取前 2 行
print(a[:2])
复制代码
  1. 获取列
  print(a['url'])
复制代码
  1. 插入行
  with open('demo_book.xls', 'rb+') as f:

    a = tablib.import_set(f.read(), 'xls')
    print(a)
    # 添加行
    a.append(['zhiwang', 'put', '成功'])
  
    # 在指定行插入
    a.insert(2,['zhiwang', 'put', '成功'])


with open('demo_book.xls', 'wb') as f:
    f.write(a.xls)
print(a)
复制代码
  1. 插入列
  # 在最后添加
a.append_col(['成功','失败', '失败'], header='actual_result')

# 在指定位置添加列
a.insert_col(3,['成功','失败', '失败'], header='actual_result')
复制代码
  1. 修改
  # 修改某一行数据
a[0] = ('baidu', 'put', 'shibai', 'shibai')

# 修改某个具体的数据
a._data[0][0] = 'wobuzhidao'
复制代码

注意:不要在代码里直接操作 a._data, 可以封装成方法。

冒烟用例执行

在测试过程中,我们经常需要执行冒烟用例。或者给测试用例打标签,比如登录功能,成功用例,异常用例等等。tablib 通过 tags 关键字方便删选指定的测试用例来执行。

  1. 添加 tags
  # 添加标签
a.append(['buzhi', 'put', 'c','c'], tags=['成功'])
# 获取所有‘成功’的测试用例
success = a.filter(tag='成功')
复制代码
  1. 修改 tags
  # 将测试用例的标签修改成‘失败’
a._data[0].tags = ['失败']
# 获取所有‘失败’ 的测试用例
failed = a.filter(tag='失败')
print(failed)
复制代码
  1. 去除重复元素
  a.remove_duplicates()
复制代码

灵活的格式切换

测试数据最常用的功能是需要切换格式,比如把 Excel 格式的数据切换成 YAML , 这个在接口自动化测试框架 httprunner 中经常用到。还是用 a 来表示 DataSet 数据:

  1. 存储为 YAML 文件:
  with open('demo.yml', 'w', encoding='utf-8') as f:
    f.write(a.yaml)
复制代码
  1. 导入 YAML 文件:
  with open('demo.yml', 'r') as f:
    a = tablib.Dataset().load(f.read(), format='yaml')
    print(a.html)
复制代码

效果:

651 x 193

  1. 导出为 HTML :
  with open('demo.html', 'w', encoding='utf-8') as f:
    f.write(data.html)
复制代码

效果:

728 x 188 879 x 227

  1. 导出为 json:
  with open('demo.json', 'w', encoding='utf-8') as f:
    f.write(data.json)
复制代码

效果:

  [
    {
        "url": "baidu",
        "method": "get",
        "expect": "failed"
    },
    {
        "url": "lemon",
        "method": "post",
        "expect": "success"
    }
]
复制代码

其他常用方法

  • lpop(),lpush(row, tags=[]),lpush_col(col, header=None) 是对列的相关操作
  • pop(),rpop(),rpush(row, tags=[]),rpush_col(col, header=None) 是对行的相关操作
  • remove_duplicates() 去除重复的记录
  • sort(col, reverse=False) 根据列进行排序
  • subset(rows=None, cols=None) 返回子 Dataset
  • wipe() 清空 Dataset,包括表头和内容

总结

tablib 这个库非常灵活,用法非常好记,完全符合我们对 Excel 的理解。非常适用于 python 自动化测试的用例数据管理。只有一个缺点:中文资料太少。后面我会翻译一些优秀的英文文档,让更多人把这个优秀的库用起来。

最后:【可能给你带来帮助的教程】(私聊q1领取)


这一些资料,对做【软件测试】的朋友而言应该是较为完整了,这类学习资料也陪伴我走过了最艰难的路程,希望也可以帮助到你!万事要尽早,尤其是技术行业,一定要提升技术功底。