乐趣区

关于python爬虫:requestsBeautifulSoup页面爬取数据对比测试

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

退出移动版