存档 / 推荐 · 2021年4月11日 0

通过遍历 URL 来遍历网站资源

本文记述了作者是如何通过写低级代码来掠取高级趣味的。

几周前的旧坑

为了下载免费个人网页模板,经过小几周的努力,最终定位到了网站 www.mobanwang.com,其文件下载链接类似:

于是很容易写出:

#include <iostream>
int main()
{
    int id=0,n=30000;
    while(id<=n)
    {
        std::cout<<
        "http://www.mobanwang.com/mb/showsoftdown.asp?urlid=1&softid="
        <<id<<std::endl;
        ++id;
    }
    return 0;
}

编译,cmd 中用 test.exe > test.txt 保存输出,

就能用 Chrome + Chrono 插件进行批量下载了。

后来了解到这是重定向链接。另外在 Windows 下,该方案缺少效率,

当然,能用就行。

最近

了解到 Linux 下 wget -r -p -U Mozilla [url] 命令或许有用。

用云服务器运行 wget -r -p -U Mozilla http://www.mobanwang.com 却得不到资源,只有 .html 文件。

用浏览器自带的下载管理可以获得重定向链接,类似格式为:

访问文件目录,显而易见错误原因是 403 Forbidden

方案

简单思考,很容易想到用链接批量下载;

为了云服务器的磁盘空间,部分为了试试 Kali Linux,我真的花了半天时间在学校的电脑上装了 Linux,这篇笔记记录了我用过的参考资料。

剩下的半天和下一天的半天,我写出成品如下:

lo,counter1,counter2=200601,0,1
idn=lo*1000
if counter1<500:
    while lo<202105:
        idn=idn+1
        print("wget http://www.mobanwang.com/mb/UploadFiles_2010/lo",lo,"/",idn,".rar",sep="")
        counter1=counter1+1
        if counter1==500:
            lo=lo+1
            idn=lo*1000
            counter2=counter2+1
            counter1=0
        elif counter2==12:
            lo=lo+89
            counter2=1

随后用 python3 testa.py > GetUrl.log 保存输出,

重命名为 GetFile.sh,

执行 sudo ./GetFile.sh

效果

另外,这篇笔记记录了使用 C++ 的错误方案。


最新发现早些时候的链接类似:

可以用更新的代码对链接加以自定义:

CountID=0
CountM=1
location=input("前缀(如lo/myup): ")
StartY=int(input("起始年(如2007): "))
StartYAM=StartY*100+1
EndYM=int(input("结束年月(如202101): "))
EndYAM=EndYM+2
maxn=int(input("最大id: "))
idn=StartYAM*1000
if CountID<maxn-1:
    while StartYAM<EndYAM:
        idn=idn+1
        print("wget http://www.mobanwang.com/mb/UploadFiles_2010/",location,StartYAM,"/",idn,".rar",sep="")
        CountID=CountID+1
        if CountID==maxn:
            StartYAM=StartYAM+1
            idn=StartYAM*1000
            CountM=CountM+1
            CountID=0
        elif CountM==12:
            StartYAM=StartYAM+89
            CountM=1

稍改上方代码后更易理解的版本如下,虽然还没测试 ❗

id_counter=1
myup_lo=input("前缀: ")
year_month=int(input("起始年月: "))
temp=year_month//100
month_counter=year_month-temp*100
end_year_month=int(input("终止年月: "))
max_id_number=int(input("最大id: "))
file_name=year_month*1000+1
while year_month<=end_year_month:
    if month_counter<=12:
        print("wget http://www.mobanwang.com/mb/UploadFiles_2010/",myup_lo,year_month,"/",file_name,".rar",sep="")
        file_name=file_name+1
        id_counter=id_counter+1
        if id_counter>max_id_number:
            year_month=year_month+1
            month_counter=month_counter+1
            id_counter=1
    elif month_counter>12:
        year_month=year_month+88
        month_counter=1

最后,这篇一天之内惨遭作者修订几十次的文章总算在形式上结束了。

要认真获取资源的话,还是建议采用 wget -O [ID.rar] http://www.mobanwang.com/mb/showsoftdown.asp?urlid=1&softid=[ID] 形式。

可以参考如下代码:

id,max=1,20000
while id<=max:
    print(f"wget -O {id}.rar http://www.mobanwang.com/mb/showsoftdown.asp?urlid=1&softid={id}")
    id=id+1

让我们再深入些

上面的代码都是对整数的处理,如果把输入当作字符串,或许对理解,调试和执行代码有好处:

year_month=input("start year and month is ")
end=input("end year and month is ")
while year_month!=end
    print(f"")
    #update string, how ?

成品

Update:6,9,2021

old.py:

idCounter = 1
before = input("前缀(lo 或者 myup):")
YM = int(input("起始年月(如 201006):"))
currentY = YM // 100
tempY = currentY * 100
M = YM - tempY
endYM = int(input("终止年月(如 202106):"))
endID = int(input("最大 id:"))
tempYM = YM * 1000
YMID = tempYM + 1
log = open(r"D:/now.log", "a+")
while YM <= endYM:
    while M < 12: print( f"wget http://www.mobanwang.com/mb/UploadFiles_2010/{before}{YM}/{YMID}.rar | tr -d '\r'", file=log, )
        YMID = YMID + 1
        idCounter = idCounter + 1
        if idCounter > endID:
            YM = YM + 1
            M = M + 1
            idCounter = 1
            tempYM = YM * 1000
            YMID = tempYM + 1
    else:
        YM = YM + 88
        M = 1
else:
    log.close()

如果是 Windows,确保已经安装 Python,以管理员运行 Windows PowerShell,

& C:/Users/Administrator/AppData/Local/Programs/Python/Python39/python.exe c:/Users/Administrator/Desktop/old.py #依据具体情况自定义

D:\ 找到 now.log,.log 改为 .sh 放在 Linux 上执行,即可。