之前我们利用了 Scrapy 爬取并剖析了酷安网 6000+ App,为什么这篇文章又在讲抓 App 呢?
由于我喜好折腾 App,哈哈。当然,紧张是由于下面这几点:
第一、之前抓取的网页很大略
在抓取酷安网时,我们利用 for 循环,遍历了几百页就完成了所有内容的抓取,非常大略,但现实每每不会这么 easy,有时我们要抓的内容会比较弘大,比如抓取全体网站的数据,为了增强爬虫技能,以是本文选择了「豌豆荚」这个网站。
目标是: 爬取该网站所有分类下的 App 信息并下载 App 图标,数量在70,000旁边,比酷安升了一个数量级。
第二、再次练习利用强大的 Scrapy 框架
之前只是初步地利用了 Scrapy 进行抓取,还没有充分领会到 Scrapy 有多么牛逼,以是本文考试测验深入利用 Scrapy,增加随机 UserAgent、代理 IP 和图片下载等设置。
第三、比拟一下酷安和豌豆荚两个网站
相信很多人都在利用豌豆荚下载 App,我则利用酷安较多,以是也想比较一下这两个网站的 App 特点。
话不多说,下面开始抓取流程。
1. 剖析目标
首先,我们先来理解一下要抓取的豌豆荚网页是什么样的,可以看到该网站上的 App 分成了很多类,包括:「运用播放」、「系统工具」等,一共有 14 个大种别,每个大类下又细分了多个小类,例如,影音播放下包括:「视频」、「直播」等。
点击「视频」进入第二级子类页面,可以看到每款 App 的部分信息,包括:图标、名称、安装数量、体积、评论等。
接着,我们可以再进入第三级页面,也便是每款 App 的详情页,可以看到多了下载数、好评率、评论数这几样参数,抓取思路和第二级页面大同小异,同时为了减小网站压力,以是 App 详情页就不抓取了。
以是,这是一个分类多级页面的抓取问题,依次抓取每一个大类下的全部子类数据。
学会了这种抓取思路,很多网站我们都可以去抓,比如很多人爱爬的「豆瓣电影」也是这样的构造。
2. 剖析内容
数据抓取完成后,本文紧张是对分类型数据的进行大略的探索性剖析,包括这么几个方面:
下载量最多 / 最少的 App 总排名;下载量最多 / 最少的 App 分类 / 子分类排名;App 下载量区间分布;App 名称重名的有多少;和酷安 App 进行比拟。3. 剖析工具 PythonScrapyMongoDBPyechartsMatplotlib二、数据抓取1. 网站剖析我们刚才已经初步对网站进行了剖析,大致思路可以分为两步,首先是提取所有子类的 URL 链接,然后分别抓取每个 URL 下的 App 信息就行了。
可以看到,子类的 URL 是由两个数字构成,前面的数字表示分类编号,后面的数字表示子分类编号,得到了这两个编号,就可以抓取该分类下的所有 App 信息,那么怎么获取这两个数值代码呢?
回到分类页面,定位查看信息,可以看到分类信息都包裹在每个 li 节点中,子分类 URL 则又在子节点 a 的 href 属性中,大分类一共有 14 个,子分类一共有 88 个。
到这儿,思路就很清晰了,我们可以用 CSS 提取出全部子分类的 URL,然后分别抓取所需信息即可。
其余还需把稳一点,该网站的 首页信息是静态加载的,从第 2 页开始是采取了 Ajax 动态加载,URL 不同,须要分别进行解析提取。
2. Scrapy抓取
我们要爬取两部分内容,一是 APP 的数据信息,包括前面所说的:名称、安装数量、体积、评论等;二是下载每款 App 的图标,分文件夹进行存放。
由于该网站有一定的反爬方法,以是我们须要添加随机 UA 和代理 IP,关于这两个知识点,我此前单独写了两篇文章进行铺垫,传送门:
这里随机 UA 利用 scrapy-fake-useragent 库,一行代码就能搞定,代理 IP 直接上阿布云付费代理,几块钱搞定大略省事。
下面,就直接上代码了:
(1)items.py
(2)middles.py
中间件紧张用于设置代理 IP。
(3).py
该文件用于存储数据到 MongoDB 和下载图标到分类文件夹中。
存储到 MongoDB:
按文件夹下载图标:
(4)settings.py
(5)wandou.py
主程序这里列出关键的部分:
这里,首先定义几个 URL,包括:分类页面、子分类首页、子分类 AJAX 页,也便是第 2 页开始的 URL,然后又定义了一个类 Get_category 专门用于提取全部的子分类 URL,稍后我们将展开该类的代码。
程序从 start_requests 开始运行,解析首页得到相应,调用 get_category 方法,然后利用 Get_category 类中的 parse_category 方法提取出所有 URL,详细代码如下:
这里,除了分类名称 cate_name 可以很方便地直接提取出来,分类编码和子分类的子分类的名称和编码,我们利用了 get_category_code 等三个方法进行提取。提取方法利用了 CSS 和正则表达式,比较大略。
终极提取的分类名称和编码结果如下,利用这些编码,我们就可以布局 URL 要求开始提取每个子分类下的 App 信息了。
接着前面的 get_category 连续往下写,提取 App 的信息:
这里,依次提取出全部的分类名称和编码,用于布局要求的 URL。由于首页的 URL 和第 2 页开始的 URL 形式不同,以是利用了 if 语句分别进行布局。接下来,要求该 URL 然后调用 self.parse 方法进行解析,这里利用了 meta 参数用于通报干系参数。
末了,parse 方法用来解析提取终极我们须要的 App 名称、安装量等信息,解析完成一页后,page 进行递增,然后重复调用 parse 方法循环解析,直到解析完备部分类的末了一页。
终极,几个小时后,我们就可以完玉成体 App 信息的抓取,我这里得到 73,755 条信息和 72,150 个图标,两个数值不一样是由于有些 App 只有信息没有图标。
图标下载:
下面将对提取的信息,进行的数据剖析。
三、数据剖析1. 总体情形
首先来看一下 App 的安装量情形,毕竟 70000 多款 App,自然很感兴趣 哪些 App 利用地最多,哪些又利用地最少。
代码实现如下:
看了上图,有两个「没想到」:
排名第一的居然是一款手机管理软件对豌豆荚网上的这个第一名感到意外,一是,好奇大家都那么爱手机清理或者怕中毒么?毕竟,我自己的手机都「裸奔」了好些年;二是,第一名居然不是鹅厂的其他产品,比入「微信」或者「QQ」。榜单放眼望去,以为会涌现的没有涌现,没有想到的却涌现了前十名中,居然涌现了书旗小说、印客这些比较少听过的名字,而国民 App 微信、支付宝等,乃至都没有涌如今这个榜单中。带着疑问和好奇,分别找到了「腾讯手机管家」和「微信」两款 App 的主页:
腾讯手机管家下载和安装量:
微信下载和安装量:
这是什么情形?
腾讯管家 3 亿多的下载量等同于安装量,而微信 20 多亿的下载量,只有区区一千多万的安装量,两组数据比拟,大致反响了两个问题:
要么是腾讯管家的下载量实际并没有那么多?要么是微信的下载量写少了?不管是哪个问题,都反响了一个问题:该网站做得不足走心啊。
为了证明这个不雅观点,将前十名的安装量和下载量都作了比拟,创造很多 App 的安装量都和下载量是一样的,也便是说:这些 App 的实际下载量并没有那么多,而如果这样的话,那么这份榜单就有很大水分了。
难道,辛辛劳苦爬了那么久,就得到这样的结果?
不去世心,接着再看看安装量最少的 App 是什么情形,这里找出了个中最少的 10 款:
扫了一眼,更加没想到了:「QQ 音乐」竟然是倒数第一,竟然只有 3 次安装量!
确定这和刚刚上市、市值千亿的 QQ 音乐是同一款产品?
再次核实了一下:
没有看错,是写着 3人安装!
这是已经不走心到什么程度了? 这个安装量,鹅厂还能「存心做好音乐」?
说实话,到这儿已经不想再往下剖析下去了,担心爬扒出更多没想到的东西,不过辛劳爬了这么久,还是再往下看看吧。
看了首尾,我们再看看整体,理解一下全部 App 的安装数量分布,这里去除了有很大水分的前十名 App。
很惊异地创造,竟然有 多达 67,195 款,占总数的 94% 的 App 的安装量不敷 1万!
如果这个网站的所有数据都是真的话,那么上面排名第一的手机管家,它 一款就差不多抵得上这 6 万多款 App 的安装量了!
对付多数 App 开拓者,只能说:现实很残酷,辛劳开拓出来的 App,用户不超过 1万人的可能性高达近 95% 。
代码实现如下:
2. 分类情形
下面,我们来看看各分类下 App 情形,不再看安装量,而看数量,以排出滋扰。
可以看到 14 个大分类中,每个分类的 App 数量差距都不大,数量最多的「生活休闲」是「拍照图像」的两倍多一点。
接着,我们进一步看看 88 个子分类的 App 数量情形,筛选出数量最多和最少的 10 个子类:
可以创造两点故意思的征象:
「收音机」种别 App 数量最多,达到 1,300 多款这个很意外,当下收音机完备可以说是个老古董了,居然还有那么人去开拓。App 子类数量差距较大最多的「收音机」是最少的「动态壁纸」近 20 倍,如果我是一个 App 开拓者,那我更乐意去考试测验开拓些小众类的 App,竞争小一点,比如:「背单词」、「小儿百科」这些。看完了总体和分类情形,溘然想到一个问题:这么多 App,有没有重名的呢?
惊奇地创造,叫「一键锁屏」的 App 多达 40 款,这个功能 App 很难再想出别的名字了么?现在很多手机都支持触控锁屏了,比一键锁屏操作更加方便。
接下来,我们大略比拟下豌豆荚和酷安两个网站的 App 情形。
3. 比拟酷安
二者最直不雅观的一个差异是在 App 数量上,豌豆荚拥有绝对的上风,达到了酷安的十倍之多,那么我们自然感兴趣:豌豆荚是否包括了酷安上所有的 App ?
如果是,「你有的我都有,你没有的我也有」,那么酷安就没什么上风了。统计之后,创造豌豆荚 仅包括了 3,018 款,也便是一半旁边,剩下的另一半则没有包括。
这里面固然存在两个平台上 App 名称不一致的征象,但更有情由相信酷安很多小众的佳构 App 是独占的,豌豆荚并没有。
代码实现如下:
接下来,我们看看所包含的 App 当中,在两个平台上的下载量是怎么样的:
可以看到,两个平台上 App 下载数量差距还是很明显。
末了,我面再看看豌豆荚上没有包括哪些APP:
可以看到很多神器都没有包括,比如:RE、绿色守护、一个木函等等。豌豆荚和酷安的比拟就到这里,如果用一句话来总结,我可能会说:豌豆荚太牛逼了, App 数量是酷安的十倍,以是我选酷安。
以上,便是利用 Scrapy 爬取分类多级页面的抓取和剖析的一次实战。
作者:高等农人工,公众号:第2大脑
本文由 @高等农人工 原创发布于大家都是产品经理。未经容许,禁止转载
题图来自Unsplash,基于CC0协议