简易数据分析(七):Web Scraper 抓取表格、分页器翻页数据

ⅰ亾dé卋堺 提交于 2021-01-09 05:02:36




今天我们讲讲如何抓取网页表格里的数据。首先我们分析一下,网页里的经典表格是怎么构成的。




  • First Name 所在的行比较特殊,是一个表格的表头,表示信息分类

  • 2-5 行是表格的主体,展示分类内容


经典表格就这些知识点,没了。下面我们写个简单的表格 Web Scraper 爬虫。



1.制作 Sitemap


我们今天的练手网站是

http://www.huochepiao.com/search/chaxun/result.asp?txtChuFa=%C9%CF%BA%A3&txtDaoDa=%B1%B1%BE%A9


爬虫的内容是抓取上海到北京的所有列车时刻表。


我们先创建一个包含整个表格的 container,Type 类型选为 Table,表示我们要抓取表格。




具体的参数如上图所示,因为比较简单,就不多说了。


在这个面板下向下翻,会发现多了一个不一样的面板。观察一下你就会发现,这些数据其实就是表格数据类型的分类,在这个案例里,他把车次、出发站、开车时间等分类都列了出来。




Table columns 这个分类里,每一行的内容旁边的选择按钮默认都是打勾的,也就是说默认都会抓取这些列的内容。如果你不想抓取某类内容,去掉对应的勾选就可以了。


在你点击 Save selector 的按钮时,会发现 Result key 的一些选项报错,说什么 invalid format 格式无效:




解决这个报错很简单,一般来说是 Result key 名字的长度不够,你给加个空格加个标点符号就行。如果还报错,就试试换成英文名字:




解决报错保存成功后,我们就可以按照 Web Scraper 的爬取套路抓取数据了。



2.为什么我不建议你用 Web Scraper 的 Table Selector?


如果你按照刚刚的教程做下里,就会感觉很顺利,但是查看数据时就会傻眼了。


刚开始抓取时,我们先用 Data preview 预览一下数据,会发现数据很完美:




抓取数据后,在浏览器的预览面板预览,会发现车次这一列数据为 null,意味着没有抓取到相关内容:




我们下载抓取的 CSV 文件后,在预览器里打开,会发现车次的数据出现了,但出发站的数据又为 null 了!




这不是坑爹呢!


关于这个问题我调查了半天,应该是 Web Scraper 对中文关键字索引的支持不太友好,所以会抛出一些诡异的 bug,因此我并不建议大家用它的 Table 功能。


如果真的想抓取表格数据,我们可以用之前的方案,先创建一个类型为 Element 的 container,然后在 container 里再手动创建子选择器,这样就可以规避这个问题。



上面只是一个原因,还有一个原因是,在现代网站,很少有人用 HTML 原始表格了


HTML 提供了表格的基础标签,比如说 <table><thead>、  <tbody> 等标签,这些标签上提供了默认的样式。好处是在互联网刚刚发展起来时,可以提供开箱即用的表格;缺点是样式太单一,不太好定制,后来很多网站用其它标签模拟表格,就像 PPT里用各种大小方块组合出一个表格一样,方便定制:




出于这个原因,当你在用 Table Selector 匹配一个表格时,可能会死活匹配不上,因为从 Web Scraper 的角度考虑,你看到的那个表格就是个高仿,根本不是原装正品,自然是不认的。




3.总结


我们并不建议直接使用 Web Scraper 的 Table Selector,因为对中文支持不太友好,也不太好匹配现代网页。如果有抓取表格的需求,可以用之前的创建父子选择器的方法来做。






前面几篇文章我们介绍了 Web Scraper 应对各种翻页的解决方法,比如说修改网页链接加载数据点击“更多按钮“加载数据下拉自动加载数据。今天我们说说一种更常见的翻页类型——分页器


本来想解释一下啥叫分页器,翻了一堆定义觉得很繁琐,大家也不是第一年上网了,看张图就知道了。我找了个功能最全的例子,支持数字页码调整,上一页下一页和指定页数跳转。



今天我们就学学,Web Scraper 怎么对付这种类型的网页翻页。


其实我们在本教程的第一个例子,抓取豆瓣电影 TOP 排行榜中,豆瓣的这个电影榜单就是用分页器分割数据的:



但当时我们是找网页链接规律抓取的,没有利用分页器去抓取。因为当一个网页的链接变化规律时,控制链接参数抓取是实现成本最低的;如果这个网页可以翻页,但是链接的变化不是规律的,就得去会一会这个分页器了。


