语言: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】【基础知识】【模块】【Python的常用模块】

    在IDE解释器中,执行help('modules')可查看当前环境可调用的Python模块: >>> help('modules') Please wait a moment whi ...

  2. celery异步任务

    1.安装 pip install celery 2.创建celery_tasks文件夹,创建config配置文件和main文件 # 在config.py文件中配置中间人broker地址信息 - red ...

  3. 微信小程序 路由跳转 异步请求 存储数据,微信登录接口

    1小程序路由跳转 wx.switchTab(Object object) 这里的tabBar是底下的导航栏指定的页面 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 tabBar l ...

  4. 《精通Windows API-函数、接口、编程实例》——第4章文件系统

    第4章文件系统 4.2 磁盘和驱动器管理 文件系统的基本概念:包括磁盘分区,卷,目录,文件对象,文件句柄,文件映射1.磁盘分区:物理磁盘,逻辑磁盘2.卷:也称逻辑驱动器,是NTFS,FAT32等文件系 ...

  5. IOC+EF+Core项目搭建IOC注入及框架(二)

    配置ServiceCollection /// <summary> /// 表示IServiceCollection的扩展 /// </summary> public stat ...

  6. 设计模式风格<二>;消息总线

    以前开发的动车模拟驾驶系统,有好几个软件(不在一台机器上),他们互相之间通信,因此每个软件要配置每个模块的IP和端口,就是每个模块都要知道别的模块的端口和IP. 这样有个重复的地方,B模块和C模块都要 ...

  7. js中逻辑运算符||和&& 的返回值并不只有true和false

    以前我一直认为逻辑运算符的返回值一直是true或者false,其实根本就没考虑过它又返回值,一直是在if判断语句中作为一个条件使用,只是为了能让条件正确与否进入if语句.根本就没用到逻辑运算符的返回值 ...

  8. 手工实现HttpBasic校验

      HttpBasic: 是RFC中定义的一种控制HTTP协议访问资源的方式.具体当HTTP请求受限资源时,就需要在请求头中添加以"Authorization"为key的heade ...

  9. Python学习记录4-列表、元祖和集合

    list列表 一组由有序数据组成的序列 数据有先后顺序 数据可以不是一类数据 list的创建 直接创建,用中括号创建,内容直接用英文逗号隔开 使用list创建 列表包含单个字符串的时候是一个特例 # ...

  10. dropbear源码编译安装及AIDE软件监控

    ssh协议的另一个实现:dropbear源码编译安装:• 1.安装开发包组:yum groupinstall “Development tools”• 2.下载 -2017.75.tar.bz2    ...