简易数据分析 11 | Web Scraper 抓取表格数据

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

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

  • 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,因为对中文支持不太友好,也不太好匹配现代网页。如果有抓取表格的需求,可以用之前的创建父子选择器的方法来做。

4.推荐阅读

简易数据分析 10 | Web Scraper 翻页——抓取「滚动加载」类型网页

原文地址:https://www.cnblogs.com/web-scraper/p/web_scraper_table.html

时间: 2024-11-07 10:56:22

简易数据分析 11 | Web Scraper 抓取表格数据的相关文章

web scraper 抓取网页数据的几个常见问题

如果你想抓取数据,又懒得写代码了,可以试试 web scraper 抓取数据. 相关文章: 最简单的数据抓取教程,人人都用得上 web scraper 进阶教程,人人都用得上 如果你在使用 web scraper 抓取数据,很有可能碰到如下问题中的一个或者多个,而这些问题可能直接将你计划打乱,甚至让你放弃 web scraper . 下面列出几种你可能会碰到的问题,并说明解决方案. 1.有时候我们想选择某个链接,但是鼠标点击就出触发页面跳转,如何处理? 在我们选择页面元素的时候,勾选 "Enab

简易数据分析 09 | Web Scraper 自动控制抓取数量 &amp; Web Scraper 父子选择器

这是简易数据分析系列的第 9 篇文章. 今天我们说说 Web Scraper 的一些小功能:自动控制 Web Scraper 抓取数量和 Web Scraper 的父子选择器. 如何只抓取前 100 条数据? 如果跟着上篇教程一步一步做下来,你会发现这个爬虫会一直运作,根本停不下来.网页有 1000 条数据,他就会抓取 1000 条,有 10W 条,就会抓取 10W 条.如果我们的需求很小,只想抓取前 200 条怎么办? 如果你手动关闭抓取数据的网页,就会发现数据全部丢失,一条都没有保存下来,所

web scraper 抓取数据并做简单数据分析

其实 web scraper 说到底就是那点儿东西,所有的网站都是大同小异,但是都还不同.这也是好多同学总是遇到问题的原因.因为没有统一的模板可用,需要理解了 web scraper 的原理并且对目标网站加以分析才可以. 今天再介绍一篇关于 web scraper 抓取数据的文章,除了 web scraper 的使用方式外,还包括一些简单的数据处理和分析.都是基础的不能再基础了. 选择这个网站一来是因为作为一个开发者在上面买了不少课,还有个原因就是它的专栏也比较有特点,需要先滚动加载,然后再点击

使用web scraper抓取分页内容

实现效果: 导出为csv格式 主要修改    page=[1-5:1]    //表示范围 1至5 步长为1 如果需要滚动方式 在type处 修改 插件安装地址: 这里 参考链接: https://www.cnblogs.com/fengzheng/p/9328481.html 原文地址:https://www.cnblogs.com/feiyucha/p/11220814.html

爬虫抓取表格中的数据

有时候因为某些需求需要爬取某个网页中某个表格里的数据,这时候如果这个页面只有这一个表格的时候,那么抓取就比较容易了,但是当这个页面中有大量的表格的时候,再使用之前的方法,就会发现虽然也能抓取到要的数据,但是还有一大堆冗余. 这时候,就可以使用下面这种方法 就以这个网页里的表格为例 #coding:utf-8 import re import urllib2 url='http://58921.com/' header={'User-Agent':'Mozilla/5.0 (Windows NT

Java语言实现通过Ajax抓取后台数据及图片

1.Java语言实现通过Ajax抓取后台数据及图片信息 1.1数据库设计 create table picture( pic_id number not null, pic_name varchar(200)not null, pic_url varchar2(200) not null, pic_descp varchar2(200) not null, pic_price varchar2(200) not null ) insert into picture values(1 ,'小米5s

java抓取网页数据,登录之后抓取数据。

最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一个jsoup的jar包,我用的1.6.0..下载地址为:http://pan.baidu.com/s/1mgqOuHa 1,获取网页内容(核心代码,技术有限没封装). 2,登录之后抓取网页数据(如何在请求中携带cookie). 3,获取网站的ajax请求方法(返回json). 以上这三点我就用一个类

Fiddler:在PC和移动设备上抓取HTTPS数据包

Fiddler是一个免费的Web调试代理,支持任何浏览器.系统以及平台.这个工具是进行Web和App网络开发的必备工具,戳此处下载. 根据Fiddler官网的描述,具有以下六大特点: Web调试 性能测试 HTTP/HTTPS流量记录 Web会话处理 安全测试 自定义扩展性 本文讨论的主要内容是如何设置Fiddler,使PC和移动设备上可以抓取HTTPS数据包. 首先,在菜单栏选择Tools->FiddlerOptions,切换到Connections选项卡 第二步,勾选允许远程连接,并设置一个

正则表达式抓取新闻数据

抓取网站数据建议用服务操作,此例只实现从请求到拿数据,并把数据写入xml的功能 List<youcaimodel> _list = new List<youcaimodel>(); int page = 1000; //一共抓取1000页的数据 WebClient client = new WebClientto(3000); client.Credentials = CredentialCache.DefaultCredentials;  //获取或设置用于向Internet资源