一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
对酷安网的游戏列表界面进行数据爬取
2.主题式网络爬虫爬取的内容与数据特征分析
2.主题式网络爬虫爬取的内容与数据特征分析
对酷安网的游戏列表界面的游戏得分、大小、下载量进行数据爬取
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
用requests库进行页面爬取,用BeautifulSoup4库进行数据清洗,然后进行数据可视化、持久化。
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
1.主题页面的结构特征
game为游戏列表,p=为页数。
2.Htmls页面解析所需要的信息在class名字为list_app_title,list_app_info,list_app_count的标签中。
3.节点(标签)查找方法与遍历方法(必要时画出节点树结构)
使用find_all()方法将从网页解析出的特定标签进行查找。
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
总代码为:
三、网络爬虫程序设计(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.经过对主题数据的分析与可视化,可以得到哪些结论?
1.经过对主题数据的分析与可视化,可以得到哪些结论?
根据数据可视化可得知炉石传说游戏好评如潮,腾讯游戏玩的人基数多、评分不好。
2.对本次程序设计任务完成的情况做一个简单的小结。
2.对本次程序设计任务完成的情况做一个简单的小结。
爬取过程还是遇到很多错误,但是经常一次次百度和对大佬的询问还是一一解决了。
对于爬虫的大体功能有个基本的了解,本次任务要求完成,但是有很多功能没去做到,希望今后可以更多去学习爬虫,完成一个完善的爬虫。