python爬虫实战:Oculus VR

帮朋友写的一个爬虫,爬一个网站的所有VR游戏。在这之前我都还不知道还有这个VR(虚拟现实)游戏。我也是通过写这个爬虫才学会pycurl+BeautifulSoup 的用法。

安装模块

我使用的是第三方模块pycurl+BeautifulSoup。需要另外安装这两个模块,不然脚本无法运行,会报错。

BeautifulSoup:中文文档
pycurl:下载地址选择对应的版本下载安装。

开始编写爬虫

开始之前我们先分析下我们需要爬的内容。我们要的是每个游戏的真实下载地址。

既然是下载所有的游戏,我们就得知道每一页的网址,在这里 http://d.87870.com/xiazai-2-0603-1_.html
xiazai-2 这里的2是页数,知道了总页数我们就可以爬出所有页的每个游戏点击立即下载后跳转到的游戏下载页面。

如上图,点击游戏下载就可以下载游戏。但是没有登录的话是不让你下载的,这就要我们写脚本时要用到cookie。

大概思路就是这样了。开始写代码。

我用pycurl封装了一个函数

def GetData(url, ProxyIP=None,reffer=None,cookie=None):
    b = StringIO.StringIO()
    c = pycurl.Curl()
    c.setopt(pycurl.WRITEFUNCTION, b.write)
    c.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0")
    c.setopt(pycurl.URL, url)
    if ProxyIP:
        c.setopt(pycurl.PROXY,ProxyIP)
    if cookie:
        c.setopt(pycurl.COOKIEFile,cookiefile) #使用 firebug导出的cookie文件
    if reffer:
        c.setopt(pycurl.REFERER,reffer)
    c.perform()
    return b.getvalue()

用来获取网络数据,

获取总页数

使用firebug分析游戏目录页最下方的页数,html代码如下。

<html>
 <head></head>
 <body>
  <div class="pageNav"> 
   <a href="xiazai-1-0603-1_.html">首页</a> 
   <a href="xiazai-7-0603-1_.html">上一页</a> 
   <a href="xiazai-3-0603-1_.html">3</a> 
   <a href="xiazai-4-0603-1_.html">4</a> 
   <a href="xiazai-5-0603-1_.html">5</a> 
   <a href="xiazai-6-0603-1_.html">6</a> 
   <a href="xiazai-7-0603-1_.html">7</a> 
   <a class="current">8</a> 
   <a href="xiazai-9-0603-1_.html">9</a> 
   <a href="xiazai-10-0603-1_.html">10</a> 
   <a href="xiazai-11-0603-1_.html">11</a> 
   <a href="xiazai-12-0603-1_.html">12</a> 
   <a href="xiazai-9-0603-1_.html">下一页</a> 
   <a href="xiazai-60-0603-1_.html">尾页</a> 
   <em>共60页</em> 
  </div>
 </body>
</html>

总页数就是60页,编写python代码如下:

def GetPageCount(url):
    data = GetData(url)
    soup = BeautifulSoup(data)
    da = soup.select('.pageNav')
    page = re.findall(u"共(.*?)页", da[0].text)[0]
    return page

获取游戏下载页面

