2018.08.30 Update:已经开源在 Github 代码仓库,内置页面美化与首页生成。。。

注:以下代码只能在 linux 下运行

引言

之前看到 github 上 ruanxingzhi dalao 的 bzojch(BZOJ 离线版)项目觉得很厉害,把 bzoj 的题目全部都爬到本地了,虽然没有数据但是也让我们这些蒟蒻能看权限题了。

显然我们需要一个爬虫来把网页爬下来。

对于 python 我是一无所知,所以我选择了 linux 的 shell。

运用 ubuntu 自带的 wget 工具来下载

代码

非常简单的代码:

#!/bin/bash
pid=1000;
#pid 是开始爬的题号

top=5057;
#top 是最后一题的题号
#程序会爬区间 [pid,top] 内的所有题目下来

path="http://www.lydsy.com/JudgeOnline/problem.php?id="
#题目路径公共前缀

echo "请输入 bzoj 用户名:";
read user_id;

echo "请输入 bzoj 密码:";
stty -echo
read password;
stty echo

wget --post-data="user_id=$user_id&password=$password" --save-cookies="./cookies.txt" --keep-session-cookies "http://www.lydsy.com/JudgeOnline/login.php"
#登录并获取 cookies

rm ./login.php
#删除没用的文件

while [ $pid -le $top ]; do
    echo "------------Getting Problem:$pid------------";
    wget -p -np -k --load-cookies="./cookies.txt" $path$pid;
    echo $pid"done.";
    let pid=pid+1;
done

代码中写好了注释,所以代码是什么意思我就不讲了。

爬虫虽然短,但是功能强大,能把题目爬取下来,而且还能把题目的图片爬取下来,再把那些指向原图的图片链接指向本地。

具体用法:

先把上面的代码写到一个 shell 脚本中去。

比如先新建一个文件:get_bzoj.sh

然后用 gedit 编辑那个文件,把上面的代码复制进去,保存。

然后在 get_bzoj.sh 所在的目录中打开终端,执行:

chmod +x ./get_bzoj.sh

然后再执行命令:

./get_bzoj.sh

就发现我们打开了爬虫,要求输入 bzoj 的用户名和密码,也就是你在 bzoj 上注册的用户名和密码。

这里要注意,如果要爬取权限题,你需要用权限号登录。

然后就开始愉♂快地爬取题目啦!

你会发现 get_bzoj.sh 所在的目录下出现了一个叫做 www.lydsy.com 的文件夹,里面有个叫 JudgeOnline 的文件夹,打开里面就有很多网页,格式都是:problem.php?id=???? 这样的,那么你把???? 改成你想看的题的题号就行啦!

具体自己琢磨吧。

分类: 文章

Remmina

No puzzle that couldn't be solved.

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注