为了照顾更多的小伙伴,你们的学习能力及了解程度都不一样,所以你们能够经过如下目录来有选择性的学习,节约你们的时间。html
备注: 必定要实操!!!python
必定要实操!!!程序员
必定要实操!!!web
目录:json
#了解和介绍api
#下载及安装说明浏览器
#工欲善其事必先利其器markdown
#简单尝试(初期用法)案例解析:百度贴吧NBA吧话题爬取网络
#初级用法(控制连接完成批量爬虫)进阶 案例解析:豆瓣电影TOP250名称爬取工具
#中级用法(同步完成多项参数爬虫)进阶 案例解析:豆瓣电影TOP250名称爬取
#高级进阶(完成动态类(翻页;滚动加载))爬虫
#了解和介绍
相信能看到这篇文章的小伙伴们应该多多少少对web scraper有些了解,在这里就再也不过分阐述。
首先先简单介绍一下web scraper(web scraper 网页刮板)插件
是一款浏览器插件,或者是一款应用程序,用于简单的非代码工程化的爬虫工具,固然正是由于如此因此它的缺点即是对大规模的(数据集大、网页复杂)爬虫工程较为吃力,优势即是简单易操做,能知足小白的平常爬虫需求。
#下载及安装说明
其实一直一来web scraper是Googled的插件,可是由于Google下载商场在国内受到限制,因此为了节约时间我就不介绍Goog浏览器如何下载此插件(感兴趣的可自行查阅相关的资料,有不少)。
而FireFox浏览器插件能够正常在国内访问及安装,而且适配环境和Google浏览器一致,因此建议你们下载Firefox浏览器来使用web scraper插件。
1.下载安装Firefox浏览器(地址:https://www.mozilla.org/zh-CN/firefox/download/thanks/)
2.打开浏览器,点击右上角菜单栏,找到附加组件选项

3.进入附加组件管理器,左侧选择栏选择组件,搜索栏内搜索 web scraper,点击添加到Firefox便可,插件安装成功后,Firefox浏览器右上角便会显示web scraper图标,这表示安装成功了。

#工欲善其事必先利其器(后面的都要认真学了哦)
首先使用插件须要打开浏览器的开发者后台(想深刻了解的小伙伴能够打开http://www.javashuo.com/article/p-wvcddjgz-dz.html学习)
如何打开呢,首先定格在浏览器页面,而后按 F12
就能够实现(QQ 浏览器 F12
被禁掉了)。有的电脑须要fn+f12,Mac 电脑也能够用 option
+ command
+ I
打开,Win 电脑能够用 Ctrl
+ Shift
+ I
打开。
打开后会发现工具栏最右侧出现web scraper图标,点击后便进入web scraper插件,爬虫工做就从这里展开了!

打开后发现有三个工做栏:

先介绍如下URL:统一资源定位符,说白了就是一个网页地址,经常使用的https://www.baidu.com/ 这即是一个URL
sitemaps:网站地图
create new sitemap:建立新的网站地图
create new sitemap子工做栏:
create sitemap (建立网站地图),打开后会name和URL选项
import sitemap (导入网站地图),打开后会有个Sitemap JSON的选项,顾名思义,这个选项须要咱们自主添加json来建立网站地图,(后面会学习到)
好了,先知道这么多便可,下面开始咱们的web scraper爬虫进阶,冲啊
今天咱们开始数据抓取的第一课,完成咱们的第一个爬虫。由于是刚刚开始,操做我会讲的很是详细,可能会有些啰嗦,但愿各位不要嫌弃啊:)
有人以前可能学过一些爬虫知识,总以为这是个复杂的东西,什么 HTTP、HTML、IP 池,在这里咱们都不考虑这些东西。一是小的数据量根本不须要考虑,二是这些乱七八糟的东西根本没有说到爬虫的本质。
爬虫的本质是什么?其实就是找规律。

并且爬虫的找规律难度,大部分都是小学三年级的数学题水平。
咱们下面拿个例子说明一下,下图历史文章的一个截图,咱们能够很清晰的看到,每一条推文能够分为三大部分:标题、图片和做者,咱们只要找到这个规律,就能够批量的抓取这类数据。

好了,理论的地方咱们讲完了,下面咱们开始进行实操。
但凡作爬虫练手,第一个爬取的网站通常都是豆瓣电影 TOP 250,网址连接是 https://movie.douban.com/top250?start=0&filter=。第一次上手,咱们爬取的内容尽可能简单,因此咱们只爬取第一页的电影标题。

浏览器按 F12
打开控制台,并把控制台放在网页的下方(具体操做能够看上一篇文章),而后找到 Web Scraper 这个 Tab,点进去就来到了 Web Scraper 的控制页面。

进入 Web Scraper 的控制页面后,咱们按照 Create new sitemap
-> Create Sitemap
的操做路径,建立一个新的爬虫,sitemap
是啥意思并不重要,你就当他是个爬虫的别名就行了。

咱们在接下来出现的输入框里依次输入爬虫名和要爬取的连接。
爬虫名可能会有字符类型的限制,咱们看一下规则规避就行了,最后点击 Create Sitemap
这个按钮,建立咱们的第一个爬虫。

这时候会跳到一个新的操做面板,不要管别的,咱们直接点击 Add new selector
这个蓝底白字的按钮,顾名思义,建立一个选择器,用来选择咱们想要抓取的元素。

这时候就要开始正式的数据抓取环节了!咱们先观察一下这个面板有些什么东西:

1.首先有个 Id,这个就是给咱们要爬取的内容标注一个 id,由于咱们要抓取电影的名字,简单起见就取个 name 吧;
2.电影名字很明显是一段文字,因此 Type 类型确定是 Text,在这个爬虫工具里,默认 Type 类型就是 Text,此次的爬取工做就不须要改动了;
3.咱们把多选按钮 Multiple 勾选上,由于咱们要抓的是批量的数据,不勾选的话只能抓取一个;
4.最后咱们点击黄色圆圈里的 Select,开始在网页上勾选电影名字;
当你把鼠标移动到网页时,会发现网页上出现了绿色的方块儿,这些方块就是网页的构成元素,当咱们点击鼠标时,绿色的方块儿就会变为红色,表示这个元素被选中了:

这时候咱们就能够进行咱们的抓取工做了。
咱们先选择「肖生克的救赎」这个标题,而后再选择「霸王别姬」这个标题(注意:想达到多选的效果,必定要手动选取两个以上的内容)
选完这两个标题后,向下拉动网页,你就会发现全部的电影名字都被选中了:

拉动网页检查一遍,发现全部的电影标题都被选中后,咱们就能够点击 Done selecting!
这个按钮,表示选择完毕;

点击按钮后你会发现下图的红框位置会出现了一些字符,通常出现这个就表示选取成功了:

咱们点击 Data preview
这个按钮,就能够预览咱们的抓取效果了:

没什么问题的话,关闭 Data Preview 弹窗,翻到面板的最下面,有个 Save selector
的蓝色按钮,点击后咱们会回退到上一个面板。
这时候你会发现多了一行数据,其实就是咱们刚刚的操做内容被记录下来了。
在顶部的 tab 栏,有一个 Sitemap top250
的 tab,这个就是咱们刚刚建立的爬虫。点击它,再点击下拉菜单里的 Scrape
按钮,开始咱们的数据抓取。

这时候你会跳到另外一个面板,里面有两个输入框,先别管他们是什么,所有输入 2000 就行了。
点击 Start scraping
蓝色按钮后,会跳出一个新的网页,Web Scraper
插件会在这里进行数据抓取:

通常弹出的网页自动关闭就表明着数据抓取结束了,咱们点击面板上的 refresh
蓝色按钮,就能够看到咱们抓取的数据了!
在这个预览面板上,第一列是 web scraper 自动添加的编号,没啥意义;第二列是抓取的连接,第三列就是咱们抓取的数据了。

这个数据会存储在咱们的浏览器里,咱们也能够点击 Sitemap top250
下的 Export data as CSV
,这样就能够导出成 .csv
格式的数据,这种格式能够用 Excel 打开,咱们能够用 Excel 作一些数据格式化的操做。

今天咱们爬取了豆瓣电影TOP250 的第 1 页数据(也就是排名最高的 25 部电影),下一篇咱们讲讲,如何抓取全部的电影名。
上篇文章咱们爬取了豆瓣电影 TOP250 前 25 个电影的数据,今天咱们就要在原来的 Web Scraper 配置上作一些小改动,让爬虫把 250 条电影数据所有爬取下来。
前面咱们同时说了,爬虫的本质就是找规律,当初这些程序员设计网页时,确定会依循一些规则,当咱们找到规律时,就能够预测他们的行为,达到咱们的目的。
今天咱们就找找豆瓣网站的规律,想办法抓取所有数据。今天的规律就从经常被人忽略的网址连接开始。
1.连接分析
咱们先看看第一页的豆瓣网址连接:
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com
这个很明显就是个豆瓣的电影网址,没啥好说的
top250
这个一看就是网页的内容,豆瓣排名前 250 的电影,也没啥好说的
?
后面有个 start=0&filter=
,根据英语提示来看,好像是说筛选(filter),从 0 开始(start)

再看看第二页的网址连接,前面都同样,只有后面的参数变了,变成了 start=25
,从 25 开始;

咱们再看看第三页的连接,参数变成了 start=50
,从 50 开始;

分析 3 个连接咱们很容易得出规律:
start=0,表示从排名第 1 的电影算起,展现 1-25 的电影
start=25,表示从排名第 26 的电影算起,展现 26-50 的电影
start=50,表示从排名第 51 的电影算起,展现 51-75 的电影
…...
start=225,表示从排名第 226 的电影算起,展现 226-250 的电影
规律找到了就好办了,只要技术提供支持就行。随着深刻学习,你会发现 Web Scraper 的操做并非难点,最须要思考的其实仍是这个找规律。
2.Web Scraper 控制连接参数翻页
Web Scraper 针对这种经过超连接数字分页获取分页数据的网页,提供了很是便捷的操做,那就是范围指定器。
好比说你想抓取的网页连接是这样的:
http://example.com/page/1
http://example.com/page/2
http://example.com/page/3
你就能够写成 http://example.com/page/[1-3],把连接改为这样,Web Scraper 就会自动抓取这三个网页的内容。
固然,你也能够写成 http://example.com/page/[1-100],这样就能够抓取前 100 个网页。
那么像咱们以前分析的豆瓣网页呢?它不是从 1 到 100 递增的,而是 0 -> 25 -> 50 -> 75 这样每隔 25 跳的,这种怎么办?
http://example.com/page/0
http://example.com/page/25
http://example.com/page/50
其实也很简单,这种状况能够用 [0-100:25]
表示,每隔 25 是一个网页,100/25=4,爬取前 4 个网页,放在豆瓣电影的情景下,咱们只要把连接改为下面的样子就好了;
https://movie.douban.com/top250?start=[0-225:25]&filter=
这样 Web Scraper 就会抓取 TOP250 的全部网页了。
3.抓取数据
解决了连接的问题,接下来就是如何在 Web Scraper 里修改连接了,很简单,就点击两下鼠标:
1.点击 Stiemaps
,在新的面板里点击 ID 为 top250
的这列数据:

2.进入新的面板后,找到 Stiemap top250
这个 Tab,点击,再点击下拉菜单里的 Edit metadata
:

3.修改原来的网址,图中的红框是不一样之处:

修改好了超连接,咱们从新抓取网页就行了。操做和上文同样,我这里就简单复述一下:
- 点击
Sitemap top250
下拉菜单里的 Scrape
按钮
- 新的操做面板的两个输入框都输入 2000
- 点击
Start scraping
蓝色按钮开始抓取数据
- 抓取结束后点击面板上的
refresh
蓝色按钮,检测咱们抓取的数据
若是你操做到这里并抓取成功的话,你会发现数据是所有抓取下来了,可是顺序都是乱的。

咱们这里先无论顺序问题,由于这个属于数据清洗的内容了,咱们如今的专题是数据抓取。先把相关的知识点讲完,再攻克下一个知识点,才是更合理的学习方式。
这期讲了经过修改超连接的方式抓取了 250 个电影的名字。下一期咱们说一些简单轻松的内容换换脑子,讲讲 Web Scraper 如何导入别人写好的爬虫文件,导出本身写好的爬虫软件。
上两期咱们学习了如何经过 Web Scraper 批量抓取豆瓣电影 TOP250 的数据,内容都太干了,今天咱们说些轻松的,讲讲 Web Scraper 如何导出导入 Sitemap 文件。
前面也没有说,SItemap 是个什么东西,其实它就是咱们操做 Web Scraper 后生成的爬虫文件,至关于 python 爬虫的源代码,导入 Web Scraper 一运行就能够爬取数据。学习了这一章节,就能够分享咱们的设置好的爬虫文件了。
导出 Sitemap
导出 Sitemap 很简单,好比说咱们建立的 top250 Sitemap,点击 Sitemap top250
,在下拉菜单里选择 Export Sitemap
,就会跳到一个新的面板。

新的面板里有咱们建立的 top250 的 Sitemap 信息,咱们把它复制下来,再新建一个 TXT 文件,粘贴保存就行了。

导入 Sitemap
导入 Sitemap 也很简单,在建立新的 Sitemap 时,点击 Import Sitemap
就行了。

在新的面板里,在 Sitemap JSON
里把咱们导出的文字复制进去,Rename Sitemap
里取个名字,最后点击 Import Sitemap
按钮就能够了。

这期咱们介绍了 Web Scraper 如何导入导出 Sitemap 爬虫文件,下一期咱们对上一期的内容进行扩展,不仅仅抓取 250 个电影名,还要抓取每一个电影对应的排名,名字,评分和一句话影评。

在第 4 篇文章里,我讲解了如何抓取单个网页里的单类信息;
在第 5 篇文章里,我讲解了如何抓取多个网页里的单类信息;
今天咱们要讲的是,如何抓取多个网页里的多类信息。
此次的抓取是在简易数据分析 05的基础上进行的,因此咱们一开始就解决了抓取多个网页的问题,下面全力解决如何抓取多类信息就能够了。

咱们在实操前先把逻辑理清:
上几篇只抓取了一类元素:电影名字。这期咱们要抓取多类元素:排名,电影名,评分和一句话影评。

根据 Web Scraper 的特性,想抓取多类数据,首先要抓取包裹多类数据的容器,而后再选择容器里的数据,这样才能正确的抓取。我画一张图演示一下:

咱们首先要抓取多个 container(容器),再抓取 container 里的元素:编号、电影名、评分和一句话影评,当爬虫运行完后,咱们就会成功抓取数据。
概念上搞清楚了,咱们就能够讲实际操做了。
若是对如下的操做有疑问,能够看 简易数据分析 04 的内容,那篇文章详细图解了如何用 Web Scraper 选择元素的操做
1.点击 Stiemaps
,在新的面板里点击 ID 为 top250
的这列数据

2.删除掉旧的 selector,点击 Add new selector
增长一个新的 selector

3.在新的 selector 内,注意把 Type 类型改成 Element(元素),由于在 Web Scraper 里,只有元素类型才能包含多个内容。

咱们勾选的元素区域以下图所示,确认无误后点击 Save selector 按钮,就会回退到上一个操做面板。

在新的面板里,点击刚刚建立的 selector 那行数据:

点击后咱们就会进入一个新的面板,根据导航咱们可知在 container 内部。

在新的面板里,咱们点击 Add new selector,新建一个 selector,用来抓取电影名,类型为 Text,值得注意的是,由于咱们是在 container 内选择文字的,一个 container 内只有一个电影名,因此多选不要勾选,要否则会抓取失败。

选择电影名的时候你会发现 container 黄色高亮,咱们就在黄色的区域里选择电影名就行了。

点击 Save selector 保存选择器后,咱们再建立三个选择器,分别选择编号、评分和一句话影评,由于操做和上面如出一辙,我这里就省略讲解了。
排名编号:

评分:

一句话影评:

咱们能够在面板里观察咱们选择的多个元素,一共有四个元素:分别为 name、number、score 和 review,类型都是 Text,不须要多选,父选择器都是 container。

咱们能够点击 点击 Stiemap top250
下的 selector graph
,查看咱们爬虫选择元素的层级关系,确认正确后咱们再点击 Stiemap top250
下的 Selectors
,回到选择器展现面板。

下图就是咱们此次爬虫的层级关系,是否是和咱们以前理论分析的同样?

确认选择无误后,咱们就能够抓取数据了,操做在 简易数据分析 04 、 简易数据分析 05 里都说过了,忘记的朋友能够看旧文回顾一下。下图是我抓取的数据:

仍是和之前同样,数据是乱序的,不过这个没关系,由于排序属于数据清洗的内容了,咱们如今的专题是数据抓取。先把相关的知识点讲完,再攻克下一个知识点,才是更合理的学习方式。
咱们在Web Scraper 翻页——控制连接批量抓取数据一文中,介绍了控制网页连接批量抓取数据的办法。
可是你在预览一些网站时,会发现随着网页的下拉,你须要点击相似于「加载更多」的按钮去获取数据,而网页连接一直没有变化。
因此控制连接批量抓去数据的方案失效了,因此咱们须要模拟点击「加载更多」按钮,去抓取更多的数据。

今天咱们讲的,就是利用 web scraper 里的 Element click 模拟点击「加载更多」,去加载更多的数据。
此次的练习网站,咱们拿少数派网站的热门文章做为咱们的练习对象,对应的网址连接是:
https://sspai.com/tag/%E7%83%AD%E9%97%A8%E6%96%87%E7%AB%A0#home
为了复习上一个小节的内容,此次咱们模拟点击翻页的同时,还要抓取多条内容,包括做者、标题、点赞数和评论数。

下面开始咱们的数据采集之路。
2019-12-22 补充:
少数派官网改版,和我当初写教程的时抓取的网站有些许不一样,主要改动有如下几点:
- 「加载更多」按钮改成「更多」按钮,并且在网页全屏的状况下改成下拉自动加载,网页宽度半屏的状况下为点击「更多」按钮翻页,建议你们在半屏的状况下练习
- 只能抓取做者、标题和点赞数这 3 个数据,没法抓取评论数
- 网页 UI 样式有些许改动,但逻辑都是相通的,不影响教程学习和数据抓取
1.建立 sitmap
老规矩,第一步咱们先建立一个少数派的 sitmap,取名为 sspai_hot,起始连接为 https://sspai.com/tag/热门文章#home。

2.建立容器的 selector
经过上一节的内容,咱们知道想在 web scraper 里想抓取多种类型的数据,必须先建立一个容器(container),这个容器包含多种类型的数据,因此咱们第二步就是要建立容器的 selector。
要注意的是,这个 selector 的 Type 类型选为 Element click,翻译成中文就是模拟点击元素,意如其名,咱们能够利用这种类型模拟点击「加载更多」按钮。

这种类型的 selector,会多出几个选项,第一个就是 Click selector,这个就是选择「加载更多」按钮的,具体操做可见下图的动图。

还有几个多出来的选项,咱们一一解释一下:

1.Click type
点击类型,click more 表示点击屡次,由于咱们要抓取批量数据,这里就选择 click more,还有一个 click once 选项,点击一次
2.Click element uniqueness
这个选项是控制 Web Scraper 何时中止抓取数据的。好比说 Unique Text,表示文字改变时中止抓取数据。
咱们都知道,一个网站的数据不多是无穷无尽的,总有加载完的时候,这时候「加载更多」按钮文字可能就变成「没有更多」、「没有更多数据」、「加载完了」等文字,当文字变更时,Web scraper 就会知道没有更多数据了,会自动中止抓取数据。
3.Multiple
这个咱们的老朋友了,表示是否多选,这里咱们要抓取多条数据,固然要打勾。
4.Discard initial elements
是否丢弃初始元素,这个主要是去除一些网站的重复数据用的,不是很重要,咱们这里也用不到,直接选择 Never discard,从不丢弃数据。
5.Delay
延迟时间,由于点击加载更多后,数据加载须要一段时间,delay 就是等待数据加载的时间。通常咱们设置要大于等于 2000,由于延迟 2s 是一个比较合理的数据,若是网络很差,咱们能够设置更大的数字。
3.建立子选择器
接下来咱们建立几个子选择器,分别抓取做者、标题、点赞数和评论数四种类型的数据,详细操做我在上一篇教程中已经说明了,这里我就不详细说明了。整个爬虫的结构以下,你们能够参考一下:

4.抓取数据
按照 Sitemap spay_hot
-> Scrape
的操做路径就能够抓取数据了。

今天咱们学习了经过 Web Scraper 抓取点击加载更多类型的网页。实践过程当中,你会发现这种类型的网页没法控制爬取数目,不像豆瓣 TOP250,明明白白就是 250 条数据,很少也很多。下一篇咱们就聊聊,如何利用 Web Scraper,自动控制抓取的数目。
今天咱们说说 Web Scraper 的一些小功能:自动控制 Web Scraper 抓取数量和 Web Scraper 的父子选择器。
如何只抓取前 100 条数据?
若是跟着上篇教程一步一步作下来,你会发现这个爬虫会一直运做,根本停不下来。网页有 1000 条数据,他就会抓取 1000 条,有 10W 条,就会抓取 10W 条。若是咱们的需求很小,只想抓取前 200 条怎么办?
若是你手动关闭抓取数据的网页,就会发现数据所有丢失,一条都没有保存下来,因此说这种暴力的方式不可取。咱们目前有两种方式中止 Web Scraper 的抓取。
2019-10-26 补充:0.4.2 版本的 Web Scraper 已经支持实时保存,也就是说手动关闭抓取数据的网页也能够保存数据了
1.断网大法
当你以为数据抓的差很少了,直接把电脑的网络断了。网络一断浏览器就加载不了数据,Web Scraper 就会误觉得数据抓取完了,而后它会自动中止自动保存。
断网大法简单粗暴,虽不优雅,可是有效。缺点就是你得在旁边盯着,关键点手动操做,不是很智能。
2.经过数据编号控制条数
2019-10-26 补充:0.4.2 版本的 Web Scraper 改进了抓取方式,这种方法可能会失效
好比说上篇文章的少数派热门文章爬虫,container 的 Selector 为 dl.article-card
,他会抓取网页里全部编号为 dl.article-card
的数据。

咱们能够在这个 Selector 后加一个 :nth-of-type(-n+100)
,表示抓取前 100 条数据,前 200 条就为 :nth-of-type(-n+200)
,1000 条为 :nth-of-type(-n+1000)
,以此类推。

这样,咱们就能够经过控制数据的编号来控制须要抓取的数据。
抓取连接数据时,页面跳转怎么办?
在上文抓取数据时,可能会遇到一些问题,好比说抓取标题时,标题自己就是个超连接,点击圈选内容后打开了新的网页,干扰咱们肯定圈选的内容,体验不是很好。

其实 Web scraper 提供了对应的解决方案,那就是经过键盘来选择元素,这样就不会触发点击打开新的网页的问题了。具体的操做面板以下所示,就是咱们点击 Done Selecting
的那个控制条。

咱们把单选按钮选择后,会出现 S ,P, C 三个字符,意思分别以下:

S:Select,按下键盘的 S 键,选择选中的元素
P:Parent,按下键盘的 P 键,选择选中元素的父节点
C:Child,按下键盘的 C 键,选择选中元素的子节点
咱们分别演示一下,首先是经过 S 键选择标题节点:

咱们对比上个动图,会发现节点选中变红的同时,并无打开新的网页。
如何抓取选中元素的父节点 or 子节点?
经过 P 键和 C 键选择父节点和子节点:

按压 P 键后,咱们能够明显看到咱们选择的区域大了一圈,再按 C 键后,选择区域又小了一圈,这个就是父子选择器的功能。
这是简易数据分析系列的第 10 篇文章。
友情提示:这一篇文章的内容较多,信息量比较大,但愿你们学习的时候多看几遍。
咱们在刷朋友圈刷微博的时候,总会强调一个『刷』字,由于看动态的时候,当把内容拉到屏幕末尾的时候,APP 就会自动加载下一页的数据,从体验上来看,数据会源源不断的加载出来,永远没有尽头。

咱们今天就是要讲讲,如何利用 Web Scraper 抓取滚动到底翻页的网页。
今天咱们的练手网站是知乎数据分析模块的精华帖,网址为:
https://www.zhihu.com/topic/19559424/top-answers

此次要抓取的内容是精华帖的标题、答题人和赞同数。下面是今天的教程。
1.制做 Sitemap
刚开始咱们要先建立一个 container,包含要抓取的三类数据,为了实现滚动到底加载数据的功能,咱们把 container 的 Type 选为 Element scroll down
,就是滚动到网页底部加载数据的意思。

在这个案例里,选择的元素名字为 div.List-item
。

为了复习上一节经过数据编号控制条数的方法,咱们在元素名后加个 nth-of-type(-n+100)
,暂时只抓取前 100 条数据。

而后咱们保存 container 这个节点,并在这个节点下选择要抓取的三个数据类型。
首先是标题,咱们取名为 title,选择的元素名为 [itemprop='zhihu:question'] a
:

而后是答题人名字 name 与 赞同数 like,选择的元素名分别为 #Popover10-toggle a
和 button.VoteButton--up
:


2.爬取数据,发现问题
元素都选择好了,咱们按 Sitemap zhihu_top_answers
-> Scrape
-> Start craping
的路径进行数据抓取,等待十几秒结果出来后,内容却让咱们傻了眼:

数据呢?我要抓的数据呢?怎么全变成了 null?
在计算机领域里,null 通常表示空值,表示啥都没有,放在 Web Scraper 里,就表示没有抓取到数据。

咱们能够回想一下,网页上的的确确存在数据,咱们在整个的操做过程当中,惟一的变数就是选择元素这个操做上。因此,确定是咱们选择元素时出错了,致使内容匹配上出了问题,没法正常抓取数据。要解决这个问题,咱们就要查看一下网页的构成。
3.分析问题
查看一下网页的构成,就要用浏览器的另外一个功能了,那就是选择查看元素。
1.咱们点击控制面板左上角的箭头,这时候箭头颜色会变蓝。
2.而后咱们把鼠标移动到标题上,标题会被一个蓝色的半透明遮罩盖住。
3.咱们再点击一下标题,会发现咱们会跳转到 Elements
这个子面板,内容是一些花花绿绿看不大懂的代码

作到这里内心别发怵,这些 HTML 代码不涉及什么逻辑,在网页里就是个骨架,提供一些排版的做用。若是你日常用 markdown 写做,就能够把 HTML 理解为功能更复杂的 markdown。
结合 HTML 代码,咱们先看看 [itemprop='zhihu:question'] a
这个匹配规则是怎么回事。

首先这是个树形的结构:
- 先是一个名字为 h2 的标签
<h2>...</h2>
,它有个 class='ContentItem-title'
的属性;
- 里面又有个名为 div 的标签
<div>...</div>
,它有个 itemprop='zhihu:question'
的属性;
- div 标签里又有一个 名字为 a 的标签
<a>...</a>
;
- a 标签里有一行字,就是咱们要抓取的标题:
如何快速成为数据分析师?
上句话从可视化的角度分析,其实就是一个嵌套的结构,我把关键内容抽离出来,内容结构是否是清晰了不少?
<h2 class='ContentItem-title'/> <div itemprop='zhihu:question'/> <a>如何快速成为数据分析师?</a> </div> </h2>
咱们再分析一个抓取标题为 null 的标题 HTML 代码。

咱们能够很清楚的观察到,在这个标题的代码里,少了名为 div
属性为 itemprop='zhihu:question'
的标签!这样致使咱们的匹配规则匹配时找不到对应标签,Web Scraper 就会放弃匹配,认为找不到对应内容,因此就变成 null 了。
找到缘由后咱们就好解决问题了。
4.解决问题
咱们发现,选择标题时,不管标题的嵌套关系怎么变,总有一个标签不变,那就是包裹在最外层的,属性名为 class='ContentItem-title'
的 h2
标签。咱们若是能直接选择 h2
标签,不就能够完美匹配标题内容了吗?
逻辑上理清了关系,咱们如何用 Web Scraper 操做?这时咱们就能够用上一篇文章介绍的内容,利用键盘 P 键选择元素的父节点:

放在今天的课程里,咱们点击两次 P
键,就能够匹配到标题的父标签 h2
(或 h2.ContentItem-title
):

以此类推,由于答题人名字也出现了 null,咱们分析了 HTML 结构后选择名字的父标签 span.AuthorInfo-name
,具体的分析操做和上面差很少,你们能够尝试一下。

个人三个子内容的选择器以下,能够做为一个参考:

最后咱们点击 Scrape 爬取数据,检查一下结果,没有出现 null,完美!

5.吐槽时间
爬取知乎数据时,咱们会发现滚动加载数据那一起很快就作完了,在元素匹配那里却花了不少时间。
这间接的说明,知乎这个网站从代码角度上分析,写的仍是比较烂的。
若是你爬取的网站多了,就会发现大部分的网页结构都是比较「为所欲为」的。因此在正式抓取数据前,常常要先作小规模的尝试,好比说先抓取 20 条,看看数据有没有问题。没问题后再加大规模正式抓取,这样作必定程度上能够减小返工时间。
今天咱们讲讲如何抓取网页表格里的数据。首先咱们分析一下,网页里的经典表格是怎么构成的。

First Name
所在的行比较特殊,是一个表格的表头,表示信息分类
- 2-5 行是表格的主体,展现分类内容
经典表格就这些知识点,没了。下面咱们写个简单的表格 Web Scraper 爬虫。
1.制做 Sitemap
咱们今天的练手网站是
http://www.huochepiao.com/search/chaxun/result.asp?txtChuFa=�Ϻ�&txtDaoDa=����
爬虫的内容是抓取上海到北京的全部列车时刻表。
咱们先建立一个包含整个表格的 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
处理这种类型的网页,并经过断网的方法结束抓取。