本文首发于:行者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对象,将<li>标签后的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文本
  • 链接可通过<herf>标签来获取
  • ID在链接中,可通过re.findall正则表达式提取出来

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

3. 小结

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


行者AI
48 声望8 粉丝

行者AI(成都潜在人工智能科技有限公司)专注于人工智能在游戏领域的研究和应用,凭借自研算法,推出游戏AI、智能内容审核、数据平台等产品服务。


引用和评论

0 条评论