数据抓取技巧之特殊网页抓取案例演示
评论
收藏

数据抓取技巧之特殊网页抓取案例演示

经验分享
啊锥
2024-03-13 20:55·浏览量:4408
啊锥
发布于 2023-11-03 16:12更新于 2024-03-13 20:554408浏览

1.问题描述

近期在写应用获取数据或者定位元素的时候遇到过较多卡点:有获取方式比较复杂的、有无法通过某一元素关联到同一行的其它列元素的、有要逐页获取数据但是在翻页时数据加载失败的......

在碰到种种卡点后,也找到了一些对应的解决方法,在这里给大家分享一下。同时也是抛个砖引个玉,看看其他小伙伴们有没有新解决思路。

2.方法总览

  1. 循环相似元素组
  • 优势:简单操作;可以边取数边操作。
  • 注意事项:不适用于一行数据分两个区块的场景;不适用于某些无法关联的win元素操作;需要翻页时可能会有加载失败的风险。
  • 学习视频:从父元素中找子元素_哔哩哔哩_bilibili


  1. 批量数据抓取


  1. 变量传参定位元素


  1. Http请求抓取数据

3.案例演示

3.1 循环相似元素组

因为在课程中有详细的介绍,所以这里我们不再做演示。

简单介绍说明一个注意事项:在某些场景下,比如拼多多商家平台的活动详情界面、一些退货退款的处理界面、钉钉的审批申请界面,在从头往下处理数据的时候,每处理完一条会消失一条,导致后面的数据往前顶替,这时候使用循环相似元素组去处理的话,会报错显示找不到目标元素。

当遇到这种情况的时候,我们可以选择从后往前去处理数据的方式,也可以选择先把唯一标识性的单号获取下来,再通过逐条搜索处理的方式。


  • 例如拼多多商家平台的活动详情界面。


  • 先捕获当前页面的相似元素组,形成列表,再反转列表,用ForEach列表循环去实现。


3.2 批量数据抓取

使用批量数据抓取指令去抓取数据是很便捷的,但是也有一些限制需要注意,在这里我们不做详细介绍。

这里主要介绍另一个作用,在有类似合并单元格的数据情况下,我们可以通过批量数抓取指令,去实现快速填充数据的目的。


  • 例如速卖通的商家平台,体检界面就有这种结构的数据。


  • 通过选中可以看到,在有合并的情况下,首行中有存放标题信息的td标签元素,而被合并的次行中没有存放标题信息的td标签元素。


  • 如果我们使用循环相似元素组结合父子元素定位的方法去获取标题,在运行到被合并的次行数据时,就会因为找不到对应的td标签而报错。


  • 当然我们也可以再进一步寻找某些规律,通过一些判断用流程逻辑的方式去实现,不过整体会比较麻烦。这时候如果使用批量数据抓取指令的话,就可以一步搞定。


3.3 变量传参定位元素

在某些无法捕获到相似元素组、无法使用父子元素关联、懒加载需要边获取数据边滚动页面的场景,可以结合元素本身的定位规律,通过全局变量传参的方式去控制元素的位置。


  • 例如:跨境亚马逊平台上的广告活动管理界面,就是用两个区块分别展示数据的。


  • 如果想要通过循环相似元素组结合父子元素的方式去同时抓取左右两边数据的话,前提是我们能够获取到完整的一整行元素,在这里明显无法捕获到完整的一行数据,所以这个方法不可行。


  • 这时候我们就可以使用变量传参的方式去定位元素

1)首先捕获左边区域的其中一个单元格元素,在编辑界面可以看到某个标签下的属性是可以代表数据所在行数的。比如aria-rowindex属性,当值为2时,定位的就是第二行,当值为3时,定位的就是第三行。


2)同样的,我们在下一个标签下,也能找到可以代表数据所在列数的属性。比如aria-colindex属性,当值为4时,定位的就是第四列,当值为3时,定位的就是第三列。结合上面的aria-rowindex,就可以通过行和列去定位到某一个具体的单元格。


3)接着捕获右边区域的一个单元格元素,可以发现其实也是有类似的结构,可以通过aria-rowindex属性和aria-colindex属性去控制行和列。


4)因此,我们可以通过同时修改几个元素内的aria-rowindex属性值、固定aria-colindex属性值,来达到获取同一行各列数据的目的。修改的方式是创建一个全局变量,然后传入到对应的属性值中。


5)结合For次数循环,我们就可以做到遍历每一行,提取同一行上的每一列数据。


6)关于For次数循环的结束数,可以通过获取界面内的“总计”元素来做为标准。同时也可以在程序内加上随着行数增加而滚动界面的操作,以及可以在提取到数据后,对预算元素进行点击、输入等操作。


  • 上述方法的核心点,在于寻找元素的规律。通常网页上的这类数据,是以tr标签的index属性来控制行,以td标签的index属性来控制列,如下:


  • 还有一些常见的场景,例如聚水潭的订单管理页面,是以div标签的rowindex属性来控制行,以div标签的cellindex属性来控制列,如下:


  • 甚至一些win元素,无法通过循环相似元素组去关联某列数据,这时候也可以通过变量传参的方式去定位元素。例如钉钉的审批界面,可以用Row标签的index属性来控制行,用Cell标签的index属性来控制列,如下:


3.4 Http请求抓取数据

在某平台上批量抓取数据,可以使用循环相似元素组提取、也可以用批量数据抓取,但是需要翻页。在数据总共有300多页的情况下,可能翻页到一半就会出现数据加载失败的问题,导致要重头翻页直到续上原先的数据再继续抓取,步骤比较麻烦,甚至可能有翻不回来的现象。

这时候为了能够稳定获取到数据,就可以使用Http请求来一口气抓取数据。


1)先打开网页的检查界面,再切换到Network标签栏。


2)刷新页面,可以看到加载了很多请求信息。


3)在检查界面按ctrl+f,搜索表内的某一数据,快速定位请求。可以根据Response栏内的数据验证定位是否正确。


4)Header栏内有请求链接、请求方式、请求头数据,Payload栏内有请求体数据,可以先获取请求链接,再进行一次定位。


5)右键请求,拷贝Http请求报文。


6)在影刀中使用Http请求指令,点击只能识别填入,粘贴刚刚拷贝的报文,可以自动填写对应的请求头和请求体内容。


7)运行后就可以拿到请求结果数据。


8)再加工做一下数据提取。关于这一步可以根据学习视频来了解如何实现:https://www.bilibili.com/video/BV1hg41127Xg?p=4&vd_source=d416d54b7f3d66f169f8557ab8569d1b


9)一般来说,在请求体中会有2个字段对应的是页数和数据行数,比如现在的page字段和rows字段,所以可以通过调整这2个字段的值来一次性请求全部数据,或者循环分页的提取数据。


以上就是近期收获的4种技巧,我自己用得比较多的还是变量传参那一套,操作起来会比较灵活。

接下来就欢迎其他同伴分享一些你自己的操作思路啦~

收藏22
全部评论1
最新
发布评论
评论