网页数据抓取怎么写( 这是简易数据分析系列的第13篇文章教程的全盘总结)

优采云 发布时间: 2022-01-11 23:16

  网页数据抓取怎么写(

这是简易数据分析系列的第13篇文章教程的全盘总结)

  

  这是简易数据分析系列文章的第 13 篇。

  本文首发于博客园:简单数据分析13。

  不知不觉写了10篇网络爬虫系列教程,这10篇文章基本涵盖了网络爬虫的大部分功能。今天的内容是本系列的最后一篇文章。下一章我再开个坑,讲讲如何用Excel对采集到的数据进行格式化和分析。

  我会在下一篇文章文章中对Web Scraper教程做一个全面的总结,今天开始我们的实战教程。

  在之前的课程中,我们抓取的数据都是同级别的内容,主要讨论的问题是如何处理市场上各种类型的分页,但是如何抓取详情页的内容数据并没有介绍. .

  比如我们要抓取b站*敏*感*词*区TOP排行榜的数据:

  按照之前的爬取逻辑,我们爬取了这个榜单上的作品相关的数据,比如下图中的排名、作品名称、播放量、弹幕数、作者姓名等。

  

  经常逛B站的朋友也知道,UP主经常暗示看视频会连续三个操作(点赞+币+采集)。可以看出这三个数据对视频的排名有一定的影响,所以这些数据对我们也有一定的参考价值。

  

  但遗憾的是,这份榜单中并没有相关数据。这些数据在视频详情页,我们需要点击链接查看:

  

  今天的教程内容是教大家如何在爬取一级页面(列表页)的同时,使用Web Scraper抓取二级页面(详情页)的内容。

  1.创建站点地图

  首先,我们找到要捕获的数据的位置。我已经在下图中的红框中标出了关键路径。你可以比较一下:

  

  然后创建一个相关的SiteMap,这里我取了bilibili_rank的名字:

  

  2.为容器创建一个选择器

  设置前我们观察一下,发现这个网页的排名数据是一次性加载100条数据,不需要分页,所以这里的Type类型选择为Element。

  其他参数都比较简单,就不赘述了(了解不多的可以看我之前的基础教程)。这是一个截图供您参考:

  

  3.创建列表页面子选择器

  这次子选择器要抓取的内容如下,都比较简单。可以参考图片截图:

  排名 (num) 作品名称 (title) 播放量 (play_amount) 弹幕量 (danmu_count) 作者: (author)

  

  

  如果做了这一步,其实可以捕获所有已知的列表数据,但是本文的重点是:如何捕获二级页面(详情页)的三元组数据?

  做了这么多爬虫,你可能已经发现,Web Scraper 的本质就是模拟人的操作来达到爬取数据的目的。

  那么我们平时如何查看二级页面(详情页)呢?其实点击标题链接即可跳转:

  

  Web Scraper为我们提供了点击链接跳转的功能,即Type为Link的选择器。

  感觉有点抽象?让我们通过一个例子来理解它。

  首先,在本例中,我们获取了标题的文本,选择器类型为 Text:

  

  当我们要抓取链接的时候,需要再创建一个选择器,被选中的元素都是一样的,只不过Type是Link:

  

  创建成功后,我们点击链接类型选择器,进入它的内部,然后创建相关的选择器。下面我录制了一个*敏*感*词*,注意我鼠标高亮的导航路由部分,可以清楚的看到这几个选择器的层级关系:

  

  4.创建详情页子选择器

  当你点击链接时,你会发现浏览器会在一个新的Tab页中打开详情页,但是在列表页上打开了Web Scraper的选择窗口,无法跨页选择想要的数据。

  处理这个问题也很简单,可以复制详情页的链接,复制到列表页所在的Tab页,然后回车重新加载,这样就可以在当前页选中了。

  

  我们在 Link 类型的选择器中创建了更多的选择器。这里我选择了点赞数、*敏*感*词*数、采集数和分享数4个数据。这个操作也很简单,这里就不赘述了。

  

  所有选择器的*敏*感*词*如下:

  

  我们可以看到video_detail_link节点收录了4个二级页面(detail pages)的数据。至此,我们的子选择器已经建立。

  5.捕获数据

  激动人心的部分终于来了,我们将开始抓取数据。但在抓取之前,我们必须将等待时间调整为更大。默认时间是2000毫秒,我这里改成5000毫秒。

  

  为什么要这样做?看下图你就明白了:

  

  首先,每次打开二级页面都是一个全新的页面,此时浏览器加载页面需要时间;

  其次,我们可以观察要捕获的点赞数等数据。页面刚加载的时候,它的值为“--”,过一段时间会变成一个数字。

  因此,我们直接等待5000ms,等页面和数据加载完毕后再统一取。

  配置好参数后,我们就可以正式抓取下载了。下图是我抓取的数据的一部分,这里是为了证明这种方法有效:

  

  6.总结

  这个教程可能有点难。我将分享我的站点地图。如果在生产过程中遇到困难,可以参考我的配置。SiteMap的导入功能我在第6篇教程中详细讲解过。可以一起吃。:

  {"_id":"bilibili_rank","startUrl":["https://www.bilibili.com/ranking/all/1/0/3"],"selectors":[{"id":"container","type":"SelectorElement","parentSelectors":["_root"],"selector":"li.rank-item","multiple":true,"delay":0},{"id":"title","type":"SelectorText","parentSelectors":["container"],"selector":"a.title","multiple":false,"regex":"","delay":0},{"id":"author","type":"SelectorText","parentSelectors":["container"],"selector":"a span","multiple":false,"regex":"","delay":0},{"id":"play_amount","type":"SelectorText","parentSelectors":["container"],"selector":".detail > span:nth-of-type(1)","multiple":false,"regex":"","delay":0},{"id":"danmu_amount","type":"SelectorText","parentSelectors":["container"],"selector":"span:nth-of-type(2)","multiple":false,"regex":"","delay":0},{"id":"video_detail_link","type":"SelectorLink","parentSelectors":["container"],"selector":"a.title","multiple":false,"delay":0},{"id":"coin","type":"SelectorText","parentSelectors":["video_detail_link"],"selector":"span.coin","multiple":false,"regex":"","delay":0},{"id":"collect","type":"SelectorText","parentSelectors":["video_detail_link"],"selector":"span.collect","multiple":false,"regex":"","delay":0},{"id":"share","type":"SelectorText","parentSelectors":["video_detail_link"],"selector":"span.share","multiple":false,"regex":"[0-9]+","delay":0},{"id":"num","type":"SelectorText","parentSelectors":["container"],"selector":"div.num","multiple":false,"regex":"","delay":0},{"id":"like","type":"SelectorText","parentSelectors":["video_detail_link"],"selector":".ops span.like","multiple":false,"regex":"","delay":0}]}

  掌握了二级页面的爬取方式后,三级页面和四级页面都没有问题。因为例程是相同的:它们都是在链接选择器指向的下一页上抓取数据。因为原理是一样的,我就不演示了。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线