本文首发于:行者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 BeautifulSoupimport requestsimport reurl = '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 BeautifulSoupimport requestsimport reurl = '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 BeautifulSoupimport requestsimport reurl = '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还有很多性能,比方批改删除性能,这些性能能够再日后的学习中缓缓理解。