Python高级应用程序设计

99封情书 提交于 2020-02-03 03:39:26

 一、主题式网络爬虫设计方案(15分)

1.主题式网络爬虫名称
爬取酷安网应用信息
2.主题式网络爬虫爬取的内容与数据特征分析
对酷安网 应用名,每日推荐应用,下载数,应用分类进行爬取
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
 用requests库进行页面爬取
用BeautifulSoup4库进行数据清洗
用pandas和numpy库进行数据可视化
用xlwt库进行数据存储 
 
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征

 

 apk为应用页面


2.Htmls页面解析

 

 


3.节点(标签)查找方法与遍历方法
def getTitle(html):
    # 创建对象
    soup = BeautifulSoup(html, "html.parser")
    #find_all()方法遍历所有p标签中名为ist_app_title的标签
    a = soup.find_all("p","list_app_title")


    return a

使用find_all()方法将从网页解析出的特定标签进行查找。


(必要时画出节点树结构)
 
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集
def getHTMLText():
    try:
        #获取爬取url
        r = requests.get(url="https://www.coolapk.com/apk/")
        r.raise_for_status()
        #使用html页面编码方式
        r.encoding = r.apparent_encoding
        return r.text
    #如果爬取失败返回爬取失败
    except:
        return "爬取失败"
2.对数据进行清洗和处理
 
#爬取应用名
def getTitle(html):
    # 创建对象
    soup = BeautifulSoup(html, "html.parser")
    #find_all()方法遍历所有p标签中名为ist_app_title的标签
    a = soup.find_all("p","list_app_title")


    return a
    #建立list0,将爬取数据存放到list0
list0 = []
aaa = getTitle(getHTMLText())
for x in aaa:
    list0.append(x.text)
    #输出list0
print(list0)

#数据清洗

#爬取下载次数
def getCount(html):
    # 创建对象
    soup = BeautifulSoup(html, "html.parser")
    # find_all()方法遍历所有span标签中名为list_app_count的标签
    b = soup.find_all("span","list_app_count")
    #建立count进行数字提取
    count = []
    for time in b:
        #将有用数据以数字提取出来
        count.append(re.findall(r"\d+", time.string))
    temp = []
    for tem in count:
        temp.append(tem[0])
        #返回列表
    return temp

    #建立list1,将爬取数据存放到list1
list1 = getCount(getHTMLText())
for i in range(len(list1)):
    list1[i] = eval(list1[i])
    #输出list1
print(list1)


#爬取应用分类
def getTag(html):
    #创建对象
    soup = BeautifulSoup(html, "html.parser")
    # find_all()方法遍历所有p标签中名为ype_tag的标签
    c = soup.find_all("p","type_tag")
    #返回列表
    return c
    #建立list2
list2 = []
bbb = getTag(getHTMLText())
for x in bbb:
    list2.append(x.text)
    #输出list2数据
print(list2)
#爬取随机推荐应用

def getName(html):
    # 创建对象
    soup = BeautifulSoup(html, "html.parser")
    # find_all()方法遍历所有span标签中名为sp-name的标签
    d = soup.find_all("span","sp-name")
    #返回列表
    return d
    #创建list3
list3 = []
ccc = getName(getHTMLText())
for x in ccc:
    list3.append(x.text)
    #输出list3数据
print(list3)


#爬取推荐应用下载数
def getNums(html):
    # 创建对象
    soup = BeautifulSoup(html, "html.parser")
    # find_all()方法遍历所有span标签中名为sp-time的标签
    e = soup.find_all("span", "sp-time")
    #返回列表
    return e
    #创建list4
list4 = []
ddd = getNums(getHTMLText())
for x in ddd:
    list4.append(x.text)
    #输出list4数据
print(list4)

 

 
输出结果如下;

 

 

3.数据分析与可视化
#数据可视化
    #指定默认字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
    #解决负号显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
    #导入list1和list0的数据
s=pd.Series(list1,list0)
    #设定图形属性和标题
s.plot(kind='bar', title='应用下载数(万)')
plt.show()

运行结果如下图;

 

 

 4.数据持久化
#数据持久化

    #初始化表格文件
def set_style(self,name,height,bold=False):
    style = xlwt.XFStyle()
    font = xlwt.Font()
    font.name = name
    font.bold = bold
    font.color_index = 4
    font.height = height
    style.font = font
    return style
    #循环填写5个list表的数据
def writer_to_csv(list1,list2,list3,list4,list5):
    f = xlwt.Workbook()
    sheet1 = f.add_sheet('工作表', cell_overwrite_ok=True)
    # 写第一列
    row = ['应用名', '下载次数(万)', '应用分类', '推荐应用', '推荐应用下载次数']
    for i in range(0, len(row)):
        sheet1.write(0, i, row[i])
    for i in range(0, len(list1)):
        sheet1.write(i+1, 0, list1[i])
    for i in range(0, len(list2)):
        sheet1.write(i+1, 1, list2[i])
    for i in range(0, len(list3)):
        sheet1.write(i+1, 2, list3[i])
    for i in range(0, len(list4)):
        sheet1.write(i+1, 3, list4[i])
    for i in range(0, len(list5)):
        sheet1.write(i+1, 4, list5[i])
    #将csv保存为hyj.xls文件
    f.save('hyj.xls')
    #将5个list表数据导入csv
