【干货】手把手带你抓“网上购物”类APP信息(含代码)

0?wx_fmt=jpeg


往期Python可视化回顾:

从零开始学Python【19】--matplotlib(树地图)

从零开始学Python【18】--matplotlib(热力图)

从零开始学Python【17】--matplotlib(面积图)

从零开始学Python【16】--matplotlib(雷达图)

从零开始学Python【15】--matplotlib(散点图)

从零开始学Python【14】--matplotlib(折线图)

从零开始学Python【13】--matplotlib(直方图)

从零开始学Python【12】--matplotlib(箱线图)

从零开始学Python【11】--matplotlib(饼图)

从零开始学Python【10】--matplotlib(条形图)

前言


       关于Python的可视化我们已经陆陆续续的出了10期,包括饼图、条形图、直方图、箱线图、散点图、折线图、面积图、雷达图、热力图和树地图。如果你跟着我的文章作了一一的学习之后,是不是想动动手来做一个可视化的综合项目呢?不错,如果想的的话,一定要坚持到底哦~

       如果你需要绘图的话,先实现这期的数据收集,即如何从豌豆荚的官网中抓取到“网上购物”类APP的所有信息,包括APP对应的下载人数、好评率、评价人数、安装包大小、所属公司等详细信息。关于这一部分的数据抓取,我们仍然使用爬虫利器Python来完成,对于每一个感兴趣的朋友,希望能够详细的安装流程走一遍,既有助于你对Python爬虫的认识,也有助于你知道爬虫的逻辑。


爬虫步骤


  • 爬下“ 网上购物”类APP下的5种子分类链接


0?wx_fmt=png

0?wx_fmt=png


       由上图可知,由于“ 网上购物”类APP主页下的全部APP只有42页,一共只有1008个APP,如果想获得更多APP的信息,可以将这个大类别拆分商城、团购、优惠、快递和全球导购5个子分类,发现每个子类别下又有42页(其实网站的数据只能到41页),这样不就可以获得更多APP信息了嘛~~所以,第一步需要做的上就是如何将5个子分类的链接获取到,然后基于子分类生成规律的url(即含page的url)。

# =========== Python3.X Jupyter ===========# =========== 步骤一、抓取每一个子分类的URL ===========# 导入第三方包import requestsfrom bs4 import BeautifulSoupimport numpy as npimport timeimport pandas as pd# 设置请求头headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'}# 豌豆荚应用首页 > 安卓软件分类 > 网上购物 > 商城下载的链接url = 'http://www.wandoujia.com/category/5017_591'# 发送请求res = requests.get(url, headers = headers).text# 解析HTMLsoup = BeautifulSoup(res, 'html.parser')# 商城类app的5个分类链接及名称category_urls = [i.findAll('a')[0]['href'] for i in soup.findAll('ul',{'class':'switch-tab cate-tab'})[0].findAll('li')[1:]]
category_names = [i.text.strip() for i in soup.findAll('ul',{'class':'switch-tab cate-tab'})[0].findAll('li')[1:]]
  • 生成规律的urls

       在某个子分类下,虽然都有42页,但你去点击第2页、第3页…时,就会发现这些子分类下的页数链接是存在规律的,即:

http://www.wandoujia.com/category/5017_591/1

http://www.wandoujia.com/category/5017_591/2

       上面就是“商城”类APP的前两页URL。所以只需要对每一个类别APP链接的url后跟上这些page数值,就可以得到所有子分类下的所有页数的链接。如果把每个分类下的40页所有APP都遍历的抓一次,会比较耗费时间,故这里就暂时针对每个分类的前10页APP数据进行遍历,生成如下的链接。

# =========== 步骤二、生成所有子分类及页码的URL ===========# 各类别app的前10页urlsnames = []
urls = []for url,name in zip(category_urls,category_names):    for i in range(1,11):
        names.append(name)
        urls.append(url+'/'+str(i))
  • 根据规律的url抓取出APP的名称及其超链接

       由于我们需要的详细信息,是通过点击每一个APP之后才能得到的,所以首先需要获得这些通过点击APP之后的超链接,而这些超链接正如下图所示,存放在HTML的h2标签下:

