客至汲泉烹茶, 抚琴听者知音

0基础使用webscraper爬取数据

区块链第二部分大概是要永远鸽掉了……原作者写得过于简略(我看不懂了),而且原作者用的python版本是2.7,尽管大部分报错我都已经修正了,但是还是无法输出正确结果。打算以后有时间找找别人的教程学一下,接下来还是以神经网络为主。不过一周两篇的目标是不能不完成的,所以写一篇其他类型的文章。

webscraper是一款chrome插件,通过模拟人操作浏览器的行为来抓取数据,入门门槛低,简单爬一些数据还是非常舒服的。

入门

首先你要有一个Chrome浏览器(理论上支持Chrome插件的浏览器应该都可以,不过我没试过),然后下载webscraper插件(需要科学上网)。

webscraper下载地址

打开你的Chrome,按下F12(即开发者工具),你就会发现选项卡上多了一个Web Scraper,不过如果开发者工具控制台在左边或右边,它是不能正常显示的,必须要放到下边。如图所示,就按照它的提示点击右上角的三个竖点,再切换显示模式就可以啦。

现在能正常显示了,先分别介绍一下这些菜单都什么意思

  • Sitemaps可以理解为爬虫项目汇总,在这里列出了所有你所创建的项目。
  • Create new sitemap是创建一个新爬虫项目,这个待会再详细说。
  • Sitemap是只有点开了某个具体项目才能使用的,比如我们进入comic项目。Selectors就是当前页面,也就是各个选择器的列表。Selectors graph就是把这个项目所有选择器的层次按树形图表示出来。Edit metadata可以编辑项目的初始设置(id和url),Scrape就是运行该项目,Browse可以在浏览器中显示已经爬取的结果。Export Sitemap就是把这个项目导出为json格式,方便别人导入你的爬虫项目。Export data as CSV就是把你爬取的数据导出为CSV格式。

光介绍是没用的,必须实战才能掌握。我们以我的博客为例,看下如何用webscraper。

爬取雁陎的自耕地

网站入口

假如我们想要爬取雁陎所创作的所有文章,该怎么做呢?

首先要打开网站,获取首页及之后各页的标题超链接,然后进入超链接(也就是文章详情页),最后抓取正文。

带着这个思路,开始写我们的操作。

点开Create new sitemap下的Creat Sitemap

Sitemap name可以随便填,但是不能和已有项目名重复,相当于一个id的作用吧,注意必须不能填中文,这里填yanshu就好了。Start URL就是爬虫的入口,在这个项目里入口就是https://www.sitstars.com/,webscraper会从这个url开始爬虫。

但是光填首页的url是不够的,因为我们还想爬后面的文章。那么我们回到网站,点击第二页,地址栏变为https://www.sitstars.com/page/2/,这下我们就知道这个博客的页码变动规律了。web scraper 中提供了一种写法,可以设置页码范围及递增步长。写法是这样的: 开始值-结束值[:步长],比如我们这个项目就是https://www.sitstars.com/page/[1-7]

有些网站的步长可能不是1,比如豆瓣小组,https://www.douban.com/group/juzimi/discussion,第二页就会多个参数?start=25,后面依次递增。那么这时候要爬取前10页,要这样写https://www.douban.com/group/juzimi/discussion?start=[1-250:25]

填入这两个信息后,点击Creat Sitemap,跳转到“代码编写页面”

列表页

这一块最重要的概念就是Selector,字面意思是选择器,一个页面上的任何元素,文本、超链接、div……都可以是选择器。爬虫,就是一个逐步筛选选择器的过程。

点击Add new selector创建我们第一个选择器。

先介绍一下各个选项的含义:

  • id随便填,它只是起到一个标识的作用。
  • Type就是选择器的类型。常用的就这几个:

    • TXT,文本
    • Link,超链接
    • Image,图片
    • Element,元素
    • Element scroll down,获取元素后向下滚动,对于ajax页面特别有效
    • Element click,获取元素后点击,适用于评论展开等情况
  • Selector,即你所选取的选择器。其中select可以选中页面元素,自动显示选择器,Element preview就是预览你所选中的选择器,Data preview预览选择器所包含的数据。
  • Multiple,勾选之后可以批量选中选择器。
  • Regex,即正则表达式,一般没必要填
  • Parent Selector,即该选择器的父选择器是哪个。

为了方便我们输入xpath,可以打开目标网站对照着写。

idarticleTypelink,然后选中select,你就会发现鼠标移到页面上任何超链接上都会变绿,这是可以选中的信号。

选中后,绿色区域变为粉红,同时控制台上面的框里会显示选中元素的xpath

