语言: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. 【1.0】shell常用信息

    [1]获取IP地址 /sbin/ifconfig|grep -A1 -E "^eth0|em2"|grep "inet addr"|awk -F':' '{pr ...

  2. DP_Milking Time

    Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that sh ...

  3. numpy数组常用计算

    在说numpy库数组的计算之前先来看一下numpy数组形状的知识: 创建一个数组之后,可以用shape来查看其形状,返回一个元组 例如:a = np.array([[1, 2, 3], [4, 5, ...

  4. 关于python中的包,模块导入的问题详解(一)

    最近由于初学python,对包,模块的导入问题进行了资料的搜集,查阅,在这里做一个总结: 一: import 模块 在import的过程中发生了什么?我们用一个实验来说明: 以上截图表明:在impor ...

  5. 怎样解决忘加new关键字所造成的问题

    通过构造函数 "new" 一个对象出来时, 如果忘记写这个 new, 那这个构造函数就不会返回一个实例对象, 而是会像普通函数一样执行. 下面是两种规避忘记写new时所引发的问题的 ...

  6. OkHttp3 + retrofit2 封装

    0.下载文件 1.gradle 添加 compile 'com.squareup.retrofit2:retrofit:2.1.0'compile 'com.squareup.retrofit2:co ...

  7. Docker 启动SQLServer

    1.运行这个命令   docker run -d -e SA_PASSWORD=Docker123  -e SQLSERVER_DATABASE=qgb -e SQLSERVER_USER=sa -e ...

  8. Python爬取爱奇艺资源

    像iqiyi这种视频网站,现在下载视频都需要下载相应的客户端.那么如何不用下载客户端,直接下载非vip视频? 选择你想要爬取的内容 该安装的程序以及运行环境都配置好 下面这段代码就是我在爱奇艺里搜素“ ...

  9. octave 笔记

    1. 画函数 >> x = [-4:0.5:6] >> y = x.^2 - x - 6 >> plot(y)

  10. 对于div里面内容过大根据长度或者宽度进行适配,然后可以滚轮缩放的功能

    在做3000的项目中,因为页面的svg很大,但是做的只是适配电脑,打开肯定是看不全的,要看全就必须进行滚动,可是客户提出了将页面放在电视机上面,用电视输入网址直接访问,这样问题就来了,电视上怎么进行滚 ...