一个完整的大作业
目的:爬取4399小游戏网站相关数据,分析受欢迎的小游戏
目的网址:http://www.4399.com/gamehw.htm
手段:利用谷歌浏览器查看源代码并加以分析,用python语言爬取自己需要的数据
- 下图为4399小游戏首页,我们发现首页有着各种栏目,信息杂乱,爬取此页的数据并不能达到此次目的,观察整个页面选取了“最新好玩游戏列表”的栏目,下面将对进入这个栏目的游戏进行数据分析。
- 下图为好玩游戏的网页,左边为网页的界面,展示了各种小游戏,右边则是网页的源代码。
- 在源代码里找到我们需要的数据在哪个标签里,然后就可以进行行读取。如下图所示,我们可以看到,需要的数据在“tm_list”这个类的下级标签的各个同级标签里,搜索可以发现这个类在整个代码里有两处,第一处是最好玩游戏,第二处是一般好玩游戏,而我们只需要第一处的数据。
- 根据上图的分析,提取数据代码如下:
import requests from bs4 import BeautifulSoup def get(url): res = requests.get(url) res.encoding='gb2312' soup = BeautifulSoup(res.text,'html.parser') tm=soup.select('.tm_list')[0]#找到tm_list类 #print(tm) for games in tm:#在找到的结果里遍历 try: game=games.select('a')[0].text print(game) except: pass gameurl = 'http://www.4399.com/flash/gamehw.htm' print(get(gameurl))
- 运行以上的代码之后我们就可以得到最好玩的小游戏的名字,如下图所示:
- 再把这些名字整合成一个字符串,代码如下:
import requests from bs4 import BeautifulSoup def get(url,txt): res = requests.get(url) res.encoding='gb2312' soup = BeautifulSoup(res.text,'html.parser') tm=soup.select('.tm_list')[0] #print(tm) for games in tm: try: game=games.select('a')[0].text txt=txt+game except: pass return txt gameurl = 'http://www.4399.com/flash/gamehw.htm' txt='' print(get(gameurl,txt))
- 运行修改后的代码,如下图我们可以看到游戏名整合了在一起,接下来我们就可以利用jieba来分词做进一步的分析。
- 分词并排序后效果如下(详细代码见完整代码):
- 生成词云我们可以更直观地看到数据的比对。下面说说我对结果的几点分析:
- 最受欢迎的是游戏是冒险类的。
- 中文版也很突出,我猜想这说明有很多小游戏是汉化过来的。
- 其次,入目的是“怪物”、“僵尸”、“猎人”,结合第一条分析,可以说这种元素的冒险游戏是最受欢迎的。
- 生成txt文件,将获取的数据写入文本中,效果如下图。方便我们浏览,也能快速找到自己要玩的小游戏。
完整代码如下:
import requests from bs4 import BeautifulSoup import jieba def get(url,txt): res = requests.get(url) res.encoding='gb2312' soup = BeautifulSoup(res.text,'html.parser') tm=soup.select('.tm_list')[0] #print(tm) for games in tm: try: game=games.select('a')[0].text#游戏名 gurl=games.select('a')[0]['href']#游戏链接 txt=txt+game#整合游戏名 with open("c:\games.txt",'a') as text:#创建并写入txt文件 text.write(game) text.write(':') text.write(url+gurl) text.write('\n\n') except: pass words = jieba.lcut(txt)#利用jieba分词 ls = [] counts = {} for word in words: ls.append(word) if len(word) == 1: continue else: counts[word] = counts.get(word,0)+1 items = list(counts.items()) items.sort(key = lambda x:x[1], reverse = True) for i in range(25): word , count = items[i] print ("{:<5}{:>5}".format(word,count)) from wordcloud import WordCloud import matplotlib.pyplot as plt w=" ".join(words)#键入空格以生成词云 wc=WordCloud().generate(w) plt.imshow(wc) plt.axis("off") plt.show() gameurl = 'http://www.4399.com/flash/gamehw.htm' txt='' print(get(gameurl,txt))