仅仅选中一个超链接是不够的,所以勾选上Multiple,同时尝试点下一篇文章标题

你会发现下面所有文章的超链接都变红了,也就是说这个xpath,.m-t-none a代表了我们所需要的所有链接。此刻可以点Done selecting!,它会把这个xpath填入右边的框中,如果你可以通过其他方式获得xpath,可以直接手动填,不需要select

接下来点击Save selector,第一个选择器就完成啦。

你也可以验证一下这种写法是否正确,点击Data preview,如果显示下图说明数据能正常获取:

详情页

先点进去我们之前创建的article,在这里添加的selector会自动以articleparent selector,而且这里的selector会在article的结果基础之上进行选取,也就是说相当于实现了超链接跳转功能

和上一节类似,为了方便写xpath,你可以直接点进去某一篇文章,参照着写。假设我们想要获得作者、发表时间、字数、正文这几项数据,以作者为例,你可以这样写

一切都完成后,你可以测试了。点击sitemap yanshu下的Scrape,进入到时间设置界面。

字面意思,一个是请求间隔时间,一个是页面等待时间(如果页面不响应最多等待多久),这里我们就直接Start scraping

会自动跳出一个Chrome窗口,然后进行翻页、跳转……就和我们平时浏览网页一样。等待期间,你也可以点击Browse,看一下数据爬取情况。

下面还有很多,但是我的屏幕放不下了。

看,是不是挺简单的?

爬取虎嗅网

虎嗅网和雁陎的自耕地,区别主要在于后者是分页模式,前者是ajax请求加载模式(即往下拉的时候自动显示最新文章),那么这种网站该怎么爬呢?

对,你一定想到了我们之前介绍过的Element scroll down模式,试一试?

别忘了勾选Multiple

测试一下:

可以看到它能自动向下滚动。接下来就简单了,按照上一章的流程再走一遍就行。

福利

作为一个死宅,二次元这块必须拿下!所以我为大家提供了一个爬取漫猫动漫某几季度所有番剧种子的相关代码

{"_id":"comic2","startUrl":["http://www.comicat.org/addon.php?r=bangumi/table&bgm_id=2018q[1-4]"],"selectors":[{"id":"seaon","type":"SelectorText","parentSelectors":["_root"],"selector":".title span.left","multiple":false,"regex":"","delay":0},{"id":"jump","type":"SelectorLink","parentSelectors":["_root"],"selector":"dd a","multiple":true,"delay":0},{"id":"daxiao","type":"SelectorElementClick","parentSelectors":["jump"],"selector":"div.box:nth-of-type(2)","multiple":false,"delay":"0","clickElementSelector":"th.l4","clickType":"clickOnce","discardInitialElements":"do-not-discard","clickElementUniquenessType":"uniqueHTML"},{"id":"firstbig","type":"SelectorLink","parentSelectors":["jump"],"selector":"tr:nth-of-type(1) a[target]","multiple":false,"delay":0},{"id":"cili","type":"SelectorLink","parentSelectors":["firstbig"],"selector":"a#magnet","multiple":false,"delay":0},{"id":"detail","type":"SelectorText","parentSelectors":["firstbig"],"selector":"span.right.text_normal","multiple":false,"regex":"","delay":0}]}

食用方法

点击Creat new sitemap中的import Sitemap,把上面的代码复制到Sitemap JSON中,再点一下下面的Import Sitemap即可导入。

接着进入comic这个项目,点击Edit metadata

修改起始页,主要是id=之后的内容,其中2018代表2018年的番,q[1-4]代表第1到第4季度的番。

注意

第一次使用漫猫,需要开启虫洞,就是在这个链接里,拉到最下面点击启用即可。不然的话你是看不到任何磁力链的!

另外博主有收藏癖,而且越高清越大的资源越受博主喜欢,所以这个脚本爬下来的都是包含资源最大的磁力链。介意的话可以自行修改,把选择器cilidetail的父选择器改为jump,然后删掉fistbig选择器即可。

问题

1、有时候我们想选择某个链接,但是鼠标点击就出触发页面跳转,如何处理?

在我们选择页面元素的时候,勾选xpath框旁边的符合选择框,然后鼠标滑到要选择的元素上,按下 S 键。

按 S 就是选择当前元素,按 P 就是选择当前元素的父元素,按 C 就是选择当前元素的子元素,当前元素指的是鼠标所在的元素。

2、抓取的数据顺序和网页上的顺序不一致?

这是程序本身的缺陷,没办法解决,只能导出CSV之后手动排序了。

添加新评论