scrapy分页抓取网页( 如何查看二级页面(详情页)的三连数据?(一))
优采云 发布时间: 2021-12-02 05:12scrapy分页抓取网页(
如何查看二级页面(详情页)的三连数据?(一))
这样做的话,其实可以抓取所有已知的列表数据,但是本文的重点是:如何抓取二级页面(详情页)的三元组数据?
做了这么多爬虫,你可能已经发现,Web Scraper本质上是模拟人的操作来达到爬取数据的目的。
那么我们平时如何查看二级页面(详情页)呢?其实直接点击标题链接即可跳转:
Web Scraper为我们提供了点击链接跳转的功能,即Type为Link的选择器。
感觉有点抽象?让我们通过示例进行比较以理解。
首先,在这种情况下,我们得到了标题的文本,此时的选择器类型为Text:
当我们想要抓取一个链接时,我们需要创建另一个选择器。选中的元素是一样的,但是Type是Link:
创建成功后,我们点击Link type选择器,输入,然后创建相关选择器。下面我录了一张动图,注意我鼠标突出显示的导航路线部分,可以很清楚的看到这几个选择器的层次关系:
4.创建详情页子选择器
当您点击该链接时,您会发现浏览器会在一个新的Tab页中打开详情页,但是在列表页上打开了Web Scraper的选择窗口,您无法跨页面选择所需的数据。
处理这个问题也很简单,可以复制详情页的链接,复制到列表页所在的Tab页,按回车重新加载,这样就可以在当前页面选中了。
我们在 Link 类型的选择器中创建了更多的选择器。这里我选择了4个数据,比如喜欢的数量、*敏*感*词*的数量、采集的数量和分享的数量。这个操作也很简单,这里就不赘述了。
所有选择器的*敏*感*词*如下:
我们可以看到video_detail_link节点收录了4个二级页面(detail pages)的数据。至此,我们的子选择器已经全部建立。
5.获取数据
终于到了激动人心的部分,我们要开始爬取数据了。但是我们需要在爬行之前将等待时间调整得更长一些。默认时间为 2000 毫秒。我在这里将其更改为 5000 毫秒。
你为什么这么做?看下图就明白了:
首先,每次打开二级页面,都是一个全新的页面。这时候浏览器加载网页需要时间;
其次,我们可以观察诸如要捕获的喜欢数量之类的数据。页面刚加载时,其值为“--”,过一会就变成一个数字。
所以我们直接等了5000ms,等页面和数据加载完成后,我们统一取了。
配置好参数后,我们就可以正式抓取下载了。下图是我抓到的部分数据,特此证明此方法有用:
6.总结
本教程可能有点困难。我将分享我的站点地图。如果在生产过程中遇到问题,可以参考我的配置。我已经详细解释了 SiteMap 导入的功能。你可以一起服用:
{"_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}]}
一旦掌握了二级页面的抓取方式,三级、四级页面就没有问题了。因为套路都是一样的:先创建Link选择器,然后抓取Link选择器指向的下一页数据,我就不一一演示了。
今天我们也来聊聊Web Scraper的翻页技巧。
本次更新的灵感来自一位读者,他想使用 Web 爬虫爬取被寻呼机分页的页面,但发现我之前介绍的方法不起作用。我研究了一下,发现我错过了一个非常常见的翻页场景。
在文章中,我们讲了如何使用Element Click选择器来模拟鼠标点击分页器翻页,不过把同样的方法放在最上面,翻到第二页时抓取窗口会自动退出. , 无法捕获一条数据。
其实最主要的原因是我没有明确说明这个方法的适用边界。
Element Click 翻页仅适用于不刷新网页的情况。在文章文章中,我引用了蔡徐坤微博评论的一个例子。翻页时网页没有刷新:
仔细看下图,链接变了,但是刷新按钮没变,说明网页没有刷新,但是内容变了
在豆瓣TOP 250网页上,每次翻页都会重新加载网页:
仔细看下图,网页在链接变化时刷新,并且有明显的加载圆圈*敏*感*词*
其实这个原理从技术规范中已经很好的解释了:
-当URL链接为#字符且数据发生变化时,网页不会刷新;
-当链接的其他部分发生变化时,页面会刷新。
当然,这只是随便提一下,有兴趣的同学可以去这个链接学习,不感兴趣的可以跳过。
1.创建站点地图
本文文章将讲解如何使用Web Scraper抓取翻页时会刷新页面的pager网站。
对于这个网页,我们选择网站-豆瓣电影TOP250,他练习了爬虫:
像这种网站,我们需要使用Link选择器来帮助我们翻页。我们引入了Link标签,我们可以使用这个标签跳转到一个网页并从另一个网页抓取数据。这里我们使用Link标签跳转到下一页分页网站。
首先我们使用Link选择器选择下一页按钮,具体配置如下图所示:
这里有一个特殊的地方:Parent Selectors——父选择器。
我们以前从未接触过这个选择框的内容。这次 Next_page 将有两个父节点——_root 和 next_page。您可以通过按键盘上的 shift 然后单击鼠标来选择多个。先按我说的做,以后再做。解释这样做的原因。
保存next_page选择器后,在同层级下创建一个容器节点来抓取电影数据:
这里注意:页面选择器节点next_page和数据选择器节点容器在同一层级,两个节点都有两个父节点:_root和next_page:
因为重点是webscraper翻页技巧,我就简单的抓取一下我抓取到的数据的标题和排名:
然后我们点击Selector图查看我们写的爬虫结构:
可以清晰的看到这个爬虫的结构,可以无限嵌套:
点击Scrape,尝试爬取,你会发现所有的数据都爬下来了:
2.分析原理
按照上面的过程,你可能还是会一头雾水。数据被捕获,但为什么可以这样做呢?为什么 next_page 和 container 处于同一级别?为什么他们同时选择两个父节点:_root 和 next_page?
麻烦的原因是我们在倒推,从结果中推断步骤;下面我们就从正面思考来一步步讲解。
首先我们要知道我们爬取的数据是一个树状结构。_root 代表根节点,也就是我们抓取的第一个网页。我们应该在这个网页上选择什么?
1.一个是下一页的节点,本例中是Link选择器选择的next_page
2. 一个是数据节点,在这个例子中是元素选择器选择的容器
因为next_page节点会跳转,所以会跳转到第二页。除数据不同外,第二页与第一页结构相同。为了继续跳转,我们必须选择下一页。为了抓取数据,我们必须选择数据节点:
如果我们逆向箭头,就会发现真相就在眼前。next_page 的父节点不就是_root 和next_page 吗?容器的父节点也是_root和next_page!
道理到这里基本就讲清楚了,不明白的同学可以多看几遍。和 next_page 一样,我调用我自己的表单。编程中有一个术语-递归,在计算机领域也是一个比较抽象的概念。有兴趣的同学可以自行搜索。