酷安

最近app用荒了,想要看看有些哪些好玩的app可以安装下来玩玩,酷安就是安卓应用的聚集地

网页内容

模块

  • import requests--网页请求
  • import time--延时
  • import traceback--输出异常
  • from multiprocessing import Pool--多进程
  • from lxml import etree--解析数据
  • from pymysql import connect--数据库连接
  • from pymysql import cursors--数据库游标
  • from PIL import Image--图像读取
  • import wordcloud as wc--词云
  • import numpy as np--图像转换
  • import jieba--分词
  • from pyecharts import Line--折线图
  • from pyecharts import Overlap--图形整合
  • from pyecharts import Bar--柱状图
  • 网页结构分析

来到酷安应用的网页,一如既往的打开chrome的开发者工具,对网页请求进行分析,右键->检查->netword->xhr->刷新,看看数据是不是异步加载的,结果发现并不是,刷新并不能看到什么东西。

既然不是异步加载的情况,转而研究网页的源代码,看网页源代码里面有没有我们想要的数据,有没有什么字体加密的过程等,右键->查看网页源代码->搜索网易云音乐,就出现结果,而且数据并没有出现乱码,很可能请求该网页,后台直接发过来了,减少了我们很多的麻烦,直接进行网页抓取,然后提取数据,清洗数据即可。

xpath提取

这里主要是利用xpath来提取数据,通过快速定位,然后对数据进行提取,或者目标元素的文本,超链接等,很多时候我们自己写的xpath表达式比较容易出错,提取不了想要的数据,但是我们可以借助浏览器给我们提供的xpath表达式的提取,可以不用自己写了,

右键->检查->选择浏览器里面的小图标(选择元素)->出现相应的网页代码->右键->copy->copy xpath.

数据提取

利用浏览器获取相应的xpath表达式之后,我们就可以进行提取数据、清洗数据和存储数据了,下一步还得进行总页面的提取,方便我们去构造url

网页获取

def get_html(url):time.sleep(2)# 请求头设置headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}try:resp=requests.get(url,headers=headers)if resp.status_code==200:return resp.textexcept Exception:print("获取网页失败,",Exception)return None

总页数的提取
由于要抓取酷安提供的全部app的信息,所以需要提取app总的页面(需要提取列表的a标签的href即可),方便进行url的构建,以及多进程的实现。

#    获取最后一页
def get_last_page(content):if content:html = etree.HTML(content)href = html.xpath('/html/body/div/div[2]/div[2]/div[3]/div[2]/ul/li[9]/a/@href')page = str(href).split("=")[1].split("'")return page[0]else:return None

app的具体信息

主要提取酷安应用页面的app列表信息和点进每个app里面的分类标签和评分个数

def parse_html(detail):if(detail==None):print("不可用--detail")return Nonehtml = etree.HTML(detail)root = html.xpath('/html/body/div/div[2]/div[2]/div[3]/a')for children in root:# app名字name = children.xpath('./div/div/div/p[1]/text()')[0]grade_size = children.xpath('./div/div/div/p[2]/text()')temp = grade_size[0].split(' ')# app评分grade = temp[0][:-1]# 下载次数downlaod_count = children.xpath('./div/div/div/p[2]/span/text()')[0].split(" ")[0].split("次")[0]#    数据清洗‘万’转化为数字if '万' in  downlaod_count:downlaod_count = float(downlaod_count.split('万')[0])*10000yield{'name':name,'grade':grade,'download_count':downlaod_count,'href':children.xpath('./@href')}

获取app的分类标签和评分人数
在分类标签和评分人数的xpath提取的时候,会发现xpath的表达式会出现不一样的,这是有些app详细的页面上面存在“酷安点评”这部分,而有的不存在这部分,而且还有就是,有些app详细页面上不存在“新版特性”这部分,所以造就我们在提取xpath表达式的时候,要分类提取出来。

  • 没有"酷安点评的xpath"
  • 没有"新版特性"的xpath
  • 没有"分类标签"的xpath(不存在的情况直接为空好了)
