语言: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游戏相关数据的爬虫的更多相关文章

  1. 基于steam的游戏销量预测 — PART 3 — 基于BP神经网络的机器学习与预测

    语言:c++ 环境:windows 训练内容:根据从steam中爬取的数据经过文本分析制作的向量以及标签 使用相关:无 解释: 就是一个BP神经网络,借鉴参考了一些博客的解释和代码,具体哪些忘了,给出 ...

  2. python爬虫 爬取steam热销游戏

    好久没更新了啊...最近超忙 这学期学了学python 感觉很有趣 就写着玩~~~ 爬取的页面是:https://store.steampowered.com/search/?filter=globa ...

  3. 基于云开发开发 Web 应用(三):云开发相关数据调用

    介绍 在完成了 UI 界面的实现后,接下来可以开始进行和云开发相关的数据对接.完成数据对接后,应用基础就打好了,接下来的就是发布上线以及一些小的 feature 的加入. 配置 在进行相关的配置调用的 ...

  4. scrapy爬取youtube游戏模块

    本次使用mac进行爬虫 mac爬虫安装过程中出现诸多问题 避免日后踩坑这里先进行记录 首先要下载xcode ,所以要更新macOS到10.14.xx版本 更新完之后因为等下要进行环境路径配置 但是ma ...

  5. 基于爬取百合网的数据,用matplotlib生成图表

    爬取百合网的数据链接:http://www.cnblogs.com/YuWeiXiF/p/8439552.html 总共爬了22779条数据.第一次接触matplotlib库,以下代码参考了matpl ...

  6. 爬虫实战--基于requests和beautifulsoup的妹子网图片爬取(福利哦!)

    #coding=utf-8 import requests from bs4 import BeautifulSoup import os all_url = 'http://www.mzitu.co ...

  7. requests模块session处理cookie 与基于线程池的数据爬取

    引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如: #!/usr/bin/ ...

  8. scrapy框架基于CrawlSpider的全站数据爬取

    引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...

  9. requests模块处理cookie,代理ip,基于线程池数据爬取

    引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的. 一.基于requests模块 ...

随机推荐

  1. Python+requests重定向和追踪

    Python+requests重定向和追踪 一.什么是重定向 重定向就是网络请求被重新定个方向转到了其它位置 二.为什么要做重定向 网页重定向的情况一般有:网站调整(如网页目录结构变化).网页地址改变 ...

  2. 一个包含python和java环境的dockerfile

    现在一个项目中遇到python调用java的jar包的环境.为了方便发布,编写了这个dockerfile,作为基础镜像. #this docker file is used to build runt ...

  3. 在springMVC框架中集成quartz作业调度器

    1.首先需要导入这几个jar包,如下图: 其中log4j,quartz,slf4j-api,slf4j-log4j12我是在项目中都引用了 2.引用完jar包后,新建一个作业调度类,执行作业调度逻辑, ...

  4. (十二)springMvc 处理图片,视频等文件的上传

    文章目录 导包 修改表单类型 配置解析器 处理上传的图片 补充一个自己写的工具类 导包 需要导入如下的包 commons-fileupload-1.3.3.jar commons-io-2.6.jar ...

  5. LG P2285 [模板]负环(spfa判负环)

    题目描述 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入格式 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 接下来M行,每 ...

  6. resful规范: 进行数据交换时的代码潜规则

    目前主流的三种web服务交互方案: REST (Representational State Transfer) 表征性状态转移 SOAP (Simple Object Access Protocol ...

  7. Django学习(2.2.1版本)

    项目技术重难点分析: 模型层:模型是您的数据唯一而且准确的信息来源.它包含您正在储存的数据的重要字段和行为.一般来说,每一个模型都映射一个数据库表. 每各模型都是一个python的类,这些类继承  d ...

  8. oracle练手(一)

    练手001 1.列出至少有一个员工的所有部门 select dname from dept where deptno in (select deptno from emp); select dname ...

  9. C++反汇编第四讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.

    目录: 1.多重继承在内存中的表现形式 多重继承在汇编中的表现形式 2.菱形继承 普通的菱形继承 虚继承 汇编中的表现形式 一丶多重继承在内存中的表现形式 高级代码: class Father1 { ...

  10. 1-MySQL DBA笔记-理解MySQL

    第一部分 入门篇 本篇首先介绍MySQL的应用领域.基础架构和版本,然后介绍MySQL的基础知识,如查询的执行过程.权限机制.连接.存储引擎,最后阐述一些基础概念. 第1章 理解MySQL 本章将介绍 ...