现在已经知道有多少页了,随便找一页查看html源码。

 <li><a href="xiazainr-6299.html" target="_blank" title="超级涡轮·忍者兔(Super Turbo Atomic Ninja Rabbit Experience)">
                                        <img src="http://pic.87870.com/upload/images/vr87870/2015/9/16/th_170x170_339d0126-f4c3-44f4-921e-0ff9f57534cb.jpg" alt="超级涡轮·忍者兔(Super Turbo Atomic Ninja Rabbit Experience)">
                                        </a>
                                        <div class="content">
                                            <p class="title"><a href="xiazainr-6299.html" target="_blank" title="超级涡轮·忍者兔(Super Turbo Atomic Ninja Rabbit Experience)">超级涡轮·忍者兔(Super Turbo Atomic Ninja Rabbit Experience)</a></p>
                                            <p>2015-09-16 | 633.85M</p>
                                            <p>类型:Oculus Rift适配</p>
                                            <p>适配:Oculus DK2</p>
                                            <p>外设:无</p>
                                            <p class="link">

                                                下载方式:免费
                                            </p>
                                            <a href="xiazainr-6299.html" class="download_btn" target="_blank">立即下载</a>
                                        </div>
                                    </li>


                                    <li><a href="xiazainr-6296.html" target="_blank" title="冰箱历险记(Boursin Sensorium Virtual Reality Experience)">
                                        <img src="http://pic.87870.com/upload/images/vr87870/2015/9/16/th_170x170_dbc06a5e-4e19-4c81-a457-1f9c2353f59e.jpg" alt="冰箱历险记(Boursin Sensorium Virtual Reality Experience)">
                                        </a>
                                        <div class="content">
                                            <p class="title"><a href="xiazainr-6296.html" target="_blank" title="冰箱历险记(Boursin Sensorium Virtual Reality Experience)">冰箱历险记(Boursin Sensorium Virtual Reality Experience)</a></p>
                                            <p>2015-09-16 | 821.64M</p>
                                            <p>类型:单机</p>
                                            <p>适配:Oculus Rift</p>
                                            <p>外设:无</p>
                                            <p class="link">

                                                下载方式:60幸福币
                                            </p>
                                            <a href="xiazainr-6296.html" class="download_btn" target="_blank">立即下载</a>
                                        </div>
                                    </li>

发现游戏下载页面都在这个位置,

<a href="xiazainr-6296.html" class="download_btn" target="_blank">立即下载</a>

编写代码如下:

def GetGameDownloadPage(url):
    DownloadPageList = []
    data = GetData(url)
    soup = BeautifulSoup(data)

    da   = soup.select(".download_btn")
    for u in da:
        DownloadPageList.append('http://d.87870.com/'+u['href'])
    return DownloadPageList

每一页有很多游戏,返回这一页所有游戏的下载页面。

游戏下载页面的源码如下:

<div class="topic relative">
                    <h1>恐怖医院(THE HOSPITAL HAUNTED BE LOST)</h1>
                    <div class="comment relative">
                        <i></i>
                        <p class="overflow">小编简评:《恐怖医院(THE HOSPITAL HAUNTED BE LOST)》是由MAD虚拟现实工作室开发,这个团队来自泰国最古老且最有名望的私立大学&mdash;&mdash;泰国斯巴顿大学。该工作室将泰国本土恐怖元素和VR游戏融合在一起,光从恐怖惊悚氛围上已经达到了上乘之作。
                        </p>
                    </div>
                    <div class="info">
                        <p>
                            游戏类型:<strong class="fd3939">Oculus DK2</strong>游戏大小:<strong class="fd3939">366.69M</strong>适配眼镜:<strong class="fd3939">DK2</strong>
                        </p>
                        <p>
                            操作系统:<strong class="fd3939">Windows7</strong>更新时间:<strong class="fd3939">2016-04-13</strong> 下载方式:60幸福币
                        </p>
                    </div>

                    <div class="for_download clearfix">
                        <a class="download" href="http://d.87870.com/dl.aspx?id=9972">游戏下载</a>

游戏下载地址在最后一行。访问这个地址会重定向到游戏的真实下载地址。

# 得到游戏的下载地址
def GetGameDownloadURL(pageURL):
    data = GetData(pageURL)
    soup = BeautifulSoup(data)
    try:
        da = soup.select(".download")
    except Exception,e:
        pass
    return da[0]['href']

直接使用pycurl下载游戏时会丢包,因为文件比较大,需要pycurl分块下载。最后main函数如下,我只是获取了每个游戏的真实下载地址。

def main():
    downloadPageList = []
    count = GetPageCount('http://d.87870.com/xiazai-1-0603-1_.html')

    #获取所有页的游戏下载页面
    for page in range(1,int(count)):
        url = 'http://d.87870.com/xiazai-%d-0603-1_.html'% page
        downloadPageList.extend(GetGameDownloadPage(url))
    for u in downloadPageList:
        downurl = GetGameDownloadURL(u)
        data = GetData(downurl,reffer=u)
        if "store.steampowered.com" in data:
            continue

        GameURL = re.findall('<a href=\"(.*?)\">here',data,re.S)[0]

最后附上完整的代码:github

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 安装模块
  2. 2. 开始编写爬虫
    1. 2.1. 获取总页数
  3. 3. 获取游戏下载页面
,