0?wx_fmt=png

0?wx_fmt=png

# =========== 步骤三、抓取子分类页下各APP对应的URL ===========# 根据每一页的url抓出app对应的链接app_urls = []for url in urls:
    res = requests.get(url, headers = headers).text
    soup = BeautifulSoup(res,'html.parser')        # 返回每个页面中app对应的链接
    # 为防止报错,这里做了异常处理
    try:
        app_lists = soup.findAll('ul',{'id':'j-tag-list'})[0]
        app_urls.extend([i.findAll('a')[0]['href'] for i in app_lists.findAll('h2',{'class':'app-title-h2'})])    except:        pass

       第二步的目的就是找到每一个APP背后的超链接是什么,故根据上面的代码,可以得到1204个APP对应的超链接。当点击子分类页下的APP后,就来到了APP的详情页,这些信息都规律的存放在一些标记底下,如APP名称在p标记下、APP分类在dl标记下等。那我们就可以这些监控出来的标记进行数据的抓取了:

0?wx_fmt=png

0?wx_fmt=png

# =========== 步骤四、爬虫抓取各APP的详细信息 ===========# 构建空的列表,用于数据的存储appname = []
appcategory = []
install = []
love = []
comments = []
size = []
update = []
version = []
platform = []
company = []for url in app_urls:
    res = requests.get(url, headers = headers).text
    soup = BeautifulSoup(res,'html.parser')    try:        # 通过标记抓取APP的信息
        appname.append(soup.find('p',{'class':'app-name'}).text.strip())
        appcategory.append('-'.join(soup.find('dl',{'class':'infos-list'}).findAll('dd')[1].text.strip().split('\n')))
        install.append(soup.find('span',{'class':'item install'}).find('i').text)
        love.append(soup.find('span',{'class':'item love'}).find('i').text)
        comments.append(soup.find('div',{'class':'comment-area'}).find('i').text)
        size.append(soup.find('dl',{'class':'infos-list'}).findAll('dd')[0].text.strip())
        update.append(soup.find('dl',{'class':'infos-list'}).findAll('dd')[3].text.strip())
        version.append(soup.find('dl',{'class':'infos-list'}).findAll('dd')[4].text.strip())
        platform.append(soup.find('dl',{'class':'infos-list'}).findAll('dd')[5].text.strip().split('\n')[0])
        company.append(soup.find('dl',{'class':'infos-list'}).findAll('dd')[6].text.strip())        except:        pass
  • 根据以上的url抓取出APP的详细信息

       上面的一段代码会耗费一些时间,会根据不同的电脑有所差异,我的电脑跑了约20分钟。虽然等待了一些时间,但当结果正常的存储后,心里还是有一些兴奋的。接下来就是要将这些列表的存储结果输出到本地的Excel表格中,这样便于后期的分析使用。

# =========== 步骤五、数据存储 ===========# 将存储的列表值写入到字典,并进行数据框的转换apps = pd.DataFrame({'appname':appname,'appcategory':appcategory,                     'install':install,'love':love,'comments':comments,'size':size,                     'update':update,'version':version,'platform':platform,'company':company})                     # 数据导出apps.to_excel('apps.xlsx', index = False)

       回到你Python的工作空间,打开apps的Excel文件,如果上面你的运行没有任何问题的话,存储的数据将会是如下的结果:

0?wx_fmt=png

结语


       OK,这期关于豌豆荚APP应用的爬虫案例就讲到这里,下一期我们将基于这个数据进行数据的可视化分析。如果你有问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让跟多的人学习和操作。最后,本文相关的Python脚本和PDF版本已存放到百度云盘,可以通过下面的链接获取:

链接: https://pan.baidu.com/s/1geDRddT 密码: cud2


关注“每天进步一点点2015”,小编陪你一起学习~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sim1480

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值