上古网盘长啥样?批量下载复古游戏资源

上古网盘长啥样?批量下载复古游戏资源

最近买到一台复古掌机 周哥k101可以拿来玩fc、gba的游戏:

作者将游戏的rom全部放在一个上古网盘里:永硕E盘
可是该网盘不提供打包下载,需要一个一个手动下载
这怎么可以呢,我写了一个爬虫来打包下载网盘里的所有游戏


先来一张图:

再来看看官网:


是不是一股浓浓的2000年风格呢?
老游戏存在老网盘里,真的别有一番感觉呢!
哎呀,突然就回想起小学时候去黑网吧玩红警的岁月(暴露年龄了~)

虽然网盘界面比较古老
但我发现这个网盘的技术非常厉害
一会分析代码的时候会详细说一下
毕竟是存活了将近二十年的网盘!

思路分析

刚开始我以为,这种老的网站,直接请求页面
然后解析出下载地址就可以
当我开始动手做才发现我太天真了:

  • 所有的文件数据都是通过AJAX得来
  • 服务器有权限的验证
  • 文件的下载地址是动态的,一段时间后会失效

这就意味着我们要分析里面的js请求
经过一段时间的抓包观察,我提取出两个api请求

# urlbase,参数分别是网盘名,和分类id
list_base_url = 'http://c1.ys168.com/f_ht/ajcx/ml.aspx?cz=ml_dq&_dlmc={}'
detail_base_url = 'http://c1.ys168.com/f_ht/ajcx/wj.aspx?cz=dq&mlbh={}&_dlmc={}'

网盘服务器是通过参数:_dlmc 、mlbh来动态返回数据
其中:

  • _dlmc 网盘的id 例如fcnes就是fc吧网盘的id
  • mlbh 资源的id,例如ACT游戏的id是 1139186

知道这些之后思路就明确了:

  • 第一个api请求列表页
  • 解析列表页所有根目录分类的id
  • 第二个api请求详情页
  • 解析详情页中的文件名和下载地址
  • 下载文件

部分代码

这里不全部讲解,主要说两个问题:

  • 请求头的构造
  • 文件的下载方式

所谓请求头就是headers cookies啦

用到了一个我写的爬虫小工具lazyspider
可以方便的帮我们从curl中解析出headerscookies

关于lazyspider可以看这里:zhuanlan.zhihu.com/p/32
from lazyspider.lazyheaders import LazyHeaders
# 获取cookies 和headers
raw_curl = "curl 'xxxxxx'"
lz = LazyHeaders(raw_curl)
COOKIES = lz.getCookies()
HEADERS = lz.getHeaders()
# 这样我们就得到了字典格式的headers和cookies啦 

文件的下载

前两天一个小伙伴通过值乎问我怎么利用爬虫下载网上的pdf论文

吐槽一下ios手续费!!!

这里就牵扯到一个数据的保存形式问题了
实际上数据在互联网里的都是通过二进制流的形式来传输的

所谓流文件在代码里可以理解为bytes类型
无论是:文本、图片、视频、音乐其本质都是二进制

所以无论什么样的东西,我们都是可以下载的
requests模块里,我们这样用就行:

def get_html_response(url):
    try:
        r = requests.get(url, headers=HEADERS, cookies=COOKIES)
        r.raise_for_status
        # 返回bytes类型数据
        return r.content
    except:
        return -1 

完整的代码可以去我的GitHub看,我就不贴上来了
代码是我在高铁上写的,稍微有点粗糙,
但实际上,永硕E盘的所有数据都能下载
只要找到对应的入口url就可以啦
有兴趣的小伙伴可以在我的代码上进行二次开发
还能做个网盘下载工具呢!

最后看一下成果

代码跑起来是这样的

最后下载好的游戏


另外资源我也上传到百度云了

微信公众号 findyourownway 回复 fc游戏
就能获得百度云链接哟

每天的学习记录都会 同步更新到:
微信公众号: findyourownway

知乎专栏:zhuanlan.zhihu.com/Ehco
Blog : www.ehcoblog.ml
GitHub: github.com/Ehco1996/Pyt

编辑于 2017-12-28

文章被以下专栏收录