关于手机网游(android_game)软件相关数据的爬取和spss分析

标签: spss  python

前言
工欲善其事,必先利其器。学习了python爬虫的基础知识和spss分析工具后,动手写代码爬取数据进行spss分析才能更好掌握工具的使用,提升自己。我选择了一个游戏网站,爬取其手机网游的信息,以此分析影响手机网游评分的因素。

1.数据的爬取

import requests
from bs4 import BeautifulSoup
import json
from openpyxl import Workbook
import numpy as np
import time


list = []
# User Agents
hds = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36',
        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding':'gzip, deflate',
        'Accept-Language':'zh-CN,zh;q=0.9',
        'Connection':'keep-alive',
        'Cookie':'BAIDU_SSP_lcr=https://www.baidu.com/link?url=zpwXeCd_RRY2FRQqCVYtuGPcbzYeeabv1UG4aKzI2tdzCbbJPbxXtJc0gsr1KS62&wd=&eqid=d4b30eca0005872c000000055b8f7a0c; Hm_lvt_15b67ce53ef6efd896a81316b10e56a4=1536129772; sec_tc=AQAAANxpbiKZXAcAQoUnd+/VZgti2ZRL; Hm_lpvt_15b67ce53ef6efd896a81316b10e56a4=1536131556'
       }
'''
获得安卓游戏的详细信息所在网址链接
'''
def download(url):
        url_list = []
        try:
                r = requests.request("get", url, headers = hds)

                source_code = r.text
                #print(source_code)

        except Exception as e:
                print(e)

        try:
                i = 0 # 计数器
                soup = BeautifulSoup(r.text,'lxml')
                div = soup.find_all('div',{'class':'list_con'})
                for div1 in div:
                        for ul in div1.find_all('ul'):
                                for li in ul.find_all('li'):
                                        for a in li.find_all('a'):
                                                i = i+1
                                                in_url = a['href']
                                                # print(in_url)
                                                # print(i)
                                                url_list.append(in_url)
        except Exception as e:
                print(e)
        # print(url_list)
        return url_list

# url ='http://android.gamedog.cn/online/'
# download(url)

'''
获得进入链接之后详细游戏信息
'''
def get_content(in_url):

        # print(in_url)
        try:
            r = requests.request("get", in_url, headers = hds)
            r.encoding = 'utf-8'
            source = r.text
        except Exception as e:
            print(e)

        soups = BeautifulSoup(source,'lxml')
        #print(soups)
        try:
                gamename = soups.find('h1').text  # 获得游戏名
                #print(gamename)
        except Exception as e:
                gamename = '缺失'

        try:
                divs = soups.find('div',{'class':'app_info'}) # 获得评分
                #print(divs)
                span1 = divs.find('span')
                img = span1.find('img')
                pf = img['alt']  # 评分
                #print(pf)

                divss = soups.find('div',{'class':'app_md fl'}) #  获得其他游戏相关数据
                span = divss.find_all('span')
                # print(len(up_time))
                gxsj = span[0].find('font').text # 获得更新时间
                yxlx = span[1].find('font').text # 获得游戏类型
                yxdx = span[2].find('font').text # 获得游戏大小
                sfms = span[3].find('font').text # 获得收费模式
                yxyy = span[4].find('font').text # 获得游戏语言
                gt = span[5].find('font').text # 获得固体
                bb = span[6].find('font').text # 获得版本
                # print(yxdx)
        except  Exception as e:
                pf = '缺失'
                gxsj = '缺失'
                yxlx = '缺失'
                yxdx = '缺失'
                sfms = '缺失'
                yxyy = '缺失'
                gt = '缺失'
                bb = '缺失'
        try:
              li = divss.find('li',{'id':'operatorsid'}) # 获得运营公司
              yygs1 = li.find('a').text
              lii = divss.find('li',{'id':'corpid'})# 获得开发公司
              yygs2 =lii.find('a').text
              if yygs1 !="" :
                      yygs = yygs1
              else:
                      yygs = yygs2
              # print(yygs)
        except Exception as e:
                yygs = '缺失'


        list.append([gamename,pf,gxsj,yxlx,yxdx,sfms,yxyy,gt,bb,yygs])#把所有获取的数据放入到list列表中
        # print(list)
        return list