filename = 'hyjj.csv'
writer_to_csv(list0,list1,list2,list3,list4) 

    运行结果如下图;

 

 

 

5.总代码

# Python库导入
import requests
from bs4 import BeautifulSoup
import os, re, matplotlib
import csv
import xlwt
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas import DataFrame,Series

#爬取酷安网应用信息
def getHTMLText():
    try:
        #获取爬取url
        r = requests.get(url="https://www.coolapk.com/apk/")
        r.raise_for_status()
        #使用html页面编码方式
        r.encoding = r.apparent_encoding
        return r.text
    #如果爬取失败返回爬取失败
    except:
        return "爬取失败"

#爬取应用名
def getTitle(html):
    # 创建对象
    soup = BeautifulSoup(html, "html.parser")
    #find_all()方法遍历所有p标签中名为ist_app_title的标签
    a = soup.find_all("p","list_app_title")


    return a
    #建立list0,将爬取数据存放到list0
list0 = []
aaa = getTitle(getHTMLText())
for x in aaa:
    list0.append(x.text)
    #输出list0
print(list0)

#数据清洗

#爬取下载次数
def getCount(html):
    # 创建对象
    soup = BeautifulSoup(html, "html.parser")
    # find_all()方法遍历所有span标签中名为list_app_count的标签
    b = soup.find_all("span","list_app_count")
    #建立count进行数字提取
    count = []
    for time in b:
        #将有用数据以数字提取出来
        count.append(re.findall(r"\d+", time.string))
    temp = []
    for tem in count:
        temp.append(tem[0])
        #返回列表
    return temp

    #建立list1,将爬取数据存放到list1
list1 = getCount(getHTMLText())
for i in range(len(list1)):
    list1[i] = eval(list1[i])
    #输出list1
print(list1)


#爬取应用分类
def getTag(html):
    #创建对象
    soup = BeautifulSoup(html, "html.parser")
    # find_all()方法遍历所有p标签中名为ype_tag的标签
    c = soup.find_all("p","type_tag")
    #返回列表
    return c
    #建立list2
list2 = []
bbb = getTag(getHTMLText())
for x in bbb:
    list2.append(x.text)
    #输出list2数据
print(list2)
#爬取随机推荐应用

def getName(html):
    # 创建对象
    soup = BeautifulSoup(html, "html.parser")
    # find_all()方法遍历所有span标签中名为sp-name的标签
    d = soup.find_all("span","sp-name")
    #返回列表
    return d
    #创建list3
list3 = []
ccc = getName(getHTMLText())
for x in ccc:
    list3.append(x.text)
    #输出list3数据
print(list3)


#爬取推荐应用下载数
def getNums(html):
    # 创建对象
    soup = BeautifulSoup(html, "html.parser")
    # find_all()方法遍历所有span标签中名为sp-time的标签
    e = soup.find_all("span", "sp-time")
    #返回列表
    return e
    #创建list4
list4 = []
ddd = getNums(getHTMLText())
for x in ddd:
    list4.append(x.text)
    #输出list4数据
print(list4)




#数据持久化

    #初始化表格文件
def set_style(self,name,height,bold=False):
    style = xlwt.XFStyle()
    font = xlwt.Font()
    font.name = name
    font.bold = bold
    font.color_index = 4
    font.height = height
    style.font = font
    return style
    #循环填写5个list表的数据
def writer_to_csv(list1,list2,list3,list4,list5):
    f = xlwt.Workbook()
    sheet1 = f.add_sheet('工作表', cell_overwrite_ok=True)
    # 写第一列
    row = ['应用名', '下载次数(万)', '应用分类', '推荐应用', '推荐应用下载次数']
    for i in range(0, len(row)):
        sheet1.write(0, i, row[i])
    for i in range(0, len(list1)):
        sheet1.write(i+1, 0, list1[i])
    for i in range(0, len(list2)):
        sheet1.write(i+1, 1, list2[i])
    for i in range(0, len(list3)):
        sheet1.write(i+1, 2, list3[i])
    for i in range(0, len(list4)):
        sheet1.write(i+1, 3, list4[i])
    for i in range(0, len(list5)):
        sheet1.write(i+1, 4, list5[i])
    #将csv保存为hyj.xls文件
    f.save('hyj.xls')
    #将5个list表数据导入csv
filename = 'hyjj.csv'
writer_to_csv(list0,list1,list2,list3,list4)

#数据可视化
    #指定默认字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
    #解决负号显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
    #导入list1和list0的数据
s=pd.Series(list1,list0)
    #设定图形属性和标题
s.plot(kind='bar', title='应用下载数(万)')
plt.show()
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
社交应用下载数量占比交高,已经成为人们日常必备的应用。
接着是娱乐类应用和购物支付类应用。
2.对本次程序设计任务完成的情况做一个简单的小结。
经过这次的学习与作业实践,学到了很多爬虫的知识,不过还是远远不够的。
发现数据可视化和数据清洗真的很重要,对python的兴趣更加浓厚了。
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!