原文链接
MemfireDB 邀请码:hm2tJQ
最近一亲戚咨询怎么填志愿把握大一些,让我想起了当年填志愿时的纠结~
当年分两派,有同学瞄准的是学校,有同学瞄准的是专业,当然还有牛b的一派同学两个都瞄准。
言归正传,这显然要做一定的数据分析的,作为程序员,碰到这类问题肯定知乎、Stack Overflow、Github一顿搜,
别说还真有:
https://github.com/haoruilee/python_spider
https://github.com/EasyData/gaokao
尝试跑了一下,效果不理想,难道要自己撸一个,感觉好麻烦,有兴趣的同学可以尝试一下。
这个过程中顺便发现已经有不少网站提供非常专业的高考数据服务了,尽管如此,还是想自己搞一下看看,恰好看到有大牛分享了一个工具,也尝试操作了一下,有点香,给大家分享一下。
写爬虫?这辈子不可能写爬虫的!juejin.cn
这个工具基本上不需要写代码,就能自己完成一次数据采集操作,下面是我用Dac从某网站上采集的北京大学在湖北省的录取分数的二手数据,只需要点两下鼠标就搞定了:
我们一步步来操作一下,感兴趣可以看看,不感兴趣直接看上面的原始分享,里面有很多技术方面的介绍。
这里给大家提个醒,工具只是用来方便大家获取信息的,只抓取自己需要的少量信息即可,尽量在目标网站不活跃的时间段执行,不要把别人服务器搞的压力太大,更加不能爬取非公开的信息尤其是个人信息。
从github上下载编译好的包(链接附在最后),有两个东东:
- 1) Chrome浏览器插件:dac-extension-v0.1.1.zip
- 2) 分析工具:dac-v0.1.1.zip
我们这里主要使用插件,感兴趣的可以玩一下分析工具。
准备工作
如果需要将抓取的数据长时间保存,方便后面查看分析,可以使用工具作者推荐的免费在线数据库:MemFireDB。注册之后,创建一个数据库,后面会用到,操作很简单这里就不细讲了。
安装插件
1)解压文件
插件安装比较简单,右键点击dac-extension-v0.1.1.zip,选择解压到dac-extension-v0.1.1
2)浏览器安装
在chrome浏览器地址栏输入:chrome://extensions , 会打开chrome的插件管理页面,激活右上角的开发者模式,此时会显示一行新的工具栏:
点击“加载已解压的扩展程序”按钮,然后选择刚刚解压出来的dac-extension-v0.1.1这个目录就ok了,此时点击地址栏左侧的“扩展程序”小图标,就会显示刚刚安装好的”Dac网页数据采集器”插件:
配置插件
紧接着上一步,我们点击“扩展程序”小图标之后,在列表中找到Dac插件,然后点击右侧的三个点的图标,然后点击“选项”:
正式抓数据之前,需要配置一下抓下来的数据的存放位置,这里可以使用原教程中推荐的免费在线数据库,注册之后点两下就可以用:MemFireDB
创建完数据库后,点击连接信息按钮可以看到访问数据库的方式:
复制相应的信息到插件的配置页面中,点击保存就完成了配置了,下面是Dac选项页面使用MemFireDB的配置方式:
ps:这里感觉可以加一个测试按钮,可以测试一下配置的是否正确,作者开源了工具的代码,有兴趣的可以去提个pr.
开抓数据
前面说了一堆,对于老手,应该三两下就搞定了,下面要开抓数据了。
1)打开你要抓数据的页面
我抓的是北京大学的数据:https://gkcx.eol.cn/school/31/provinceline
2)按F12,打开chrome的调试工具,最后面多了一个Dac Worker
这个图是我做好的抓取步骤,你打开应该是空白的,下面会一步步介绍怎么创建自己的数据采集器。
3)创建SiteMap
点击第三个菜单栏中的创建SiteMap菜单:(咦,还有一个导入按钮,去文末找彩蛋)
有两个框框需要输入,其中SiteMap名称可以随便输入,方便你自己区分多个采集器用的,我这里就用目标站点的域名;根URLs就是要抓取数据的第一个起始页面:
采集器会从这里的页面开始采集数据,可以配置多个页面。
如果页面有规律,可以用通配符来写,目前支持Numeric和Date两种通配符,例如:
这里的帮助提示应该是有个bug,Start和End之间应该是用中横线“-”而不是下划线“_”连接。
解释一下这个地址中通配符的含义:[30-100:1]
# 30-100表示让采集器自动采集
https://gkcx.eol.cn/school/30/provinceline
# 到
https://gkcx.eol.cn/school/100/provinceline
# 所有页面的数据
# 冒号后面的数字1,表示从30跳到下个页面的加数,这里就表示加1
4)选择器1:选择我们感兴趣的数据
上面我们创建了一个SiteMap,创建完成后会自动进入该SiteMap的编辑页面:
页面上的数据可能分布在不同的地方,需要通过不同的操作才能获取到数据,因此接下来的主要工作就是告诉采集器,第一步要做什么事,第二个做什么事,从而完成数据的采集,所有这些都是通过添加选择器来完成的。
那么就让我们从添加第一个选择器开始做起。
点击“添加新选择器”按钮,会弹出一个比较复杂的页面,第一次可能会比较懵,不要被复杂的页面吓到了,其实很简单,对于学校名称这个数据的抓取,我们只用关心前面三个项:ID、类型、选择器。
- ID:自己输入一个用来表示当前所选内容的字符串,比如这里我准备抓取学校名称信息,就写了一个school。
- 类型:对于绝大多数要抓取的数据,用默认的Text就好了,后面可以慢慢研究其他的类型。
- 选择器:这里是最重要的一步,也很简单,点击选择按钮,然后尝试把鼠标移动到最上面北京大学这四个大字上,会发现页面变的可以选择了,点击北京大学这个位置就好了,然后记得要点击“生成选择器!”按钮:
对于学校名称这个数据,这个框中的其他地方都不用填,直接拉到最下面,点击“保存选择器”按钮就ok了。
5)选择器2:复杂交互数据的抓取
我们真正感兴趣的当然是北京大学各个专业历年在本省份的录取分数线,如下图所示,这里有一个交互,就是需要手动点击年份,才能看到对应年份的数据:
不要小看这一点点的交互,可以把很多爬虫脚本拦在门外,Dac在这方面比较好高,仍旧只需要点两下鼠标就能搞定:
- 先创建一个选择器,该选择器的用途只有一个:点击年份这个地方,把年份菜单弹出来:
ID我们起名为year_control,类型选择倒数第二个:Element Click,这里需要注意的就是选择器和点击选择器,这两个都要进行点选,操作方法跟“选择器1”抓取学校名称的操作步骤一样,不同的是,这里需要对年份这个地方进行两次选择(选择器和点击选择器都选年份这个框),操作完之后是下面这个样子,如果不是这样,可能哪里忘记点了,请回头看看“选择器1”那一段的介绍。
- 再创建一个类型是Element Click的选择器,名字为year_click,从名字上就能看出来,这个选择器的功能是挨个点击弹出的所有年份(我们要抓取这些年份的数据),这个选择器有一定的技巧,因为无法通过工具提供的选择按钮来选择弹出菜单中的元素,我们只能手动找到这个元素的选择方法,如下图所示,在页面上先点击2020这个选择框会弹出一个年份列表,此时我们在任意一个年份上点击右键,在弹出的浏览器菜单中点击“检查”菜单项:
会在调试工具中显示出该菜单的详细HTML代码,我们看到2015到2019这些页面元素都有相同的class:ant-select-dropdown-menu-item
:
了解一点HTML、CSS知识的同学应该都知道,这个class就是HTML元素的选择器,我们就用这个作为点击选择器
手动填到Dac中:
聪明的你可能注意到了,要在class名字前面加一个点:.ant-select-dropdown-menu-item
这里还有一个注意事项,就是选择器
还没填,选择器要包含点击选择器,所以选择器这里我们用常规方式(选择器1中介绍的方式)选择包含整个页面的最大框就好了。
为了能让Dac依次选择多个年份,需要勾选“是否爬取多个匹配值”复选框。
- 上面两步创建的选择器只是辅助功能,让Dac帮你点击页面上的按钮,以切换到数据所在的页面,接下来就要实现真正的数据抓取选择器了。这里需要注意一下,我们希望每选择一个年份就去抓取该年份的对应数据,因此这个选择器需要做成year_click选择器的下一层选择器。如果跟year_click并排,Dac会先执行year_click选择器把所有的年份都点完一遍,再执行后面的选择器,显然是不行的。要想做一个year_click选择器的下一层选择器,操作很简单,直接点击year_click这个ID,就会进入下一层,进去之后就可以创建这一层的选择器了:
- 专业分数线这里很明显是个表格,Dac提供了抓取表格的选择器类型
点击“添加新选择器”按钮后,ID起名为data,然后类型选择为Table
然后点击选择按钮,点击分数线表格的左上角位置(专业名称左侧空白处),会发现整个表被选中,点击“生成选择器!”按钮,在点击保存,完事。
6)打完收工
上面一套下来,把原本一个非常复杂的程序编写工作用Dac插件模拟人工操作比较简便的就搞定了,第一次操作感觉好复杂,做完一轮之后,其实就是点两下鼠标,不信你试试。
相关资源
- 插件下载:https://github.com/wh0197m/dac
- 直接可以导入使用的采集器,将下面内容保存为一个.json后缀的文件,然后导入即可体验:
{"_id":"eol","startUrls":["https://gkcx.eol.cn/school/[30-100:1]/provinceline"],"selectors":[{