# get_content('http://android.gamedog.cn/online/600797.html')

'''
存数据入excel
'''

def write_excel(list):
        wb = Workbook()
        ws = wb.active
        ws.append(['游戏名称', '评分','更新时间', '游戏类型', '游戏大小', '收费模式', '游戏语言', '固体','版本','运营/开发公司'])
        for row in list:
                ws.append(row)
        wb.save('android_game.xlsx')


if __name__ == '__main__':
        for j in range(1,80):
                # b_url = 'http://android.gamedog.cn/list_online_0_0_0_0_0_2.html'
                b_url='http://android.gamedog.cn/list_online_0_0_0_0_0_'+str(j)+'.html'
                time.sleep(np.random.rand() * 5)
                # print(b_url)
                for in_url in download(b_url):#在获得的连接地址列表循环

                        # print(in_url)
                        get_content(in_url)  # 获取数据
                        #print(list)
        write_excel(list)  # 写入数据到excle中

此为游戏狗网站(http://android.gamedog.cn/online/) 的最新网游数据的爬取代码,期间,我遇到了问题,也受益良多。
1.download(url):从每一页网站中得到每一页的游戏链接。我用的是网站的第一页作为测试网站,i为其中游戏链接的计数器。这里注意的是,游戏链接在<a href=......>中,所以我做了几次标签的循环。
2.get_content(in_url):从每一条游戏链接中得到具体的游戏信息# get_content(‘http://android.gamedog.cn/online/600797.html‘)为我的测试网址语句,这里要注意游戏信息中的——更新时间、游戏类型等都在font便签中,但有些并没有class等属性唯一性标识,会重复爬取到一个font标签的信息。font标签在span标签中,我找到所有的span标签,在存储span标签的列表中获取第1、2、3…个font标签的内容。
3.划重点:这个封装中,我遇到了这个程序最大的问题:会一直爬取到重复数据。(我们python老师也不理我小声哔哔,我也百度不到)最后在一个pythonQQ群里,得到了一名热心大神的指导解决了问题,是因为我download(url)中的url_list变量(存储游戏链接)设为全局变量,下一页的爬取时,前一页的游戏链接不会为清除,那么 url_list 存储的是从第一页到最后一页的游戏链接。下一步get_content(in_url)是从一个游戏链接一直取到最后一个游戏链接的信息,就会重复从第一页的链接爬取信息。

注意:我的电脑运速较差,我做的是每20页的爬取,一共爬取到第八十页

2.数据的预处理
接下来是将爬取1421条数据进行Excel处理:将评分中的”星”删除,改成数值变量
这里写图片描述

3.数据spss处理和分析
变量的处理:将变量视图中的测量改为如图所示
变量的处理
选择自动重新定义编码变成分类变量:
重新定义变量

进行双变量相关性分析:
这里写图片描述

结果:
这里写图片描述

相关性分析:说明在置信度为0.01或0.05时,游戏评分和游戏大小正相关、游戏类型负相关,游戏大小和收费模式负相关、固体正相关,游戏类型和固体正相关,收费模式和固体负相关。此处只研究和游戏评分相关的因素,即游戏大小、游戏类型

简单线性回归分析:
这里写图片描述
注意:我习惯将变量进行标准化处理再做回归分析,经spss老师提点:那个是对因子分析、聚类分析时这样做。可以各个变量取对数,以减小方差过大的影响。
在这里就没必要做标准化变量了!

结果:这里写图片描述

分析:
调整的r平方不理想,dw值很好,说明变量不自相关,共线性vif值也很好,说明模型不共线;
根据系数图可知:评分=3.393 -0.028* 游戏类型1+0.000298*游戏大小(MB)
这里写图片描述
根据该值标签可知,游戏类型越靠下的游戏评分越低,养成系游戏评分更低;游戏大小越大,游戏评分更高。

原文链接:加载失败,请重新获取