首页 > 编程语言 > 详细

Python高级应用程序设计任务

时间:2019-12-16 15:59:40      阅读:70      评论:0      收藏:0      [点我收藏+]
一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
对酷安网的游戏列表界面进行数据爬取
2.主题式网络爬虫爬取的内容与数据特征分析
对酷安网的游戏列表界面的游戏得分、大小、下载量进行数据爬取
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
 用requests库进行页面爬取,用BeautifulSoup4库进行数据清洗,然后进行数据可视化、持久化。
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
技术分享图片

 

 game为游戏列表,p=为页数。

2.Htmls页面解析
技术分享图片

 

 所需要的信息在class名字为list_app_title,list_app_info,list_app_count的标签中。

 

3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)
使用find_all()方法将从网页解析出的特定标签进行查找。
 
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
总代码为:
import requests
from bs4 import BeautifulSoup
import os, matplotlib
import matplotlib.pyplot as plt

# 爬取酷安网的游戏列表信息
def getHTMLText(url):
    try:
        # 获取酷安网的游戏页面
        r = requests.get(url="https://www.coolapk.com/game/")
        # 判断是否调用成功,注:返回值为200的状态码才是可以正常爬取
        r.raise_for_status()
        # 使用HTML页面的编码方式以免出现乱码的行为
        r.encoding = r.apparent_encoding
        # 返回爬取成功的页面内容
        return r.text
    except:
        return "爬取失败"

# 爬取游戏名称
def getGameName(ulist1, html):
    # 使用之前导入的BeautifulSoup包创建对象
    soup = BeautifulSoup(html, "html.parser")
    # 使用find_all()方法遍历所有class名为list_app_title的p标签
    for p in soup.find_all("p", attrs="list_app_title"):
        # 将p标签中的list_app_title标签中的内容存放在ulist1列表中
        ulist1.append(str(p.string).strip())
    # 返回列表
    return ulist1

# 爬取游戏评分
def getScore(ulist2, html):
    # 使用之前导入的BeautifulSoup包创建对象
    soup = BeautifulSoup(html, "html.parser")
    # 使用find_all()方法遍历所有class名为list_app_info的p标签
    for p in soup.find_all("p", attrs="list_app_info"):
        # 将p标签中的特定内容存放在ulist2列表中
         ulist2.append(("".join(list(p.text)[0:3])))
    # 返回列表
    return ulist2

# 爬取游戏下载次数
def getDownloadsAmount(ulist3, html):
    # 使用之前导入的BeautifulSoup包创建对象
    soup = BeautifulSoup(html, "html.parser")
    # 使用find_all()方法遍历所有class名为list_app_count的span标签
    for span in soup.find_all("span", attrs="list_app_count"):
        # 将span标签中的特定内容存放在ulist3列表中
        ulist3.append("".join(list(span.text)[0:8]))
    # 返回列表
    return ulist3

# 爬取游戏大小
def getGameSize(ulist4, html):
    # 使用之前导入的BeautifulSoup包创建对象
    soup = BeautifulSoup(html, "html.parser")
    # 使用find_all()方法遍历所有class名为list_app_info的p标签
    for p in soup.find_all("p", attrs="list_app_info"):
        # 将span标签中的特定内容存放在ulist4列表中
        ulist4.append("".join(list(p.text)[4:14]))
    # 返回列表
    return ulist4

# 将获取到的数据全部打印出来
def printUnivList(ulist1, ulist2, ulist3,ulist4, num):
    # 打印标题
    print("{0:^30}\t{1:^20}\t{2:^20}\t{3:^20}".format("游戏名称", "游戏评分","游戏下载次数","游戏大小"))
    # 打印主要内容
    for i in range(num):
        print("{0:^30}\t{1:^20}\t{2:^20}\t{3:^20}".format(ulist1[i], ulist2[i], ulist3[i],ulist4[i]))

# 数据保存函数
def dataSave(ulist1, ulist2, ulist3,ulist4,num):
    try:
        # 创建文件夹
        os.mkdir("D:\\酷安网游戏信息\\")
    except:
        # 如果文件夹存在则什么也不做
        ""
    try:
        # 创建文件用于存储爬取到的数据
        with open("D:\\酷安网游戏信息\\爬取结果.txt" , "w",encoding=utf8) as f:
            f.write("{0:^30}\t{1:^20}\t{2:^20}\t{3:^20}\n".format("游戏名称", "游戏评分","游戏下载次数","游戏大小"))
            for i in range(num):
                f.write("{0:^30}\t{1:^20}\t{2:^20}\t{3:^20}\n".format(ulist1[i], ulist2[i], ulist3[i],ulist4[i]))
    except:
        "存储失败"

#修正pandas绘图中文乱码问题
matplotlib.rcParams[font.sans-serif] = [SimHei]
matplotlib.rcParams[font.family]=sans-serif
matplotlib.rcParams[axes.unicode_minus] = False
# 折线图可视化
def Zhexiantu(x, y):
    #图片在额外的窗口显示
    plt.plot(x, y)
    #y轴命名
    plt.ylabel(游戏得分)
    #x轴命名
    plt.xlabel(游戏名字)
    # plt.axis([0, 1, 0, 10])
    plt.title(游戏评分-折线图比较)
    # 保存程序结果,数据持久化
    plt.savefig(Broken, dpi=300)
    # 使x轴文字竖向显示
    plt.xticks(rotation=270)
    print(折线图保存成功)
    plt.show()

# 主函数
def main():
    # 酷安网网站
    url = "https://www.coolapk.com/game/"
    # 用来存放游戏名称
    gameName= []
    # 用来存放游戏得分
    gameScore = []
    # 用来存放游戏下载数量
    downloadAmount = []
    # 用来存放游戏大小
    gameSize=[]

    html = getHTMLText(url)
    # 获取游戏名称并存放在相关的列表中
    getGameName(gameName, html)
    # 获取游戏得分并存放在相关的列表中
    getScore(gameScore, html)
    # 获取游戏下载数量并存放在相关的列表中
    getDownloadsAmount(downloadAmount, html)
    # 获取游戏大小并存放在相关的列表中
    getGameSize(gameSize, html)

    try:
        # 将目标信息打印出来
        printUnivList(gameName,gameScore,downloadAmount,gameSize,20)
    except:
         # 如果招聘信息不足,则引发异常。
        print("无更多招聘信息。")
    #将数据存储
    dataSave(gameName,gameScore,downloadAmount,gameSize, 20)
    #可视化操作
    Zhexiantu(gameName, gameScore)
if __name__==__main__:
    main()
pycharm生成结果
技术分享图片

 

txt文件生成结果

 技术分享图片

可视化结果

技术分享图片

四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
根据数据可视化可得知炉石传说游戏好评如潮,腾讯游戏玩的人基数多、评分不好。
2.对本次程序设计任务完成的情况做一个简单的小结。
爬取过程还是遇到很多错误,但是经常一次次百度和对大佬的询问还是一一解决了。
对于爬虫的大体功能有个基本的了解,本次任务要求完成,但是有很多功能没去做到,希望今后可以更多去学习爬虫,完成一个完善的爬虫。

Python高级应用程序设计任务

原文:https://www.cnblogs.com/naytyns/p/12049518.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!