基于steam的游戏销量预测 — PART 1 — 爬取steam游戏相关数据的爬虫

2023-05-16

语言python

环境ubuntu

爬取内容steam游戏标签,评论,以及在 steamspy 爬取对应游戏的销量

使用相关urllib,lxml,selenium,chrome

解释

  流程图如下

  1.首先通过 steam 商店搜索页面的链接,打开 steam 搜索页面,然后用如下正则表达式来得到前100个左右的游戏的商店页面链接。


reg = r'<a href="(http://store.steampowered.com/app/.+?)"'  

  2.对于得到的每个商店页面链接,可以通过如下正则表达式来得到对应的有游戏名称.


reg = r'.+?/app/[0-9]+?/(.+?)/'  

   例如如下链接 http://store.steampowered.com/app/268910/Cuphead/ ,可以得到游戏名字为Cuphead。

  3.然后通过 selenium 来模拟 chrome 上的操作,以获取动态加载的网页。先打开网页 steamspy,然后在网页上检查元素,看源码,发现搜索框元素的 name 值为”s”,所以可以通过 driver.find_element_by_name("s") 找到搜索框,模拟输入对应的游戏名字。进行搜索,得到了新的页面,再通过如下正则表达式得到销量


reg = r'<strong>Owners</strong>:\s+?([0-9,]+?)\s+?'  

   例如上面那个网址对应应当输入 Cuphead。

  4.得到游戏标签,这一步比较简单,打开商店链接,得到源码,然后通过如下正则表达式获取标签即可


reg=r'>\s+?([^\t]+?)\s+?</a><a href="http://store.steampowered.com/tag.+?"\s+?class="app_tag"'  

  5.得到游戏评论。由于 steam 商店评论是动态加载的,所以要又通过 selenium 来模拟 chrome 的操作,首先进入商店页面,因为有些商店是有年龄确认的按钮存在,那么通过 xpath 来找 viewpage 的按钮,如果有按钮则模拟点击操作,否则不点击。代码如下


driver.find_element_by_xpath("//span[text()='View Page']").click()  

  6.这样就进入了商店页面,然后类似地,通过xpath找到加载评论的按钮,加载评论,代码如下。


driver.find_element_by_xpath("//span[starts-with(@class,'game_review_summary')]").click()  

  7.再通过xpath找到多条评论的链接,代码如下。


elements = driver.find_elements_by_xpath("//a[starts-with(@href,'http://steamcommunity.com/id')]")  

  8.得到评论链接之后,打开评论链接,并通过如下正则表达式来得到评论正文内容。


reg = r'<div\s+?id="ReviewText">(.+?)</div>'  

 

 

代码


  1 import urllib
  2 import re
  3 import sys
  4 import lxml
  5 from selenium import webdriver
  6 from selenium.webdriver.common.keys import Keys
  7 
  8 def getHtml(url):
  9     page = urllib.urlopen(url)
 10     html = page.read()
 11     return html
 12 
 13 def getGameLink(html):
 14     reg = r'<a href="(http://store.steampowered.com/app/.+?)"'
 15     gamelinkre = re.compile(reg)
 16     gamelinklist = re.findall(gamelinkre,html)
 17     return gamelinklist
 18 
 19 def getTag(html):
 20     reg = r'>\s+?([^\t]+?)\s+?</a><a href="http://store.steampowered.com/tag.+?"\s+?class="app_tag"'
 21     tagre = re.compile(reg)
 22     taglist = re.findall(tagre,html)
 23     return taglist
 24 
 25 def getReviewLink(url):
 26     gamereviewlinklist = []
 27     driver = webdriver.Chrome()
 28     flag = True
 29     try:
 30         driver.get(url)
 31         driver.implicitly_wait(30)
 32         flag = True
 33     except:
 34         return gamereviewlinklist
 35     try:
 36         driver.find_element_by_xpath("//span[text()='View Page']").click()
 37         driver.implicitly_wait(30)
 38         flag = True
 39     except:
 40         flag = False
 41     try:
 42         driver.find_element_by_xpath("//span[starts-with(@class,'game_review_summary')]").click()
 43         driver.implicitly_wait(30)
 44         flag = True
 45     except:
 46         flag = False
 47     if(flag == False):
 48         driver.quit()
 49         return gamereviewlinklist
 50     elements = driver.find_elements_by_xpath("//a[starts-with(@href,'http://steamcommunity.com/id')]")
 51     pattern = re.compile(r'recommended/.+')
 52     for element in elements:
 53         url = element.get_attribute("href") 
 54         if(re.search(pattern,url)):
 55            gamereviewlinklist.append(url) 
 56     driver.quit()
 57     return gamereviewlinklist
 58 
 59 def getReview(html):
 60     reg = r'<div\s+?id="ReviewText">(.+?)</div>'
 61     reviewre = re.compile(reg)
 62     reviewlist = re.findall(reviewre,html)
 63     reviewlist.append("")
 64     print reviewlist[0]
 65     return reviewlist[0]
 66 
 67 def getSale(url):
 68     searchwebname="http://steamspy.com/search.php"
 69     reg = r'.+?/app/[0-9]+?/(.+?)/'
 70     namere = re.compile(reg)
 71     nameresult = re.findall(namere,url)
 72     name = nameresult[0]
 73     print name
 74     driver = webdriver.Chrome()
 75     driver.get(searchwebname)
 76     driver.implicitly_wait(30)
 77     flag = True
 78     elem = driver.find_element_by_name("s")
 79     elem.clear()
 80     elem.send_keys(name)
 81     driver.implicitly_wait(30)
 82     elem.send_keys(Keys.RETURN)
 83     driver.implicitly_wait(30)
 84     pagesource = driver.page_source
 85     reg = r'<strong>Owners</strong>:\s+?([0-9,]+?)\s+?'
 86     salere = re.compile(reg)
 87     saleresult = re.findall(salere,pagesource)
 88     sale = "-1"
 89     if len(saleresult)>0:  
 90         sale = saleresult[0]
 91     print sale
 92     driver.quit()
 93     return sale
 94 
 95 
 96 reload(sys)
 97 sys.setdefaultencoding('utf-8')
 98 
 99 urls = []
