@scomper

网页数据采集和数据透视

2019.02.16

经常看到不少 Excel 文档里采用合并单元格的方式来集中显示相同地域、年份的数据行,例如有三条数据都是北京的,那么顶头的三个单元格一般会被合并成一个,写上「北京」,这样视觉效果上能避免重复,看上去更美观。如果不需要分析数据,这种做法并没有什么问题,如果要整体排序和筛选数据时,合并单元格就成了阻碍。

数据透视

Excel 和 Numbers 里其实都提供了数据分组展示的功能,可以方便快速的按内容进行分组,Excel 里就是我们熟悉的「数据透视表」,Numbers 里叫类别整理。Excel 里的数据透视表功能更强大,不过如果只是简单的分组和计数统计 Numbers 的类别也够用。

在 Excel 中打开表格后,通过菜单「插入 - 数据透视表」的方式新建数据透视表。在数据透视表的设置面板中勾选想单独展示和计数的数据。勾选想想显示的标签项,拖拽到底部的「行」和「值」中来分析数据。实践一下很快就能理解它的数据展现逻辑。

图示中想统计一下 2018 年影片的数量,所以数据透视表的勾选项里选择了「影片名称」、「年份」这两项,底部的「行」中也选择了这两项,年份排在影片名称之前以便按年份分组展示。想统计这一年的影片数量只需要将影片名称拖到「值」这一栏。

✱ 需要注意的是,用来做数据透视的表格中不能包含「合并单元格」,如果有的话需要取消。

Numbers 中按类别分组更简单,点击顶部的「添加类别」或者在右侧的检查面板中选择「整理」。
打开「类别」的滑块,由「显示群组」中选择类别的列名称。

类别开关启用后,显示效果就不一样了。左侧都自动添加了可以展开和收缩的分组栏。
分组栏只是为了显示方便,并不影响数据的复制和选择等操作。群组类别支持多选,递进显示。例如,下图中先按年份显示影片,然后又加入了评分类别,这样年份中又多了一个评分层级。

需要注意的是,如果在 Numbers 中启用了类别整理,此时导出为 Excel 格式,分组依旧会保留,但是因为兼容性的关系,动态的分组会变成静态的表格单元。

用 Web Scraper 抓取网页数据

为了在电子表格中演示数据透视,一度为数据的样本发愁,公司的表格不合适用来演示,自己写几条数据量又不太够,最后想到的方法是从网页里「扒」一些数据出来,想想这也是平时我们采集数据的一个主要途径,很有必要普及一下这方面的知识。

有开发经验的同学从网页扒数据是很简单的,不懂编程的人该如何从网页里采集属性相同的多条数据呢?
答案是安装一个 Chrome 扩展 Web Scraper 插件

Web Scraper 插件可以对网页的内容进行针对性的抓取,并生成 csv 的电子表格文件,不需要编程开发就能同样快速的获取网页中的数据。

安装 Chrome 扩展这里就不赘述了,安装好 Web Scraper 插件后退出 Chrome 重新打开后,工具栏可以看到 Web Scraper 的 🕸️ 图标。Web Scraper 是工作在「开发者模式」下的插件,所以安装好 Web Scraper 以后,需要按 ⌥⌘I 进入浏览器的开发调试窗口,调试选项卡的最右侧会看到 Web Scraper 的标签。

点击 Web Scraper 进入它的设置界面:

  • Sitemaps,网站地图,可以理解为是一个入口地址,所有创建的可分析站点都会列在这里,刚开始使用时这里是空白的。
  • Sitemap,当前保存的地址和选择器的设置等
  • Create new sitemap,创建新的抓取站点。

Web Scraper 的内容抓取逻辑和设计师绘制网页的过程很相似,先添加一个网页(sitemap)定位为入口作为起始点,然后添加一系列的「Selector」(选择器)来定义要抓取的网页元素,添加「Selector」(选择器)时,需要遵循先大后小的原则,按网页布局的嵌套关系,先抓取页面中的大框架,再进一步定义抓取小的要素,层层递进,以此来获得完整有序的数据链。

我们反过来先熟悉一下 Web Scraper - Sitemap - Selector graph 这个功能,它会以拓扑图的方式展现你定义的选择器之间的层级结构。抓取的数据如果没有达到预期,首先也是检查这个地方的数据链是否正确。以豆瓣电影页面的内容采集为例,我想采集的是多个网页中电影卡片中的相关信息,影片名称和导演、评分这些是对应的关系,而不是孤立的,结果就是上面表格软件所看到的样子。