def get_detail(app_detail):html = etree.HTML(app_detail)comment = html.xpath('/html/body/div/div[2]/div[2]/div[2]/div/div[4]/div/div[1]/p/text()')#  对获取的节点进行判断if len(comment) == 0:comment= html.xpath('/html/body/div/div[2]/div[2]/div[2]/div/div[5]/div/div[1]/p/text()')if len(comment) == 0:comment= html.xpath('/html/body/div/div[2]/div[2]/div[2]/div/div[3]/div/div[1]/p/text()')#   对获取的节点进行判断tags = html.xpath('/html/body/div/div[2]/div[2]/div[2]/div/div[5]/p[2]/a/@href')if len(tags) == 0:tags = html.xpath('/html/body/div/div[2]/div[2]/div[2]/div/div[6]/p[2]/a/@href')if len(tags) == 0:tags = html.xpath('/html/body/div/div[2]/div[2]/div[2]/div/div[4]/p[2]/a/@href')comment_count = comment[0].split('个')[0][1:]if '万' in comment_count:comment_count = float(comment_count.split('万')[0])*10000return comment_count,"".join(tag.split('/')[-1]+"/" for tag in tags)

数据存储

把抓取的数据存储到MySQL数据库中去,再从数据库中提取相关的数据进行分析

数据库和表的创建

def create_database_table():data_base = 'app_db'base_sql = "create database if not exists "+data_basetable_sql = '''CREATE TABLE IF NOT EXISTS `app_table` (`id` INT(11) NOT NULL AUTO_INCREMENT,`name` VARCHAR(100) COLLATE utf8_bin NOT NULL,`grade` DECIMAL(2,1) NOT NULL,`grade_count` VARCHAR(50) NOT NULL,`download_count` VARCHAR(50) NOT NULL,`tag` VARCHAR(400) COLLATE utf8_bin NOT NULL,`href` VARCHAR(300) COLLATE utf8_bin NOT NULL,PRIMARY KEY (`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_binAUTO_INCREMENT=1'''# 连接数据库con  = connect(host="localhost",user="root",password="root",charset="utf8mb4")try:#   创建游标cur = con.cursor()#    创建数据库app_dbcur.execute(base_sql)#   选择数据库con.select_db(data_base)#  创建表cur.execute(table_sql)#  提交事务con.commit()print("创建数据库和表成功啦!")except Exception:print("创建数据库或者表出错啦!",traceback.print_exc())# 回滚事务con.rollback()finally:cur.close()con.close()

数据的插入

def insert_to_table(msg_dict):con = connect(host="localhost",user="root",password="root",db="app_db",charset="utf8mb4")# python默认插入的字符串类型,字段都是字符串类型sql = "insert into `app_table` (`name`,`grade`,`grade_count`,`download_count`,`tag`,`href`) values(%s,%s,%s,%s,%s,%s)"try:#   创建游标cur = con.cursor()#    执行sql语句cur.execute(sql,(msg_dict['name'],msg_dict['grade'],msg_dict['grade_count'],msg_dict['download_count'],msg_dict['tag'],msg_dict['href']))#   提交事务con.commit()print('插入成功,%s'%msg_dict['name'])except Exception:print("插入数据失败,",traceback.print_exc())finally:cur.close()con.close()

抓取数据的程序入口

def main(offset):content=get_html('https://www.coolapk.com/apk?p='+str(offset))details = parse_html(content)for detail in details:#    `name`,`grade`,`grade_count`,`tag`,`download_count`,`href`content = get_html('https://www.coolapk.com'+detail['href'][0])grade_tage = get_detail(content)app_msg = {"name":detail['name'],"grade":detail['grade'],"grade_count":grade_tage[0],"download_count":detail['download_count'],"tag":grade_tage[1],"href":detail['href'][0]}#  print(app_msg)insert_to_table(app_msg)print("完成时间,%s"%time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time())))if __name__ == '__main__':create_database_table()content = get_html("https://www.coolapk.com/apk/")last_page = get_last_page(content)# 创建进程池pool=Pool()offset=([x for x in range(1,int(last_page)+1)])# 第一个参数是函数,第二个参数是一个迭代器pool.map(main,offset)# 关闭进程池pool.close()pool.join()