100 inputfilename = "urls.txt"
101 inputfile = file(inputfilename,'r')
102 emptyflag = 0
103 while not emptyflag:
104     nowline = inputfile.readline()
105     if(nowline == ""):
106         emptyflag = 1
107     else:
108         urls.append(nowline)
109 inputfile.close()
110 
111 gamelinklist = []
112 for urli in urls:
113     html = getHtml(urli)
114     gamelinklist.extend(getGameLink(html))
115 
116 salefilename = "gamesales.txt"
117 salefile = file(salefilename,"w")
118 for gamelinki in gamelinklist:
119     sale = getSale(gamelinki)
120     print sale
121     print >> salefile,gamelinki
122     print >> salefile,sale
123     print >> salefile,"sale end"
124     print gamelinki+"--sale end"
125 salefile.close()
126 
127 tagfilename = "gametags.txt"
128 tagfile = file(tagfilename,"w")
129 for gamelinki in gamelinklist:
130     html = getHtml(gamelinki)
131     taglist = getTag(html)
132     print taglist
133     print >> tagfile,gamelinki
134     for tagi in taglist:
135         print >> tagfile,tagi
136     print >> tagfile,"tag end"
137     print gamelinki+"--tag end"
138 tagfile.close()
139 
140 reviewfilename = "gamereviews.txt"
141 reviewfile = file(reviewfilename,"w")
142 lst = ""
143 for gamelinki in gamelinklist:
144     reviewlinklist = getReviewLink(gamelinki)
145     print reviewlinklist
146     print >> reviewfile,gamelinki
147     for reviewlinki in reviewlinklist:
148         if(reviewlinki != lst):
149             html = getHtml(reviewlinki)
150             review = getReview(html)
151             print >> reviewfile,review
152             print >> reviewfile,"a review end"
153             lst = reviewlinki
154     print >> reviewfile,"review end"
155     print gamelinki+"--review end"
156 reviewfile.close()  
View Code

 

 

转载于:https://www.cnblogs.com/FxxL/p/8410549.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于steam的游戏销量预测 — PART 1 — 爬取steam游戏相关数据的爬虫 的相关文章