基本使用逻辑说完,我们就开始实践:
首先明确我们要分析抓取的页面,2018 电影票房的起始页(https://www.douban.com/doulist/49248585/)。

打开网页后可以尝试去掉网页 URL 中多余的参数去掉,以便获得最原始的链接,例如你可能看到的是 https://www.douban.com/doulist/49248585/?start=0&sort=seq&playable=0&sub_type=,去掉 URL 中后缀参数后 https://www.douban.com/doulist/49248585/ 访问的是同一个页面,那么可以用后者的 URL 地址作为你 Create new sitemap 的 Start URL 地址。Site name 命名随便取一个直观的英文名即可。

创建完新的分析站点 URL 以后,切换到 Sitemaps 标签页就能看到你添加的站点。点击 Start URL 进入站点,添加具体的内容选择器「Add new selector」。

滑动到页面底部,先把页面底部导航链接关联的页面都添加到分析站点里。意图是采集首页 _root 页和后续导航分页中的相同内容。

3.0,点击 Add new selector 新建一个选择器;
3.1,ID:link,英文命名选择器的目的,用于抓取导航链接;
3.2,Type:Link,选择器类型选 Link,点击 Selector Tab 标签中的 Select;
3.3,点击 Select 后就可以直接在上面的网页里点选目标元素了;
3.4,点击网页底部的导航元素 2、3,点选 2 个以后 Web Scraper 就能识别同类的元素,并用红色框选出其他同类要素;
3.5,点击 Done selecting!结束元素选择;
3.6,因为涉及到多个页面,勾选上「Multiple」
3.7,选择父级的页面或选择器,这里默认是 _root,保持不变点击底部的 Save 保存。

继续在 _root 页面下添加一个新的选择器,这次要定义的选择器是包含电影信息的整个卡片框架。
为新的选择器命名,因为卡片包含多种不同元素,所以Type 选择 Element,其他步骤一样,点击 Select 后在网页中点选两个框架,滑动页面检查 Web Scraper 的判断是否正确,保存选择器。

父级对象这里不同,_root 和 Link 页面都包含电影卡片信息,所以 Parent Selectors 里两个都是它的父级。

通过 Sitemap - Selectors 可以查看和修改已有的「选择器」,每一条选择器条目后面都有 4 个按钮:

  • Element preview,预览选择器选择的元素
  • Data preview,预览选择器抓取的数据结果
  • Edit,回到选择器编辑设置页面
  • Delete,删除选择器

要提取信息的页面都定义好了,包含电影信息的卡片页定义好了,接下来只需要选择 card(已有选择器中点击 card 的条目添加它的子级) ④ 作为父级页面定义它所包含的电影详细条目 ⑤ 就好了。

  • 2018 电影票房的起始页(https://www.douban.com/doulist/49248585/)是 _root 的基础页,也是抓取数据的入口。
  • 页面底部的 2、3、4、5、6、7 的导航分页是由起始页关联到的其他内容页,这里单独添加了一个选择器 link 来跟踪这些链接;
  • 页面中显示具体影片信息的框架,被我添加为一个新的选择器,命名为 card,它的父级是 _root 和 link 链接的页面。
  • 接下来又逐个添加了电影信息卡片中的具体要素,例如,影片名称、评分、导演和演员信息等,这些内容的父级是 card。

✱ 需要注意问题,添加 card 的子级 name、star、info 时不需要勾选「Multiple」。

好了,所有的选择器都添加好,抓取一下所有数据看看结果。

  • 由 Sitemap 下拉菜单中选择「Scrape」⑥;
  • 选择页面加载时长的定义,页面的加载时间保持默认就行 ⑦;
  • Web Scraper 会弹出自己的简版浏览器窗口,加载和分析页面,耐心等待它自己结束就行
  • 点击 refresh 刷新采集的数据 ⑧;
  • 结果页面出来后如果检查没有问题,就可以回到 Sitemap 下拉菜单中选择「Export data as CSV」导出成 csv 文件。


PS:电影信息卡片中抓取的导演、演员信息是按 text 整块抓取的,用电子表格软件打开这些信息会在一个单元格,如果想拆开它们需要先用文本编辑器编辑一下 csv,在查找替换中用正则替换方式 替换\n \n\n",",这样内容就齐整了:)。



赞赏 一杯咖啡让「壹页单章」走的更远。

Comments
Write a Comment