语言: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. [转帖]ECC公钥格式详解

    ECC公钥格式详解 https://www.cnblogs.com/xinzhao/p/8963724.html 本文首先介绍公钥格式相关的若干概念/技术,随后以示例的方式剖析DER格式的ECC公钥, ...

  2. 利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据

    利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据 实现描述:将数据存放在js对象中, 然后放在父页面的document对象中, 在页面刷新的时候将父页面的值取出来, ...

  3. Spark Scala当中reduceByKey(_+_) reduceByKey((x,y) => x+y)的用法

    [学习笔记] reduceByKey(_+_)是reduceByKey((x,y) => x+y)的一个 简洁的形式*/ val rdd08 = sc.parallelize(List((1, ...

  4. 缓存穿透 & 缓存雪崩 & 缓存击穿

    一 缓存穿透 1. 行为 查询一个一定不存在的数据.存储层(姑且认为是db,下面都用db指代)查不到数据则不写入缓存,那么下次请求这个不存在的数据同样会到db层查询,失去了缓存的意义.流量大或人为恶意 ...

  5. cmake 升级

    cmake 升级 1下载   cmake-3.1.0.tar.gz2.解压 3.执行  ./configure 4.执行 make 5. 执行   sudo make install 6.添加环境变量 ...

  6. 怎样限制第三方Cookie

    使用Cookie的 SameSite 属性. 1. SameSite=Strict; 这个模式下, 服务器将会完全禁止第三方Cookie, 在跨站点时, 任何情况下都不会发送Cookie, 也就是说, ...

  7. StoneTab标签页CAD插件 3.2.0

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  8. 1、windows安装npm教程 --参考自https://www.cnblogs.com/jianguo221/p/11487532.html

    windows安装npm教程   1.在使用之前,先类掌握3个东西,明白它们是用来干什么的: npm:  nodejs 下的包管理器. webpack: 它主要用途是通过CommonJS 的语法把所有 ...

  9. js摄像头

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  10. Linux设备驱动中的软件架构思想

    目录 更新记录 一.Linux驱动的软件架构 1.1 出发点 1.2 分离思想 1.3 分层思想 二.platform设备驱动 2.1 platform设备 2.2 platform驱动 2.3 pl ...