语言:python

环境ubuntu

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

使用相关:urllib,lxml,selenium,chrome

解释:

  流程图如下

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

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

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

  1. 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") 找到搜索框,模拟输入对应的游戏名字。进行搜索,得到了新的页面,再通过如下正则表达式得到销量

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

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

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

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

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

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

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

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

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

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

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

  1. 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. reload(sys)
  96. sys.setdefaultencoding('utf-8')
  97.  
  98. urls = []
  99. inputfilename = "urls.txt"
  100. inputfile = file(inputfilename,'r')
  101. emptyflag = 0
  102. while not emptyflag:
  103. nowline = inputfile.readline()
  104. if(nowline == ""):
  105. emptyflag = 1
  106. else:
  107. urls.append(nowline)
  108. inputfile.close()
  109.  
  110. gamelinklist = []
  111. for urli in urls:
  112. html = getHtml(urli)
  113. gamelinklist.extend(getGameLink(html))
  114.  
  115. salefilename = "gamesales.txt"
  116. salefile = file(salefilename,"w")
  117. for gamelinki in gamelinklist:
  118. sale = getSale(gamelinki)
  119. print sale
  120. print >> salefile,gamelinki
  121. print >> salefile,sale
  122. print >> salefile,"sale end"
  123. print gamelinki+"--sale end"
  124. salefile.close()
  125.  
  126. tagfilename = "gametags.txt"
  127. tagfile = file(tagfilename,"w")
  128. for gamelinki in gamelinklist:
  129. html = getHtml(gamelinki)
  130. taglist = getTag(html)
  131. print taglist
  132. print >> tagfile,gamelinki
  133. for tagi in taglist:
  134. print >> tagfile,tagi
  135. print >> tagfile,"tag end"
  136. print gamelinki+"--tag end"
  137. tagfile.close()
  138.  
  139. reviewfilename = "gamereviews.txt"
  140. reviewfile = file(reviewfilename,"w")
  141. lst = ""
  142. for gamelinki in gamelinklist:
  143. reviewlinklist = getReviewLink(gamelinki)
  144. print reviewlinklist
  145. print >> reviewfile,gamelinki
  146. for reviewlinki in reviewlinklist:
  147. if(reviewlinki != lst):
  148. html = getHtml(reviewlinki)
  149. review = getReview(html)
  150. print >> reviewfile,review
  151. print >> reviewfile,"a review end"
  152. lst = reviewlinki
  153. print >> reviewfile,"review end"
  154. print gamelinki+"--review end"
  155. 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. 小菜鸟之liunx

    目录 第一章:Linux简介 1 Linux特点 1 CentOS 1 第二章:Linux安装 2 Linux目录结构 2 第三章:Linux常用命令 2 Linux命令的分类 3 操作文件或目录常用 ...

  2. IDEA插件之FindBugs

    1.是个啥? Findbugs,它是一个静态分析工具,用来查找Java代码中的程序错误.它使用静态分析来识别Java程序中上百种不同类型的潜在错误. 2.安装 File -> Settings ...

  3. Redis 数据结构 & 原理 & 持久化

    一 概述 redis是一种高级的key-value数据库,它跟memcached类似,不过数据可以持久化,而且支持的数据类型也很丰富. Redis支持五种数据类型:string(字符串),hash(哈 ...

  4. windows10下无U盘安装ubuntu18 使用EasyUEFI(一点点体会)

    一.看BIOS 先看看自己电脑的是哪种启动模式  win+R 输入 msinfo32  查看自己电脑是哪种 (UEFI还是Legacy BIOS启动模式) 查看完之后  如果是UEFI的话 go on ...

  5. 用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中

    现代生活中,我们很难不与excel表打交道,excel表有着易学易用的优点,只是当表中数据量很大,我们又需要从其他表册中复制粘贴一些数据(比如身份证号)的时候,我们会越来越倦怠,毕竟我们不是机器,没法 ...

  6. Docker 镜像的制作

        1.登录docker            docker ecex –it 容器名/容器id /bin/bash        例如:            docker exec –it t ...

  7. Python【函数使用技巧】

    写成“子函数+主函数”的代码结构,也是因为每个不同的功能封装在单独的函数代码中,方便后续修改.增删 import math # 变量key代表循环运行程序的开关 key = 1 # 采集信息的函数 d ...

  8. java项目上线的流程(将web项目部署到公网)

    本博文来源于网络,原文的地址在本篇博文最下方. 如何将java web项目上线/部署到公网 关于如何将Java Web上线,部署到公网,让全世界的人都可以访问的问题.小编将作出系列化,完整的流程介绍. ...

  9. k8s之dashboard认证、资源需求、资源限制及HeapSter

    1.部署dashboard kubernetes-dashboard运行时需要有sa账号提供权限 Dashboard官方地址:https://github.com/kubernetes/dashboa ...

  10. Nginx安装启动过程报错libpcre.so.1 cannot open shared object file: No such file or directory

    具体报错信息如下: nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: ...