接口测试 爬虫 + 接口处理垃圾数据

绵绵不绝 · 2018年06月28日 · 最后由 绵绵不绝 回复于 2018年07月17日 · 2495 次阅读

在我们公司测试中,无论测试环境测试还是线上回归,都不可避免的会出现大量的垃圾数据。
测试环境还好,可以清空数据库(清起来超爽😏 ,就是可能会被测试同事打)。但是生产环境无法接触到数据库。这些测试数据一条一条删起来很费力(selenium 删或者手动删)。
看到社友的帖子,受了启发,决定用爬虫 + 接口去处理掉这些垃圾数据。
帖子参考:
https://testerhome.com/topics/14695

一、思路逆推

我们公司涉及的业务是住宅小区方面的,小区下面会有很多的住户,住户可以批量创建,创建完后需要删除。

1.要通过接口删除这些数据,先要找到这个接口,然后这个接口需要哪些参数
通过 fiddler 抓包知道,删除接口是根据用户 id 来的。/deleteUser?id=

2.调删除的接口,要传用户 ID,需要找到用户 ID
有的用户 ID 是直接在界面展示的,有的用户 ID 可以通过查看 html 源码获取。一般用户 ID 都是一堆字母 + 数字,展示给用户看也没什么意义,大多都会隐藏起来。我这边是通过查看 html 源码获取的

通过比对发现,detail 里面的 672560 就是 ID

3.通过爬虫获取所有的用户 ID

获取到总的页数,获取到每页的 ID,再翻页获取,然后获取到所有的 ID

二、代码

以下代码作为参考,了解大致思路。

# coding:utf-8
import requests,time
import re
import warnings
warnings.filterwarnings("ignore")

cookie = ''
host = ''

def getTotalPage():
    '''先到数据展示的页面查到数据的页数
    上图显示的数据有239页'''
    totalPage = ''  # 数据所显示的页数
    urlFind = host + '/findHouseUserList.do'
    result = requests.get(urlFind, headers={'Cookie': cookie}, verify=False)
    for line in result.content.decode('utf-8').split('\n'):
        kw = re.findall(re.compile('条(.*?)页'),line)
        if kw:
            #得到的kw是一个list
            for s in kw[0]:
                if s.isdigit():
                    totalPage = totalPage + s
    if not totalPage.isdigit():
        print('没有获取到总页数')
        return 0
    return totalPage

def getAllUserId():
    '''获取每页的用户ID'''
    userIds = []  # 用于保存获取到的住户id
    totalPage = getTotalPage()
    for i in range(int(totalPage)):
        #页码规律是每翻一页page增大10,第一页page是0,第二个page是10,第三页page是20,第四页page是30,以此类推
        page = (int(i) - 1) * 10
        urlFindByPage = host + '/findHouseUserList.do?page=' + str(page)
        result = requests.get(urlFindByPage, headers={'Cookie': cookie},verify=False)
        '''根据上面的html源码查看到id,决定取detail和value之间的字段'''
        for line in result.content.decode('utf-8').split('\n'):
            if "detail('" in line:
                startIndex = line.find("detail('")
                endIndex = line.find("')\" value")
                userIds.append(line[startIndex+8:endIndex])
        # 防止爬取太快,增加服务器压力
        time.sleep(0.1)
    return userIds

def deleteUserById():
    userIds = getAllUserId()
    i = 0   #用于统计删除的用户的数量
    for id in userIds:
        urlDeleteById = host + '/deleteUser.do?id=' + id
        result = requests.get(urlDeleteById, headers={'Cookie': cookie}, verify=False)
        i = i + 1
        print(result.status_code)
        print('删除第'+str(i)+'个')
        # 防止频繁请求,增加服务器压力
        time.sleep(0.1)
共收到 4 条回复 时间 点赞

作者既然是用 request 库来解析 html,为什么不用这个库呢?https://github.com/kennethreitz/requests-html 这个才是主流吧?

为什么要清理线上数据?感觉没有必要

韩将 回复

爬虫小白,完全不知道这个库

fdeferf 回复

看情况来的,有的数据不需要清理,有的要清理

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册