数据分析

利用pyecharts库进行数据的绘画,对数据进行分析。

数据查询

从数据库中获取相关的数据

def get_data(sql):con = connect(host="localhost",user="root",password="root",db="app_db",charset="utf8mb4")try:cur = con.cursor()cur.execute(sql)result = cur.fetchall()#   print(result)return resultexcept Exception:print("连接数据库出错",traceback.print_exc())finally:cur.close()con.close()

词云生成

#   词云生成
def draw_tag_wordcloud():sql = "select tag from app_table"datas = get_data(sql)tags = []if len(datas) > 0:for data in datas:if len(data) == 0:continueelse:res = data[0].split('/')for r in res:tags.append(r)else:print('没有获取到数据')return#   设置停用词stop_word = ['小编推荐','装机必备']android = np.array(Image.open('Android.png'))res = wc.WordCloud(font_path='‪C:/Windows/Fonts/SIMYOU.TTF',background_color='white',max_words=2000,max_font_size=120,mask=android,random_state=40,stopwords=stop_word)#   ---------------------记住拼接字符串需要加空格--------------------words = ' '.join(tags)words=jieba.cut(words)words=' '.join(words)res.generate(words)res.to_file('app.png')

柱状图和折线的生成
从数据库中查询app下载次数的前50排名,对下载次数前50的app进行评分和下载次数的折线图和柱状图的绘画

def draw_table():#   选择下载量前50的app数据'''sql语句中的(download_count+0)是因为下载次数在数据库中是字符串类型,+0进行类型的转换,这样才有可比性'''sql = 'SELECT NAME,grade,download_count FROM app_table ORDER BY (download_count+0) DESC LIMIT 0,50'datas = get_data(sql)name = []grade = []download = []if len(datas) > 0:for data in datas:name.append(data[0])grade.append(float(data[1]))download.append(float(data[2]))else:print('没有结果输出')returnbar = Bar()bar.add('app',name,download, yaxis_formatter="次",yaxis_interval=200)line = Line()line.add('评分',name,grade,yaxis_formatter="分",yaxis_interval=1,xaxis_rotate=30)#   使用overlap进行折线图和柱状图的混合overlap = Overlap(width=1200, height=600)overlap.add(bar)overlap.add(line,yaxis_index=1, is_add_yaxis=True)overlap.render('app_top50.html')

程序入口

def main():draw_table()draw_tag_wordcloud()if __name__ == '__main__':main()

实现效果

折线图和柱状图


词云

项目源代码:链接:https://pan.baidu.com/s/1t7LNR4HdSDOkTezSaca2ng 提取码:d6ur
总结:项目虽然简单,但其中的坑还有的,涉及多方面的使用,如MySQL、词云、折线图、柱状图等,还是得自己实现,发现以往不常出现的问题。本项目这是用于学习,不存在商业用途,如有侵权必删。

