精华内容
下载资源
问答
  • 今天的内容算这个系列的最后一篇文章了,下一章节我会开一个新坑,说说如何利用 Excel 对收集到的数据做一些格式化的处理和分析。Web Scraper 教程的全盘总结我放在下一篇文章,今天先开始我们的实战教程。在前面的...

    e62ad36da0f15c83051faf32b100eff0.png

    不知不觉,web scraper 系列教程我已经写了 10 篇了,这 10 篇内容,基本上覆盖了 Web Scraper 大部分功能。今天的内容算这个系列的最后一篇文章了,下一章节我会开一个新坑,说说如何利用 Excel 对收集到的数据做一些格式化的处理和分析。

    Web Scraper 教程的全盘总结我放在下一篇文章,今天先开始我们的实战教程。

    在前面的课程里,我们抓取的数据都是在同一个层级下的内容,探讨的问题主要是如何应对市面上的各种分页类型,但对于详情页内容数据如何抓取,却一直没有介绍。

    比如说我们想抓取 b 站的动画区 TOP 排行榜的数据:

    https://www.bilibili.com/ranking/all/1/0/3

    按之前的抓取逻辑,我们是把这个榜单上和作品有关的数据抓取一遍,比如说下图里的排名、作品名字、播放量、弹幕数和作者名。

    427cd8916c681c0a7e3ad9f046ad25d7.png

    经常逛 B 站的小伙伴也知道,UP 主经常暗示观看视频小伙伴三连操作(点赞+投币+收藏),由此可见,这 3 个数据对视频的排名有一定的影响力,所以这些数据对我们来说也有一定的参考价值。

    25e977c0e28b5db2e055877ec9b8ec17.gif

    但遗憾的是,在这个排名列表里,并没有相关数据。这几个数据在视频详情页里,需要我们点击链接进去才能看到:

    43aaacf84b3b5ca262a95bb6639a5455.gif

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

    1.创建 SiteMap

    首先我们找到要抓取的数据的位置,关键路径我都在下图的红框里标出来了,大家可以对照一下:

    9acaf437a137c6d9acab8a2a38ffec51.png

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

    735a8636f203ae9abe5fb61b96ec5b88.png

    2.创建容器的 selector

    设置之前我们先观察一下,发现这个网页的排行榜数据是 100 条数据一次性加载完的,没有分页的必要,所以这里的 Type 类型选为 Element 就行。

    其他的参数都比较简单,就不细说了(不太懂的可以看我之前的基础教程)这里截个图大家可以做个参考:

    22760ee7b9b5d0764e364099b8816bf7.png

    3.创建列表页子选择器

    这次子选择器要抓取的内容如下,也都比较简单,截个图大家可以参考一下:

    1. 排名(num)

    2. 作品标题(title)

    3. 播放量(play_amount)

    4. 弹幕量(danmu_count)

    5. 作者:(author)

    427cd8916c681c0a7e3ad9f046ad25d7.png

    2a4903e6bd69c4455c98a93969c6c885.png

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

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

    那么我们正常查看二级页面(详情页)是怎么操作的呢?其实就是点击标题链接跳转

    b0d87ebdc1d87db258bc3d5139f1771a.gif

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

    感觉有些抽象?我们对照例子来理解一下。

    首先在这个案例里,我们获取了标题的文字,这时的选择器类型为 Text:

    d30c197f624bfab8ded5f59ce6a2ae5a.png

    当我们要抓取链接时,就要再创建一个选择器,选的元素是一样的,但是 Type 类型为 Link

    122f2d6e64415fd88c94c22ec0f3b454.png

    创建成功后,我们点击这个 Link 类型的选择器,进入他的内部,再创建相关的选择器,下面我录了个动图,注意看我鼠标强调的导航路由部分,可以很清晰的看出这几个选择器的层级关系:

    4ffa446367882c1a70f21cc9aa17c936.gif

    4.创建详情页子选择器

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

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

    2631db98b92e389c9a26429abbb75a9d.gif

    我们在类型为 Link 的选择器内部多创建几个选择器,这里我选择了点赞数、硬币数、收藏数和分享数 4 个数据,这个操作也很简单,这里我就不详细说了。

    bae6050a3dde5d32ce3afef52458a5b6.png

    所有选择器的结构图如下:

    2afa7560c10271ee4bfde3c1a9a241e6.png

    我们可以看到 video_detail_link 这个节点包含 4 个二级页面(详情页)的数据,到此为止,我们的子选择器已经全部建立好了。

    5.抓取数据

    终于到了激动人心的环节了,我们要开始抓取数据了。但是抓取前我们要把等待时间调整得大一些,默认时间是 2000 ms,我这里改成了 5000 ms。

    f0beee637e4bb781dbaa1c90894b2b36.png

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

    5cbc72d2c900c6e9a78fd28aecf23438.gif

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

    其次,我们可以观察一下要抓取的点赞量等数据,页面刚刚加载的时候,它的值是 「--」,等待一会儿后才会变成数字。

    所以,我们直接等待 5000 ms,等页面和数据加载完成后,再统一抓取。

    配置好参数后,我们就可以正式抓取并下载了。下图是我抓取数据的一部分,特此证明此方法有用:

    7703dcb85f0a85e43dd142dd99242724.png

    6.总结

    这次的教程可能有些难度,我把我的 SiteMap 分享出来,制作的时候如果遇到难题,可以参考一下我的配置,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}]}

    当你掌握了二级页面的抓取方式后,三级页面、四级页面也不在话下。因为套路都是一样的:都是先创建 Link 选择器、然后在 Link 选择器指向的下一个页面内抓取数据,我就不一一演示了。

    439ad5480dcff5898a66b35a6fbdcd53.png

    今天我们还来聊聊 Web Scraper 翻页的技巧。

    这次的更新是受一位读者启发的,他当时想用 Web scraper 爬取一个分页器分页的网页,却发现我之前介绍的分页器翻页方法不管用。我研究了一下才发现我漏讲了一种很常见的翻页场景。

    web scraper 翻页——分页器翻页的文章里,我们讲了如何利用 Element Click 选择器模拟鼠标点击分页器进行翻页,但是把同样的方法放在豆瓣 TOP 250 上,翻页到第二页时抓取窗口就会自动退出,一条数据都抓不到。

    其实主要原因是我没有讲清楚这种方法的适用边界。

    通过  Element Click 点击分页器翻页,只适用于网页没有刷新的情况,我在分页器那篇文章里举了蔡徐坤微博评论的例子,翻页时网页是没有刷新的:

    仔细看下图,链接发生了变化,但是刷新按钮并没有变化,说明网页并没有刷新,只是内容变了

    a303b3140e27738841c3298cda853b96.gif

    而在 豆瓣 TOP 250 的网页里,每次翻页都会重新加载网页:

    仔细看下图,链接发生变化的同时网页刷新了,有很明显的 loading 转圈动画

    3a3cdde89fd01f0e73fd45006d5a14f8.gif

    其实这个原理从技术规范上很好解释:

    - 当一个 URL 链接是 # 字符后数据变化时,网页不会刷新;

    - 当链接其他部分变化时,网页会刷新。

    当然这个只是随口提一下,感兴趣的同学可以去这个链接研究一下,不感兴趣可以直接跳过。

    1.创建 Sitemap

    本篇文章就来讲解一下,如何利用 Web Scraper 抓取翻页时会刷新网页的分页器网站。

    这次的网页我们选用最开始练手 Web Scraper 的网站——豆瓣电影 TOP250:

    https://movie.douban.com/top250?start=0&filter=

    像这种类型的网站,我们要借助 Link 选择器来辅助我们翻页。Link 标签我们在上一节介绍过了,我们可以利用这个标签跳转网页,抓取另一个网页的数据。这里我们利用 Link 标签跳转到分页网站的下一页

    首先我们用 Link 选择器选择下一页按钮,具体的配置可以见下图:

    a231cad57026d963259b1a1e379a0e4a.png

    这里有一个比较特殊的地方:Parent Selectors ——父选择器。

    之前我们都没有碰过这个选择框的内容,next_page 这次要有两个父节点——_root 和 next_page,键盘按 shift 再鼠标点选就可以多选了,先按我说的做,后面我会解释这样做的理由。

    保存 next_page 选择器后,在它的同级下再创建 container 节点,用来抓取电影数据:

    112bb030e02a8a79fcd69c42e124f6f8.png

    这里要注意:翻页选择器节点 next_page 和数据选择器节点 container 是同一级,两个节点的父节点都是两个:_root 和 next_page:

    d61cfd7850eaa9c93ec569e2662e9cc6.png

    因为重点是 web scraper 翻页技巧,抓取的数据上我只简单的抓取标题和排名:

    5bde67733c5072b5c4bd41e2b610b2d9.png

    然后我们点击 Selector graph 查看我们编写的爬虫结构:

    a26e229a1d4bbe544a2032b9c5a9f488.png

    可以很清晰的看到这个爬虫的结构,可以无限的嵌套下去:

    ba26aeacfed77c0383193c43081592fb.png

    点击 Scrape,爬取一下试试,你会发现所有的数据都爬取下来了:

    5207a75d67afd2cfed05425c4afe9d7e.png

    2.分析原理

    按照上面的流程下来,你可能还会比较困扰,数据是抓下来了,但是为什么这样操作就可以呢,为什么 next_page 和 container 要同级,为什么他们要同时选择两个父节点:_root 和 next_page?

    产生困扰的原因是因为我们是倒叙的讲法,从结果倒推步骤;下面我们从正向的思维分步讲解。

    首先我们要知道,我们抓取的数据是一个树状结构,_root 表示根节点,就是我们的抓取的第一个网页,我们在这个网页要选择什么东西呢?

    4f2ddac273ea2a26f294543791b5548b.png

    1.一个是下一页的节点,在这个例子里就是用 Link  选择器选择的 next_page

    2.一个是数据节点,在这个例子里就是用 Element  选择器选择的 container

    因为 next_page 节点是会跳转的,会跳到第二页。第二页除了数据不一样,结构和第一页还是一样的,为了持续跳转,我们还要选择下一页,为了抓取数据,还得选择数据节点:

    802bc9502d6015b613cb662dba2aca1c.png

    如果我们把箭头反转一下,就会发现真相就在眼前,next_page 的父节点,不正好就是 _root 和 next_page  吗?container 的父节点,也是  _root 和 next_page!

    9cc86cf5863b95d70489befe72f3c702.png

    到这里基本就真相大白了,不理解的同学可以再多看几遍。像 next_page 这种我调用我自己的形式,在编程里有个术语——递归,在计算机领域里也算一种比较抽象的概念,感兴趣的同学可以自行搜索了解一下。

    3.sitemap 分享

    下面是这次实战的 Sitemap,同学们可以导入到自己的 web scraper 中进行研究:

    {"_id":"douban_movie_top_250","startUrl":["https://movie.douban.com/top250?start=0&filter="],"selectors":[{"id":"next_page","type":"SelectorLink","parentSelectors":["_root","next_page"],"selector":".next a","multiple":true,"delay":0},{"id":"container","type":"SelectorElement","parentSelectors":["_root","next_page"],"selector":".grid_view li","multiple":true,"delay":0}]}

    ● 简易数据分析(三):Web Scraper 批量抓取豆瓣数据与导入已有爬虫

    ● 简易数据分析(五):Web Scraper 翻页、自动控制抓取数量 & 父子选择器

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

    ·END·

    图雀社区

    汇聚精彩的免费实战教程

    b363f1b7a089c9f7b396419a328b8fcc.png

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

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

    c24e5f86b886c056f6c87224876da784.png
    展开全文
  • Word或Excel文件经常被覆盖,大部分原因是人为错误。覆盖的文件不会进入资源回收站,因此,即使您可以从Windows 10/8/7中的资源回收站恢复文件,也无法恢复丢失的原始文件。不过还是有几种方法可以用于恢复覆盖或...

    144f8bd59630236727f77541f4c5c9db.png

    Word或Excel文件经常被覆盖,大部分原因是人为错误。覆盖的文件不会进入资源回收站,因此,即使您可以从Windows 10/8/7中的资源回收站恢复文件,也无法恢复丢失的原始文件。

    不过还是有几种方法可以用于恢复覆盖或取代的文件。在本文中,我们将介绍两种可以恢复覆盖数据的解决方案。所有的方法都可以用于Word、Excel、PPT文档以及其他类型的文件。此外,本文还提供了一款免费的文档恢复工具,帮助您有效地恢复丢失、删除或格式化的文档。

    两种可能恢复Windows 10/8/7中覆盖的文件的方法

    下面将示范恢复覆盖文件的最有效解决方案。您可以都试一试。

    方法1. 从以前的版本中恢复覆盖的文件

    以前的版本是Windows的备份和还原功能,可以用于恢复删除、格式化、修改、损毁或丢失的文件和资料夹。如果够幸运,您可能可以从以前的版本中恢复覆盖的文件!请看以下:

    1. 右键点击文件并选择「属性」。

    2. 点选「以前的版本」。

    3. 选择最新的版本,点击「还原」按钮恢复覆盖的文件。

    27e3f568429e5010eb723531f3a23ff9.png

    方法2. 使用「系统还原」恢复文件

    使用系统还原恢复到最后一个备份点,此为恢复覆盖文件最简单和最有效的方法。以下为步骤。

    1. 在搜寻中输入「创建还原点」>点击开启。

    2. 选择要还原的日期。

    3. 按照屏幕上的指示恢复覆盖的文件。

    如何使用免费的易我文件恢复软件恢复丢失的文件

    如果无法使用上述解决方案恢复覆盖或丢失的,可以求助免费数据恢复软件。易我数据恢复软件能够在您没有备份时恢复意外删除、格式化或病毒攻击导致的文件丢失情况。软件支持从Windows和Mac硬盘(HDD和SSD)、外接硬盘、记忆卡、USB移动设备、SD卡和其他可移动磁盘中恢复照片、影片、音档、电子邮件、文件以及其他200多种文件类型。

    步骤 1. 选择位置查找资料

    启动数据恢复软件 — 易我数据恢复软件大师,选择丢失文件存放的位置(比如桌面、硬盘、资料库(Library)、外接式储存装置或丢失分区),开始扫描。

    0003425b86557ab606b4f55b85d099ba.png

    步骤 2. 扫描分区

    单击「扫描」按钮。软件开始扫描磁盘分区,为您尽可能查找丢失资料。

    f906857fbe3ec54df5b89cdd0e57b837.png

    快速找到需要的资料技巧

    · 更多文件:涵盖丢失名称和储存路径的文件

    · 筛选:可以根据文件类型快速找到需要的文件

    · 搜索:例如,文件名称或副文件名

    步骤 3. 预览并复原丢失数据

    易我数据恢复软件允许您预览特定的可恢复资料。在预览过滤文件内容后,勾选需要的资料并按下「恢复」即可找回您需要的一切。

    173ac6de9a0444e7b52c26f4c112d2e0.png
    展开全文
  • 中文版Excel.2007图表宝典 1/2

    热门讨论 2012-04-06 18:49:24
    对于那些想制作出精美、专业的电子数据表格的中高级Excel用户,特别是经常需要利用Excel图表演示工作数据的用户,本书是一部绝佳的学习指南。这些实例可以直接进行部署使用。 内容提要 ---------------------------...
  • 中文版Excel.2007图表宝典 2/2

    热门讨论 2012-04-06 19:01:36
    对于那些想制作出精美、专业的电子数据表格的中高级Excel用户,特别是经常需要利用Excel图表演示工作数据的用户,本书是一部绝佳的学习指南。这些实例可以直接进行部署使用。 内容提要 ---------------------------...
  • 6.1 Excel如何处理日期和时间 6.1.1 了解日期序列号 6.1.2 输入日期 6.1.3 理解时间序列号 6.1.4 输入时间 6.1.5 日期和时间的格式化 6.1.6 有关日期的问题 6.2 日期函数 6.2.1 显示当前日期 6.2.2 显示...
  • 6.1 Excel如何处理日期和时间 6.1.1 了解日期序列号 6.1.2 输入日期 6.1.3 理解时间序列号 6.1.4 输入时间 6.1.5 日期和时间的格式化 6.1.6 有关日期的问题 6.2 日期函数 6.2.1 显示当前日期 6.2.2 显示...
  • 这是简易数据分析系列的第 13 篇文章...今天的内容算这个系列的最后一篇文章了,下一章节我会开一个新坑,说说如何利用 Excel 对收集到的数据做一些格式化的处理和分析。 Web Scraper 教程的全盘总结我放在下一篇文...

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

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

    不知不觉,web scraper 系列教程我已经写了 10 篇了,这 10 篇内容,基本上覆盖了 Web Scraper 大部分功能。今天的内容算这个系列的最后一篇文章了,下一章节我会开一个新坑,说说如何利用 Excel 对收集到的数据做一些格式化的处理和分析。

    Web Scraper 教程的全盘总结我放在下一篇文章,今天先开始我们的实战教程。

    在前面的课程里,我们抓取的数据都是在同一个层级下的内容,探讨的问题主要是如何应对市面上的各种分页类型,但对于详情页内容数据如何抓取,却一直没有介绍。

    比如说我们想抓取 b 站的动画区 TOP 排行榜的数据:

    https://www.bilibili.com/ranking/all/1/0/3

    按之前的抓取逻辑,我们是把这个榜单上和作品有关的数据抓取一遍,比如说下图里的排名、作品名字、播放量、弹幕数和作者名。

    经常逛 B 站的小伙伴也知道,UP 主经常暗示观看视频小伙伴三连操作(点赞+投币+收藏),由此可见,这 3 个数据对视频的排名有一定的影响力,所以这些数据对我们来说也有一定的参考价值。

    但遗憾的是,在这个排名列表里,并没有相关数据。这几个数据在视频详情页里,需要我们点击链接进去才能看到:

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

    ##1.创建 SiteMap

    首先我们找到要抓取的数据的位置,关键路径我都在下图的红框里标出来了,大家可以对照一下:

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

    2.创建容器的 selector

    设置之前我们先观察一下,发现这个网页的排行榜数据是 100 条数据一次性加载完的,没有分页的必要,所以这里的 Type 类型选为 Element 就行。

    其他的参数都比较简单,就不细说了(不太懂的可以看我之前的基础教程)这里截个图大家可以做个参考:

    3.创建列表页子选择器

    这次子选择器要抓取的内容如下,也都比较简单,截个图大家可以参考一下:

    1. 排名(num)
    2. 作品标题(title)
    3. 播放量(play_amount)
    4. 弹幕量(danmu_count)
    5. 作者:(author)

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

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

    那么我们正常查看二级页面(详情页)是怎么操作的呢?其实就是点击标题链接跳转:

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

    感觉有些抽象?我们对照例子来理解一下。

    首先在这个案例里,我们获取了标题的文字,这时的选择器类型为 Text:

    当我们要抓取链接时,就要再创建一个选择器,选的元素是一样的,但是 Type 类型为 Link

    创建成功后,我们点击这个 Link 类型的选择器,进入他的内部,再创建相关的选择器,下面我录了个动图,注意看我鼠标强调的导航路由部分,可以很清晰的看出这几个选择器的层级关系:

    4.创建详情页子选择器

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

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

    我们在类型为 Link 的选择器内部多创建几个选择器,这里我选择了点赞数、硬币数、收藏数和分享数 4 个数据,这个操作也很简单,这里我就不详细说了。

    所有选择器的结构图如下:

    我们可以看到 video_detail_link 这个节点包含 4 个二级页面(详情页)的数据,到此为止,我们的子选择器已经全部建立好了。

    5.抓取数据

    终于到了激动人心的环节了,我们要开始抓取数据了。但是抓取前我们要把等待时间调整得大一些,默认时间是 2000 ms,我这里改成了 5000 ms。

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

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

    其次,我们可以观察一下要抓取的点赞量等数据,页面刚刚加载的时候,它的值是 「–」,等待一会儿后才会变成数字。

    所以,我们直接等待 5000 ms,等页面和数据加载完成后,再统一抓取

    配置好参数后,我们就可以正式抓取并下载了。下图是我抓取数据的一部分,特此证明此方法有用:

    6.总结

    这次的教程可能有些难度,我把我的 SiteMap 分享出来,制作的时候如果遇到难题,可以参考一下我的配置,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}]}
    

    当你掌握了二级页面的抓取方式后,三级页面、四级页面也不在话下。因为套路都是一样的:都是在 Link 选择器指向的下一个页面抓取数据,因为原理是一样的,我就不演示了。

    7.推荐阅读

    简易数据分析 06 | 如何导入别人已经写好的 Web Scraper 爬虫

    简易数据分析 05 | Web Scraper 翻页——控制链接批量抓取数据

    简易数据分析 08 | Web Scraper 翻页——点击「更多按钮」翻页

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

    简易数据分析 12 | Web Scraper 翻页——抓取分页器翻页的网页

    img

    展开全文
  • 这是简易数据分析系列的第 13 ...今天的内容算这个系列的最后一篇文章了,下一章节我会开一个新坑,说说如何利用 Excel 对收集到的数据做一些格式化的处理和分析。Web Scraper 教程的全盘总结我放在下一篇文章,今天...

    28440b55795a64e1c883235393e1f909.png

    cc198b70a681c9e8dd70afdf983a7853.png

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

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

    不知不觉,web scraper 系列教程我已经写了 10 篇了,这 10 篇内容,基本上覆盖了 Web Scraper 大部分功能。今天的内容算这个系列的最后一篇文章了,下一章节我会开一个新坑,说说如何利用 Excel 对收集到的数据做一些格式化的处理和分析。

    Web Scraper 教程的全盘总结我放在下一篇文章,今天先开始我们的实战教程。

    在前面的课程里,我们抓取的数据都是在同一个层级下的内容,探讨的问题主要是如何应对市面上的各种分页类型,但对于详情页内容数据如何抓取,却一直没有介绍。

    比如说我们想抓取 b 站的动画区 TOP 排行榜的数据:

    https://www.bilibili.com/ranking/all/1/0/3www.bilibili.com

    按之前的抓取逻辑,我们是把这个榜单上和作品有关的数据抓取一遍,比如说下图里的排名、作品名字、播放量、弹幕数和作者名。

    9708b7131a1ee62644c1cee63cf2d992.png

    经常逛 B 站的小伙伴也知道,UP 主经常暗示观看视频小伙伴三连操作(点赞+投币+收藏),由此可见,这 3 个数据对视频的排名有一定的影响力,所以这些数据对我们来说也有一定的参考价值。

    8edfaf7e525596bcc095951adc698624.gif

    但遗憾的是,在这个排名列表里,并没有相关数据。这几个数据在视频详情页里,需要我们点击链接进去才能看到:

    6d9e0bf25b02b01fb677e7d462a3a4d5.gif

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

    1.创建 SiteMap

    首先我们找到要抓取的数据的位置,关键路径我都在下图的红框里标出来了,大家可以对照一下:

    50eb0db65fe6fc641fe9a7805aa41d6a.png

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

    11a43f5261fe3a17ccce9bb15849235e.png

    2.创建容器的 selector

    设置之前我们先观察一下,发现这个网页的排行榜数据是 100 条数据一次性加载完的,没有分页的必要,所以这里的 Type 类型选为 Element 就行。

    其他的参数都比较简单,就不细说了(不太懂的可以看我之前的基础教程)这里截个图大家可以做个参考:

    db5348977c2b89a89ac1d5d6dda20f57.png

    3.创建列表页子选择器

    这次子选择器要抓取的内容如下,也都比较简单,截个图大家可以参考一下:

    1. 排名(num)
    2. 作品标题(title)
    3. 播放量(play_amount)
    4. 弹幕量(danmu_count)
    5. 作者:(author)

    9708b7131a1ee62644c1cee63cf2d992.png

    2d066f6d902d70cc4382a13d25c4cb7e.png

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

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

    那么我们正常查看二级页面(详情页)是怎么操作的呢?其实就是点击标题链接跳转:

    e0034807c933a1fa97406ee5a649c738.gif

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

    感觉有些抽象?我们对照例子来理解一下。

    首先在这个案例里,我们获取了标题的文字,这时的选择器类型为 Text:

    640ce5fae567bec42867402e453fe214.png

    当我们要抓取链接时,就要再创建一个选择器,选的元素是一样的,但是 Type 类型为 Link

    c79b48af40c7bc450307833d9b32b1cd.png

    创建成功后,我们点击这个 Link 类型的选择器,进入他的内部,再创建相关的选择器,下面我录了个动图,注意看我鼠标强调的导航路由部分,可以很清晰的看出这几个选择器的层级关系:

    f412184dd9c366e124a57b1455e5618d.gif

    4.创建详情页子选择器

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

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

    a4804dfa75df6afa4446ee44f23e7287.gif

    我们在类型为 Link 的选择器内部多创建几个选择器,这里我选择了点赞数、硬币数、收藏数和分享数 4 个数据,这个操作也很简单,这里我就不详细说了。

    e38bd37433a2e09904bb09718a795594.png

    所有选择器的结构图如下:

    1eae8f2220b1d08f74f5216bf1839046.png

    我们可以看到 video_detail_link 这个节点包含 4 个二级页面(详情页)的数据,到此为止,我们的子选择器已经全部建立好了。

    5.抓取数据

    终于到了激动人心的环节了,我们要开始抓取数据了。但是抓取前我们要把等待时间调整得大一些,默认时间是 2000 ms,我这里改成了 5000 ms。

    73b25321516956d7324f2f69111af857.png

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

    af41487a41f62097c47f44600ac910c1.gif
    首先,每次打开二级页面,都是一个全新的页面,这时候浏览器加载网页需要花费时间;
    其次,我们可以观察一下要抓取的点赞量等数据,页面刚刚加载的时候,它的值是 「--」,等待一会儿后才会变成数字。
    所以,我们直接等待 5000 ms,等页面和数据加载完成后,再统一抓取

    配置好参数后,我们就可以正式抓取并下载了。下图是我抓取数据的一部分,特此证明此方法有用:

    40dd443d558a6630255e2032fc17698a.png

    6.总结

    这次的教程可能有些难度,我把我的 SiteMap 分享出来,制作的时候如果遇到难题,可以参考一下我的配置,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}]}

    当你掌握了二级页面的抓取方式后,三级页面、四级页面也不在话下。因为套路都是一样的:都是在 Link 选择器指向的下一个页面抓取数据,因为原理是一样的,我就不演示了。

    7.推荐阅读

    简易数据分析 06 | 如何导入别人已经写好的 Web Scraper 爬虫

    简易数据分析 05 | Web Scraper 翻页——控制链接批量抓取数据

    简易数据分析 08 | Web Scraper 翻页——点击「更多按钮」翻页

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

    简易数据分析 12 | Web Scraper 翻页——抓取分页器翻页的网页

    3fd20da1cd81416306057f267cfa61c1.png
    展开全文
  • 今天的内容算这个系列的最后一篇文章了,下一章节我会开一个新坑,说说如何利用 Excel 对收集到的数据做一些格式化的处理和分析。 Web Scraper 教程的全盘总结我放在下一篇文章,今天先开始我们的实战教程。...
  • 这是简易数据分析系列的第 13 ...今天的内容算这个系列的最后一篇文章了,下一章节我会开一个新坑,说说如何利用 Excel 对收集到的数据做一些格式化的处理和分析。Web Scraper 教程的全盘总结我放在下一篇文章,今天...
  • 今天的内容算这个系列的最后一篇文章了,下一章节我会开一个新坑,说说如何利用 Excel 对收集到的数据做一些格式化的处理和分析。Web Scraper 教程的全盘总结我放在下一篇文章,今天先开始我们的实战教程。在前面的...
  • 所有商品数据可直接输出至Excel 中,对于管理员进行帐务分析、数据备份有着举足轻重的使用! 七、新增贝宝支付接口 贝宝是全球优秀的在线支付提供商,支持国内、国外银行卡支付,网趣时尚版现已整合贝宝支付接口,...
  • 但是如何在版本迅速迭代过程中提高接口自动化的测试效率,仍然是大部分公司需要解决的问题。 框架定位 数据驱动设计模式,无需写测试代码脚本即可实现自动化 等价类非等价类覆盖, E2E(接口流程性测试) Case...
  • 框架定位数据驱动设计模式,无需写测试代码脚本即可实现自动化等价类非等价类覆盖, E2E(接口流程性测试) Case覆盖使用Excel的方式进行自动化用例编写,简单,易用,高效。框架架构图框架介绍技术栈Jenkins + Svn + ...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0222 把Excel中的数据保存到数据库中 147 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用...
  • 0222 把Excel中的数据保存到数据库中 147 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用...
  • 0222 把Excel中的数据保存到数据库中 147 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用...
  • 0222 把Excel中的数据保存到数据库中 147 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用...
  • 0222 把Excel中的数据保存到数据库中 147 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用...
  • 0222 把Excel中的数据保存到数据库中 147 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用...
  • 9.2.1 确定数据表里有多少条数据记录(数据行) 172 9.2.2 确定数据表里有多少条内容不重复的数据记录(DISTINCT) 172 9.2.3 限制查询结果中的数据列个数 172 9.2.4 限制查询结果中的数据记录个数(LIMIT) 173...
  • 搜索 139第7章 链接、导入和导出表 1417.1 从其他应用或者向其他应用移动数据 1417.2 理解Access如何处理其他数据库文件 格式的表 1427.2.1 识别PC数据库文件格式 1437.2.2 链接和导入外部 ISAM表 1437.2.3 用ODBC...
  • 搜索 139第7章 链接、导入和导出表 1417.1 从其他应用或者向其他应用移动数据 1417.2 理解Access如何处理其他数据库文件 格式的表 1427.2.1 识别PC数据库文件格式 1437.2.2 链接和导入外部 ISAM表 1437.2.3 用ODBC...
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....

空空如也

空空如也

1 2 3 4 5
收藏数 98
精华内容 39
关键字:

如何覆盖excel部分数据