本文首发于:行者AI
Q:BeautifulSoup不是爬虫用的吗,为什么要使用它来做测试?
A:在日常工作中会遇到很多数据对比的测试任务,在后端接口有做数据加密,或接口有做鉴权等情况下,我们再从后端去取参数,耗费的时间成本有点大。
所以我想...能不能走前端页面上去获取数据呢,网上查了下,果然有从前端页面上爬取数据的工具包,简单学习了下,也算是自己做个笔记记录下。今天我们主要用到的是requests + BeautifulSoup 以及其他一些工具包来实现该功能。
1. 什么是BeautifulSoup?
首先做个介绍,BeautifulSoup是python的一个库,最主要的功能是从网页抓取数据。
其官方解释如下:
- BeautifulSoup提供一些简单的、python式的函数用来实现导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
- BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,BeautifulSoup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
在了解了该工具包的作用后,我们写几行代码来简单学习下,我们就以此网站来做练习吧。
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还有很多功能,比如修改删除功能,这些功能可以再日后的学习中慢慢了解。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。