摘要:使用 Scrapy 爬取豌豆荚全网 70,000+ App,并进行探索性分析。
写在前面:若对数据抓取部分不感兴趣,可以直接下拉到数据分析部分。
1 分析背景
之前我们使用了 Scrapy 爬取并分析了酷安网 6000+ App,为什么这篇文章又在讲抓 App 呢?
因为我喜欢折腾 App,哈哈。当然,主要是因为下面这几点:
第一、之前抓取的网页很简单
在抓取酷安网时,我们使用 for 循环,遍历了几百页就完成了所有内容的抓取,非常简单,但现实往往不会这么 easy,有时我们要抓的内容会比较庞大,比如抓取整个网站的数据,为了增强爬虫技能,所以本文选择了「豌豆荚」这个网站。
目标是: 爬取该网站所有分类下的 App 信息并下载 App 图标,数量在 70,000 左右,比酷安升了一个数量级。
第二、再次练习使用强大的 Scrapy 框架
之前只是初步地使用了 Scrapy 进行抓取,还没有充分领会到 Scrapy 有多么牛逼,所以本文尝试深入使用 Scrapy,增加随机 UserAgent、代理 IP 和图片下载等设置。
第三、对比一下酷安和豌豆荚两个网站
相信很多人都在使用豌豆荚下载 App,我则使用酷安较多,所以也想比较一下这两个网站有什么异同点。
话不多说,下面开始抓取流程。
▌分析目标
首先,我们来了解一下要抓取的目标网页是什么样的。
可以看到该网站上的 App 分成了很多类,包括:「应用播放」、「系统工具」等,一共有 14 个大类别,每个大类下又细分了多个小类,例如,影音播放下包括:「视频」、「直播」等。
点击「视频」进入第二级子类页面,可以看到每款 App 的部分信息,包括:图标、名称、安装数量、体积、评论等。
接着,我们可以再进入第三级页面,也就是每款 App 的详情页,可以看到多了下载数、好评率、评论数这几样参数,抓取思路和第二级页面大同小异,同时为了减小网站压力,所以 App 详情页就不抓取了。
所以,这是一个分类多级页面的抓取问题,依次抓取每一个大类下的全部子类数据。
学会了这种抓取思路,很多网站我们都可以去抓,比如很多人爱爬的「豆瓣电影」也是这样的结构。
▌分析内容
数据抓取完成后,本文主要是对分类型数据的进行简单的探索性分析,包括这么几个方面:
-
下载量最多 / 最少的 App 总排名
-
下载量最多 / 最少的 App 分类 / 子分类排名
-
App 下载量区间分布
-
App 名称重名的有多少
-
和酷安 App 进行对比
▌分析工具
-
Python
-
Scrapy
-
MongoDB
-
Pyecharts
-
Matplotlib
2 数据抓取
▌网站分析
我们刚才已经初步对网站进行了分析,大致思路可以分为两步,首先是提取所有子类的 URL 链接,然后分别抓取每个 URL 下的 App 信息就行了。
可以看到,子类的 URL 是由两个数字构成,前面的数字表示分类编号,后面的数字表示子分类编号,得到了这两个编号,就可以抓取该分类下的所有 App 信息,那么怎么获取这两个数值代码呢?
回到分类页面,定位查看信息,可以看到分类信息都包裹在每个 li 节点中,子分类 URL 则又在子节点 a 的 href 属性中,大分类一共有 14 个,子分类一共有 88 个。
到这儿,思路就很清晰了,我们可以用 CSS 提取出全部子分类的 URL,然后分别抓取所需信息即可。
另外还需注意一点,该网站的 首页信息是静态加载的,从第 2 页开始是采用了 Ajax 动态加载,URL 不同,需要分别进行解析提取。
▌Scrapy抓取
我们要爬取两部分内容,一是 APP 的数据信息,包括前面所说的:名称、安装数量、体积、评论等,二是下载每款 App 的图标,分文件夹进行存放。
由于该网站有一定的反爬措施,所以我们需要添加随机 UA 和代理 IP
这里随机 UA 使用 **scrapy-fake-useragent **库,一行代码就能搞定,代理 IP 直接上阿布云付费代理,几块钱搞定简单省事。
下面,就直接上代码了。
items.py
1import scrapy 2 3class WandoujiaItem(scrapy.Item): 4 cate_name = scrapy.Field() #分类名 5 child_cate_name = scrapy.Field() #分类编号 6 app_name = scrapy.Field() # 子分类名 7 install = scrapy.Field() # 子分类编号 8 volume = scrapy.Field() # 体积 9 comment = scrapy.Field() # 评论10 icon_url = scrapy.Field() # 图标url
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
middles.py
中间件主要用于设置代理 IP。
1import base64 2proxyServer = "http://http-dyn.abuyun.com:9020" 3proxyUser = "你的信息" 4proxyPass = "你的信息" 5 6proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii