基于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模块 ...
随机推荐
- 实时监控服务器某个端口状态TCPing
在给客户做运维服务期间,发现了一个奇怪的现象:备份系统(第三方国产)告警日志显示,每天晚上备份服务器的客户端在3点左右离线然后上线,再离线再上线,每晚两次,很是诡异. 联系了厂家技术支持,前后花了两天 ...
- selenium模块基础用法详解
目录 selenium模块 官方文档 介绍 安装 有界面浏览器 无界浏览器 selenium+谷歌浏览器headless模式 基本使用 选择器 基本用法 xpath 获取标签属性 等待元素被加载 隐式 ...
- S02_CH01_Hello World实验
S02_CH01_Hello World实验 ZYNQ是一款SOC芯片,在前面第一季的学习当中,我们只是粗略的学习了ZYNQ的PL部分,对于ZYNQ最突出的功能,其内部的双核Cortex-A9内核并未 ...
- sleep(0)、usleep(0)与sched_yield() 调度
结论: 如果你是为了耗掉一个机器周期 ,那直接asm ("nop") , 如果是为了让权,建议把 所有使用 usleep(0) 换成 sched_yield() ; 最近发现很多 ...
- Markdown: Syntax Text
Markdown: Syntax Text https://daringfireball.net/projects/markdown/syntax.text Markdown: Syntax ==== ...
- Django rest-framework框架-用户权限实例
简单实例: class MyPermission(object): ''' 权限控制类 ''' def has_permission(self,request,view): if request.us ...
- SSE指令集加速之 I420转BGR24
void yuv420_to_rgb24_sse3(uint8_t *yp, uint8_t *up, uint8_t *vp, int sy, int suv, int width, int hei ...
- 关于SpringBoot的自动配置和启动过程
一.简介 Spring Boot简化了Spring应用的开发,采用约定大于配置的思想,去繁从简,很方便就能构建一个独立的.产品级别的应用. 1.传统J2EE开发的缺点 开发笨重.配置繁多复杂.开发效率 ...
- arcgis js之地图分屏同步
arcgis js之地图分屏同步 原理: 新建两个map两个view或者一个map两个view.对地图进行移动事件绑定,在地图移动时同步地图方位 代码: views.forEach((view) =& ...
- WaitType:ASYNC
项目组有一个数据库备份的Job运行异常,该Job将备份数据存储到remote server上,平时5个小时就能完成的备份操作,现在运行19个小时还没有完成,backup命令的Wait type是 AS ...