基于steam的游戏销量预测 — PART 1 — 爬取steam游戏相关数据的爬虫
语言: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>'
代码:
import urllib
import re
import sys
import lxml
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getGameLink(html):
reg = r'<a href="(http://store.steampowered.com/app/.+?)"'
gamelinkre = re.compile(reg)
gamelinklist = re.findall(gamelinkre,html)
return gamelinklist
def getTag(html):
reg = r'>\s+?([^\t]+?)\s+?</a><a href="http://store.steampowered.com/tag.+?"\s+?class="app_tag"'
tagre = re.compile(reg)
taglist = re.findall(tagre,html)
return taglist
def getReviewLink(url):
gamereviewlinklist = []
driver = webdriver.Chrome()
flag = True
try:
driver.get(url)
driver.implicitly_wait(30)
flag = True
except:
return gamereviewlinklist
try:
driver.find_element_by_xpath("//span[text()='View Page']").click()
driver.implicitly_wait(30)
flag = True
except:
flag = False
try:
driver.find_element_by_xpath("//span[starts-with(@class,'game_review_summary')]").click()
driver.implicitly_wait(30)
flag = True
except:
flag = False
if(flag == False):
driver.quit()
return gamereviewlinklist
elements = driver.find_elements_by_xpath("//a[starts-with(@href,'http://steamcommunity.com/id')]")
pattern = re.compile(r'recommended/.+')
for element in elements:
url = element.get_attribute("href")
if(re.search(pattern,url)):
gamereviewlinklist.append(url)
driver.quit()
return gamereviewlinklist
def getReview(html):
reg = r'<div\s+?id="ReviewText">(.+?)</div>'
reviewre = re.compile(reg)
reviewlist = re.findall(reviewre,html)
reviewlist.append("")
print reviewlist[0]
return reviewlist[0]
def getSale(url):
searchwebname="http://steamspy.com/search.php"
reg = r'.+?/app/[0-9]+?/(.+?)/'
namere = re.compile(reg)
nameresult = re.findall(namere,url)
name = nameresult[0]
print name
driver = webdriver.Chrome()
driver.get(searchwebname)
driver.implicitly_wait(30)
flag = True
elem = driver.find_element_by_name("s")
elem.clear()
elem.send_keys(name)
driver.implicitly_wait(30)
elem.send_keys(Keys.RETURN)
driver.implicitly_wait(30)
pagesource = driver.page_source
reg = r'<strong>Owners</strong>:\s+?([0-9,]+?)\s+?'
salere = re.compile(reg)
saleresult = re.findall(salere,pagesource)
sale = "-1"
if len(saleresult)>0:
sale = saleresult[0]
print sale
driver.quit()
return sale
reload(sys)
sys.setdefaultencoding('utf-8')
urls = []
inputfilename = "urls.txt"
inputfile = file(inputfilename,'r')
emptyflag = 0
while not emptyflag:
nowline = inputfile.readline()
if(nowline == ""):
emptyflag = 1
else:
urls.append(nowline)
inputfile.close()
gamelinklist = []
for urli in urls:
html = getHtml(urli)
gamelinklist.extend(getGameLink(html))
salefilename = "gamesales.txt"
salefile = file(salefilename,"w")
for gamelinki in gamelinklist:
sale = getSale(gamelinki)
print sale
print >> salefile,gamelinki
print >> salefile,sale
print >> salefile,"sale end"
print gamelinki+"--sale end"
salefile.close()
tagfilename = "gametags.txt"
tagfile = file(tagfilename,"w")
for gamelinki in gamelinklist:
html = getHtml(gamelinki)
taglist = getTag(html)
print taglist
print >> tagfile,gamelinki
for tagi in taglist:
print >> tagfile,tagi
print >> tagfile,"tag end"
print gamelinki+"--tag end"
tagfile.close()
reviewfilename = "gamereviews.txt"
reviewfile = file(reviewfilename,"w")
lst = ""
for gamelinki in gamelinklist:
reviewlinklist = getReviewLink(gamelinki)
print reviewlinklist
print >> reviewfile,gamelinki
for reviewlinki in reviewlinklist:
if(reviewlinki != lst):
html = getHtml(reviewlinki)
review = getReview(html)
print >> reviewfile,review
print >> reviewfile,"a review end"
lst = reviewlinki
print >> reviewfile,"review end"
print gamelinki+"--review end"
reviewfile.close()
基于steam的游戏销量预测 — PART 1 — 爬取steam游戏相关数据的爬虫的更多相关文章
- 基于steam的游戏销量预测 — PART 3 — 基于BP神经网络的机器学习与预测
语言:c++ 环境:windows 训练内容:根据从steam中爬取的数据经过文本分析制作的向量以及标签 使用相关:无 解释: 就是一个BP神经网络,借鉴参考了一些博客的解释和代码,具体哪些忘了,给出 ...
- python爬虫 爬取steam热销游戏
好久没更新了啊...最近超忙 这学期学了学python 感觉很有趣 就写着玩~~~ 爬取的页面是:https://store.steampowered.com/search/?filter=globa ...
- 基于云开发开发 Web 应用(三):云开发相关数据调用
介绍 在完成了 UI 界面的实现后,接下来可以开始进行和云开发相关的数据对接.完成数据对接后,应用基础就打好了,接下来的就是发布上线以及一些小的 feature 的加入. 配置 在进行相关的配置调用的 ...
- scrapy爬取youtube游戏模块
本次使用mac进行爬虫 mac爬虫安装过程中出现诸多问题 避免日后踩坑这里先进行记录 首先要下载xcode ,所以要更新macOS到10.14.xx版本 更新完之后因为等下要进行环境路径配置 但是ma ...
- 基于爬取百合网的数据,用matplotlib生成图表
爬取百合网的数据链接:http://www.cnblogs.com/YuWeiXiF/p/8439552.html 总共爬了22779条数据.第一次接触matplotlib库,以下代码参考了matpl ...
- 爬虫实战--基于requests和beautifulsoup的妹子网图片爬取(福利哦!)
#coding=utf-8 import requests from bs4 import BeautifulSoup import os all_url = 'http://www.mzitu.co ...
- requests模块session处理cookie 与基于线程池的数据爬取
引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如: #!/usr/bin/ ...
- scrapy框架基于CrawlSpider的全站数据爬取
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
- requests模块处理cookie,代理ip,基于线程池数据爬取
引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的. 一.基于requests模块 ...
随机推荐
- mysql导入数据报错:Incorrect datetime value
incorrect datetime value 报错信息如下图: 意思很明显是说,'0000-00-00 00:00:00'不是一个有效的日期类型的值 解决办法: sql_mode 中删除 NO_Z ...
- MVCC原理 4步 什么是MVCC、事务ACID、事物隔离级别、Innodb存储引擎是如何实现MVCC的
MVCC是来处理并发的问题,提高并发的访问效率,读不阻塞写.事物A 原子性C 一致性I 隔离性D 持久性高并发的场景下的问题脏读不可重复读幻读事物隔离级别RU读未提交 脏读/不可重复读/幻读 .不适用 ...
- LeetCode 第 164 场周赛
访问所有点的最小时间 不难看出,从点(x1,y1) 到 (x2,y2) 的步数需要 min(dx,dy),其中 dx = abs(x1-x2),dy = abs(y1-y2) class Soluti ...
- spark调优篇-数据倾斜(汇总)
数据倾斜 为什么会数据倾斜 spark 中的数据倾斜并不是说原始数据存在倾斜,原始数据都是一个一个的 block,大小都一样,不存在数据倾斜: 而是指 shuffle 过程中产生的数据倾斜,由于不同的 ...
- k8s-PV和PVC使用
上节课我们学习了 PV 的使用,但是在我们真正使用的时候是使用的 PVC,就类似于我们的服务是通过 Pod 来运行的,而不是 Node,只是 Pod 跑在 Node 上而已,所以这节课我们就来给大家讲 ...
- Educational Codeforces Round 71 (Rated for Div. 2) Solution
A. There Are Two Types Of Burgers 题意: 给一些面包,鸡肉,牛肉,你可以做成鸡肉汉堡或者牛肉汉堡并卖掉 一个鸡肉汉堡需要两个面包和一个鸡肉,牛肉汉堡需要两个面包和一个 ...
- Wannafly挑战赛22
B. 字符路径 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符,问图上有几条路径满足路径上经过的边上的字符组成的的字符串去掉空格后以大写字母开头,句号 '.' ...
- hdu 1281 匈牙利算法
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- bootstrap 处理警告
$("#id").bootstrapValidator({}).on('success.field.bv', function (e, data) { })
- 修改jumpserver源码并且实现一个自定义功能模块
在前面已经说了,如何打开jumpserver的管理控制台并且自定义自己的数据模型.接下来实现一个自定义的功能模块. 先看效果! 一 定义好自己的模型(model) 1.1 这一块儿在前一篇博文已经讲过 ...