python爬虫---酷安(安卓app的聚集地)相关推荐

  1. python爬取app播放的视频,Python爬虫工程师必学——App数据抓取实战视频教程

    爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统数据抓取.本课程主要为同学讲解如何用python实现App数据抓取,课程从开发环境搭建,App爬虫必备利器详解,项目实战,到最后的多App ...

  2. Python Kivy打包成安卓App

    Kivy官方提供了打包工具buildozer,该工具使用十分简便,其内部实际上是使用python-to-android完成的. 但是这个工具目前只能在Linux系统上使用,因此对于windows用户, ...

  3. python爬虫酷狗_python爬虫教程:爬取酷狗音乐,零基础小白也能爬取哦

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:python学习教程 ( 想要学习Python?Pyt ...

  4. python爬虫图片工具安卓版下载_python爬虫之图片下载APP1.0

    今天给大家来个好玩一点的,运用python爬取图片到本地,网站为https://www.pexels.com/ 这个网站为外文网,所以搜索图片要用英语,今天要做的就是在python中进行搜索和下载图片 ...

  5. python程序打包成安卓app教程_Python zipapp打包教程(超级详细)

    经过复杂的开发.调试之后,终于得到一个 Python 程序,这个程序或许精巧,或许有些古拙,但它是我们心血的结晶,我们当然希望将这个程序发布出来. Python 提供了一个 zipapp 模块,通过该 ...

  6. Python爬虫实战:手机APP数据抓取分析!谁说不能爬取app数据的?

    大多数手机APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,使用python抓取超级课程表里用户发的话题.主要是练习python爬取app的一些方式和技巧. 1. ...

  7. python爬虫图片工具安卓版下载_python图片爬虫(图片爬虫工具) 1.1绿色版

    python图片爬虫(图片爬虫工具)是一款专门为互联.it行业的小伙伴们打造的爬虫工具,可以帮大家对软件进行优化.seo的人一定会用的上哦,有兴趣的赶紧下载了哦!python图片爬虫代码如下: #-* ...

  8. python爬虫抓取数据的步骤-Python爬虫抓取手机APP的传输数据

    大多数APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,抓取超级课程表里用户发的话题. 1.抓取APP数据包 得到超级课程表登录的地址:http://120.55 ...

  9. python程序打包成安卓app教程_Python打包方法基本应用方式介绍

    Python编程语言是一款功能强大的免费开源的通用型计算机程序应用语言,对于经验丰富的开发人员来说,掌握这样一款语言在其程序开发中是一个比较重要的选择.我们今天就先来了解一下python打包方法的相关 ...

最新文章

  1. 图像零交叉点,视频生成,视频识别,视频摘要,视频浓缩
  2. 将 SQL Server 存储过程用于数据访问
  3. 1024 程序员节专题论坛来袭,权威解读 MindSpore、CANN 5.0 特性和 HCIA MDC 开发者认证...
  4. [Oracle]构筑TDE 环境的例子
  5. 特征点的基本概念和如何找到它们
  6. 安装kube-prometheus项目:k8s部署prometheus、监控k8s核心组件、添加告警(微信、钉钉、企业微信)、进行数据持久化
  7. SQL数据库学习-简单查询
  8. 2015-03-19 Opportunity order by implementation detail
  9. 【IT笔试面试题整理】堆栈和队列
  10. 第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)
  11. Java 集成freeotp_Java Token.setImage方法代碼示例
  12. 【excel技巧读书笔记015】同时关闭多张工作薄
  13. HDVPSS模块介绍及使用
  14. 鸿蒙内部测试情况,鸿蒙OS内测曝光,安卓劲敌浮出水面!
  15. 微软亚洲研究院20周年庆典:纳德拉致敬、沈向洋展望
  16. 在shell中获取当前机器的ip地址
  17. 自主安全国产虚拟化平台CNware
  18. Paypal支付跳转失败的原因及解决办法
  19. 渝粤题库 国家开放大学 学前儿童艺术教育(音乐) 期末考试复习资料
  20. day2-运算符和分支

热门文章

  1. 查看电脑支持内存类型及大小
  2. 【转】Oracle在线重定义DBMS_REDEFINITION 普通表—分区表
  3. Redis 为什么是单线程的
  4. 面试题记录-- 对于软件测试的理解,测试的核心,测试策略
  5. Win11任务栏里华为电脑管家图标重叠怎么办?
  6. 专业软件开发人员必须具备的专业技能
  7. ISO TR 24971-2020 中文 医疗器械-ISO 14971 应用指南,英文
  8. 全线通过!PBlaze6 6530获得VMware官方认证
  9. 标自然段的序号格式_怎么教孩子标自然段
  10. vc实现用文件系统过滤驱动实现文件隐藏的类