随机推荐

  • 浅谈SpringBoot核心注解原理

    SpringBoot核心注解原理 今天跟大家来探讨下SpringBoot的核心注解 64 SpringBootApplication以及run方法 xff0c 理解下springBoot为什么不需要XML xff0c 达到零配置 首先我们先
  • Quartus II和Modelsim的联合仿真(详细)

    这篇文章不需要在modelsim中建库 映射 建工程等一些繁琐的步骤 xff0c 直接使用modelsim中的默认work库 使用quartus 43 modelsim联合仿真 首先推荐一篇文章 http www cnblogs com e
  • requests.post处理Content-Type: multipart/form-data的请求

    前几天遇到一个需求 xff0c 要调用一个接口发送请求 xff0c 抓包之后得到的数据是这样的 上网看了一些资料得知 xff0c 原来这个接口的数据是通过multipart form data格式传过去的 xff0c multipart f
  • 上一步,下一步(撤销和恢复)

    var data 61 data count 61 0 data list 61 function regain function handleSaveCss 获取workspace body里面的内容 var c 61 34 worksp
  • Ubuntu下dpkg安装软件遇到包依赖问题的处理方法

    造冰箱的大熊猫 64 cnblogs 2019 9 10 向灵魂工程师致敬 xff01 在Ubuntu环境下通过dpkg命令安装deb包时 xff0c 如果遇到包依赖问题 xff0c 如 sudo dpkg i xxx deb Readin
  • Ubuntu18优化桌面版的运行速度

    一 刚开始使用Ubuntu18后 xff0c 感觉开机和运行速度都不理想 xff0c 通过改变一些配置可以提高下用户体验感 二 改变一些配置 a 使用Preload预加载 sudo apt install preload y b 禁用不必要
  • Debian安装mplayer,解决没有声音及声卡独占问题

    通过软件中心可以安装Gnome mplayer 本来以为这样这个播放器已经是 万能 的了 xff0c 但是最近下载了几个 mkv的电影 却发现Gnome mplayer没有办法打开 感觉很失望 在网上找了一番后 说只要下载源代码自己安装就行
  • CentOS7中安装MySQL5.7

    安装必要的组件 yum install y autoconf automake imake libxml2 devel expat devel cmake gcc gcc c 43 43 libaio libaio devel bzr bi
  • 20190708新的开始

    题目描述 发展采矿业当然首先得有矿井 xff0c 小 FF 花了上次探险获得的千分之一的财富请人在岛上挖了 n 口矿井 xff0c 但他似乎忘记考虑的矿井供电问题 为了保证电力的供应 xff0c 小 FF 想到了两种办法 xff1a 在这一
  • Debian安装JDK

    sudo tar zxvf jdk 8u60 linux x64 tar gz C usr local vi bashrc export JAVA HOME 61 usr local jdk1 8 0 60 export JRE HOME
  • Go——多值赋值和短变量声明

    1 多值赋值 可以一次性声明多个变量 xff0c 并可以在声明时赋值 xff0c 而且可以省略类型 xff0c 但必须遵守一定的规则要求 xff0c 具体看下面的示例 如下都是合法的 span class token comment 相同类
  • 「一本通 1.2 练习 2」扩散(loj10015)

    题目描述 一个点每过一个单位时间就会向 4 个方向扩散一个距离 xff0c 如图所示 xff1a 两个点 a b 连通 xff0c 记作 e a b xff0c 当且仅当 a b 的扩散区域有公共部分 连通块的定义是块内的任意两个点 u v
  • .db文件打开方式

    有时在工作中 xff0c 数据库格式db后缀的格式 xff0c 直接是打不开的 xff0c 所以我这里使用了数据库管理工具 xff0c 步骤如下 1 在电脑安装 Navicat Premium xff0c 安装后在桌面生成图标 xff0c
  • MathType的配置问题;将word中的公式转换为mathtype格式失败,缺少OMML2MML.XSL

    安装MathType后打开word报错 打开会出现以下问题 xff1a 首先 xff0c 把startup添加到word的信任中心 xff1a 要确保路径被office信任 依次打开word gt 文件 gt 选项 gt 信任中心 gt 信
  • XMPP系列(四)---发送和接收文字消息,获取历史消息功能

    今天开始做到最主要的功能发送和接收消息 获取本地历史数据 先上到目前为止的效果图 xff1a 首先是要在XMPPFramework h中引入数据存储模块 xff1a 聊天记录模块的导入 import 34 XMPPMessageArchiv
  • linux新增磁盘后,用fdisk等命令查询不到

    ls sys class scsi host xff08 会看到有host0 host1 hostN xff0c 对每个host进行如下操作 xff09 echo 34 34 gt sys class scsi host host0 sca
  • ubuntu上源码编译安装mysql5.7.27

    一 查看操作系统环境和目录结构 xff0c 并创建mysql用户和组 xff0c 以及规划安装mysql所需要的目录 cat etc issue 查看发行版本信息 xff1a cat proc version 查看正在运行的内核版本信息 u
  • (转-收集)MSSQL手工注入语句集合

    and exists select from sysobjects 判断是否是MSSQL and exists select from tableName 判断某表是否存在 tableName为表名 and 1 61 select 64 6
  • 滚动视图 UIScrollView

    UIScrollView xff1a 提供可以显 示 大于应 用窗 口的内容功能的控件 用户可以通过 手势使内容滚动和缩放 从 而查 看全部内容 初始化一个UIScrollView的对象 1 UIScrollView scroll 61 U
  • 基于steam的游戏销量预测 — PART 1 — 爬取steam游戏相关数据的爬虫

    语言 xff1a python 环境 xff1a ubuntu 爬取内容 xff1a steam游戏标签 xff0c 评论 xff0c 以及在 steamspy 爬取对应游戏的销量 使用相关 xff1a urllib xff0c lxml