说这些理论有些枯燥,我们举个翻页链接不规律的例子。


8 月 2 日是蔡徐坤的生日,为了表达庆祝,在微博上粉丝们给坤坤刷了 300W 的转发量,微博的转发数据正好是用分页器分割的,我们就分析一下微博的转发信息页面,看看这类数据怎么用 Web Scraper 抓取。



这条微博的直达链接是:

https://weibo.com/1776448504/I0gyT8aeQ?type=repost


看了他那么多的视频,为了表达感激,我们可以点进去为坤坤加一份阅读量。


首先我们看看第 1 页转发的链接,长这个样子:


https://weibo.com/1776448504/I0gyT8aeQ?type=repost


第 2 页长这个样子,注意到多了个  #_rnd1568563840036  参数:


https://weibo.com/1776448504/I0gyT8aeQ?type=repost#_rnd1568563840036


第 3 页参数为  #_rnd1568563861839  


https://weibo.com/1776448504/I0gyT8aeQ?type=repost#_rnd1568563861839


第 4 页参数为 #_rnd1568563882276


https://weibo.com/1776448504/I0gyT8aeQ?type=repost#_rnd1568563882276


多看几个链接你就可以发现,这个转发网页的网址毫无规律可言,所以只能通过分页器去翻页加载数据。下面就开始我们的实战教学环节。



1.创建 SiteMap


我们首先创建一个 SiteMap,这次取名为 cxk,起始链接为


https://weibo.com/1776448504/I0gyT8aeQ?type=repost




2.创建容器的 selector


因为我们要点击分页器,外面的容器的类型我们选为 Element Click,具体的参数解释可以看下图,我们之前在简易数据分析 08详细解释过一次,这里就不多言了。



container 的预览是下图的样子:



分页器选择的过程可以参看下图:





3.创建子选择器


这几个子选择器都比较简单,类型都是文字选择器,我们选择了评论用户名,评论内容和评论时间三种类型的内容。



4.抓取数据


按照 Sitemap cxk -> Scrape 的操作路径就可以抓取数据了。



5.一些问题


如果你看了我上面的教程立马去爬数据,可能遇到的第一个问题就是,300w 的数据,难道我全部爬下来吗?


听上去也不太现实,毕竟 Web Scraper 针对的数据量都是相对比较小的,几万数据都算多的了,数据再大你就得考虑爬取时间是否太长,数据如何存储,如何应对网址的反爬虫系统(比如说冷不丁的跳出一个验证码,这个 Web Scraper 是无能为力的)。


考虑到这个问题,前面的自动控制抓取数量的教程你又看过的话,可能想着用 :nth-of-type(-n+N) 控制抓取 N 条数据。如果你尝试了,就会发现这个方法根本没用。


失效的原因其实涉及到一点点网页的知识了,感兴趣的话可以看看下面的解释,不感兴趣可以直接看最后的结论。



像我前面介绍的点击更多加载型网页下拉加载型网页,他们新加载的数据,是在当前页面追加的,你一直下拉,数据一直加载,同时网页的滚动条会越来越短,这意味着所有的数据都在同一个页面


当我们用 :nth-of-type(-n+N) 控制加载数量时,其实相当于在这个网页设立一个计数器,当数据一直累加到我们想要的数量时,就会停止抓取。


但是对于使用翻页器的网页,每次的翻页相当于刷新当前网页,这样每次都会设立一个计数器。


比如说你想抓取 1000 条数据,但是第 1 页网页只有 20 条数据,抓到最后一条了,还差 980 条;然后一翻页,又设立一个新的计数器,抓完第 2 页的最后一条数据,还差 980,一翻页计数器就重置,又变成 1000 了......所以这个控制数量的方法就失效了。


所以结论就是,如果翻页器类型的网页想提前结束抓取,只有断网的这种方法。当然,如果你有更好的方案,可以在评论里回复我,我们可以互相讨论一下。



6.总结


分页器是一种很常见的网页分页方法,我们可以通过 Web Scraper 中的 Element click 处理这种类型的网页,并通过断网的方法结束抓取。




   
   

● 简易数据分析(六):Web Scraper 翻页——抓取「滚动加载」类型网页

● 简易数据分析(二):Web Scraper 初尝鲜,抓取豆瓣高分电影

● 简易数据分析 (一):源起、了解 Web Scraper 与浏览器技巧



·END·

图雀社区

汇聚精彩的免费实战教程



关注公众号回复 z 拉学习交流群


喜欢本文,点个“在看”告诉我

本文分享自微信公众号 - 图雀社区(tuture-dev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!