requests+BeautifulSoup页面爬取数据对比测试

本文首发于:行者AI

Q:BeautifulSoup不是爬虫用的吗,为什么要使用它来做测试?

A:在日常工作中会遇到很多数据对比的测试任务,在后端接口有做数据加密,或接口有做鉴权等情况下,我们再从后端去取参数,耗费的时间成本有点大。

所以我想...能不能走前端页面上去获取数据呢,网上查了下,果然有从前端页面上爬取数据的工具包,简单学习了下,也算是自己做个笔记记录下。今天我们主要用到的是requests + BeautifulSoup 以及其他一些工具包来实现该功能。

1. 什么是BeautifulSoup?

首先做个介绍,BeautifulSoup是python的一个库,最主要的功能是从网页抓取数据。

其官方解释如下:

  • BeautifulSoup提供一些简单的、python式的函数用来实现导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

  • BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,BeautifulSoup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

在了解了该工具包的作用后,我们写几行代码来简单学习下,我们就以此网站来做练习吧。

http://www.cntour.cn/

2. 如何使用BeautifulSoup?

2.1 使用该工具的话需要安装对应的环境依赖包,CMD执行以下命令:

  • pip install beautifulsoup4
  • pip install lxml


图1. BeautifulSoup环境安装

2.2 在环境安装完成后,我们来写个小例子

用浏览器打开http://www.cntour.cn/


图2. 待爬取页面信息展示

定位我们想获取的数据信息,通过element查找该元素。

在复制元素的selector后,编写如下代码:

from bs4 import BeautifulSoup
import requests
import re

url = 'http://www.cntour.cn/'
strhtml = requests.get(url)
soup = BeautifulSoup(strhtml.text, 'lxml')
data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a')
print(data)

通过BeautifulSoup我们可以获取到html对象,使用lxml解析器后,打印data后可见如下信息:


图3. 获取标签信息

2.3 获取到html对象后,接下来我们获取整组数据,用于便遍历获取该页面上的标题,连接和ID

重新获取html对象,将

  • 标签后的nth-child(1)删除,再重新执行代码。

    from bs4 import BeautifulSoup
    import requests
    import re
    
    url = 'http://www.cntour.cn/'
    strhtml = requests.get(url)
    soup = BeautifulSoup(strhtml.text, 'lxml')
    # data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a')
    # print(data)
    data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')
    print(data)
    

    这样我们就获取到了html页面,列表上所有的数据对象。

    打印后可见如下信息。


    图4. 获取批量标签信息

    2.4 从html对象中提取数据

    从浏览器控制台中可看到,我们想获取的参数都是在标签里面的。


    图5. 获取标签内容

    那么通过遍历html对象,获取到标签中的数据吧。

    编写如下代码:

    from bs4 import BeautifulSoup
    import requests
    import re
    
    url = 'http://www.cntour.cn/'
    strhtml = requests.get(url)
    soup = BeautifulSoup(strhtml.text, 'lxml')
    # data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a')
    # print(data)
    data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')
    print(data)
    title = []
    link = []
    ID = []
    for item in data:
        result = {
            'title': item.get_text(),
            'link': item.get('href'),
            'ID': re.findall('d+', item.get('href'))
        }
        # print(result)
        title.append(result['title'])
        link.append(result['link'])
        ID.append(result['ID'][0])
    
    print(title)
    print(link)
    print(ID)
    
    • 标题可通过get_text() 获取该元素的text文本
    • 链接可通过标签来获取
    • ID在链接中,可通过re.findall正则表达式提取出来

    这样就获取到该页面上我们想要的数据信息,使用工具包pandas或xlrd来阅读Excel中的预期结果数据来对页面上的数据做比对,结果相同则通过,不同则抛出异常。这里主要对BeautifulSoup做介绍,数据阅读的方法就不过多介绍。

    3. 小结

    BeautifulSoup虽然作为一个爬虫工具,但也可以起到辅助测试的作用,简单写了个例子,只是对该工具做个简单介绍和认识,希望能对大家有帮助,有更优的实现方式可以自己再添代码实现。当然如果是做数据对比的话,最优的方法还是通过后端去拿数据,该方法只在不方便通过接口获取数据时(比如后端做了加密,网站有做反扒措施等)使用。另外,BeautifulSoup还有很多功能,比如修改删除功能,这些功能可以再日后的学习中慢慢了解。


    PS:更多技术干货,快关注【公众号 | xingzhe_ai】,与行者一起讨论吧!

  • 原文地址:https://www.cnblogs.com/xingzheai/p/14597552.html