从入门到精通高级篇:Jmeter之网页爬虫-下篇

发表于:2021-8-04 09:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:北京-宏哥    来源:博客园

#
Jmeter
分享:
  1.简介
  上一篇介绍了爬取文章,这一篇宏哥就简单的介绍一下,如何爬取图片然后保存到本地电脑中。网上很多漂亮的壁纸或者是美女、妹子,想自己收藏一些,挨个保存太费时间,那你可以利用爬虫然后批量下载。
  2.爬虫原理
  其实这个和上一篇都是一样的道理,宏哥在啰嗦一遍。Jmeter 的爬虫原理其实很简单,就是对网页提交一个请求,然后把返回的所有 href 提取出来,利用 ForEach 控制器去实现 url 遍历。这样解释是不是很清晰?下面宏哥就来简单介绍一下如何操作。
  3.牛刀小试
  宏哥这里以一个图片网站为例给小伙伴或者童鞋们演示用过程和步骤。
  该网站为动态。网址:https://unsplash.com/
  3.1开始实战
  1、因为是动态网站,所以获取网页内容后,很多图片找不到,使用浏览器F12功能,分析网站的请求,得出:
  网页动态加载请求:https://unsplash.com/napi/photos?page=1&per_page=12&order_by=latest,其中1,代表加载几页,12代表每次加载12张图片;
  图片下载请求:https://unsplash.com/photos/xxx/download?force=true,其中xxx代表每个图片的id。
  2、我们开始使用jmeter爬取网站上的图片。打开Jemter,新建线程组,如下图所示:
  3、在线程组里添加一个http请求(sampler->http请求),协议为https,服务器名称输入网址,路径输入路径,在路径中将1参数化,修改1为${id},如下图所示:
  4、添加参数化文件,配置元件->CSV数据文件设置,设置文件路径,编码、变量、间隔符等,如下图所示:
  5、我们现在需要把图片id提取出来,利用强大的正则表达式提取。先分析下网页请求返回的数据,因此宏哥添加一个察看结果树,运行Jmeter,如下图所示:
  6、从上边返回的是json格式,第一个id就是图片id。我们可以利用id提取数据,"id":"(.*?)",括号里就是需要提取的数据。如下图所示:
  7、从上图我们可以清楚地看出正则匹配的总数是26,远远超过了图片总数12张,因此提取的还有其他的id。我们继续分析,看到在user里也有一个id,这个id并不是图片的id,用这个id去下载图片,会报404错误,我们用刚才的正则会把这个id提取出来。继续分析数据,发现download链接,没个图片除了id不一样,其他都一样,user里没有这个链接,我们用这个链接提取数据 "download":"https://unsplash.com/photos/(.*?)/download。如下图所示:
  8、从上图我们看到提取匹配总数是12,正确,因此我们需要添加一个正则提取器,将以上的正则表达式填写到正则提取器中,记得匹配数字填-1,把所有匹配的都提取出来,如下图所示:
  9、我们添加一个sampler->Debug Sampler,查看一下是否真的取出我们想要的数据了,如下图所示:
  10、保存后,运行Jmeter,点击察看结果树,查看取出的数据,说明id已经被我们取出来了,如下图所示:
  11、接下来需要用我们的foreach控制器了 ,对所有的id进行遍历,在控制器里输入变量名称,就是正则表达式里的变量名,如下图所示:
  12、在foreach控制器下面再添加一个http请求,用于下载图片  ,就是我们开头写明的下载图片请求,设置与第一个http请求一致,记得将id参数化,用表达式里变量名即可,如下图所示:
  13、发送图片下载请求后,我们使用beanshell将图片保存到本地,在请求下,添加后置处理器->BeanShell PostProcessor,编写保存图片脚本,如下图所示:
  14、保存图片脚本参考代码如下:
  import java.io.*;
  import java.text.SimpleDateFormat;
  import java.util.Date;
  Date date = new Date();
  date.getDate();
  SimpleDateFormat df = new SimpleDateFormat("yyyymmdd-HHmmss");
  String formate = df.format(date);
  //string name = vars.get("imgid");
  byte[] result = prev.getResponseData();  //这个是获取到请求返回的数据,prev是获取上个请求的返回
  String file_name = "E:\\photos\\" + formate + ".jpg"; //代表存放文件的位置和文件名
  File file = new File(file_name);
  FileOutputStream out = new FileOutputStream(file);
  out.write(result);
  out.close();
  15、下面我们就可以见证奇迹的时刻了,运行完毕后,察看结果树可以看到运行结果,存放路径中,可以看到下载的图片了,如下图所示:
  4.小结
  1、在保存到本地图片要创建你代码里写的路径,或者代码中判断有就不创建,没有就创建。
  2、主要你的正则表达式是否真的提取到了你需要的数据。
  3、细心地小伙伴看到我这里只有12张,但是参数可以循环3次,36张,这是怎么回事了,那是因为宏哥的线程组是1,所以就是12张了。
  4、熟练地掌握正则表达式的用法。这里最重要的一步就是正则表达式提取我们想要的关键数据。

     本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号