需求
我需要下载一个网站的内容,100gb的很多数量的文件。但是不是中国的网站。在中国的封闭网络下速度只有10kb/s的速度。
最重要的是,这个网站是http协议,不是https协议。这让文件正确性降低。虽然底层tcp协议能够确保传输正确,但是下载大量文件在这种网络下不会太可靠。
如果网站是https协议,就算10kb/s,频繁丢包,也能下个几天,只要下载完成了就行了,反正https是极端可靠的不会出错。他会在tcp之上再次进行强大的验证数据正确性,但是http协议,只有tcp底层的16位效验码保证不太可信。
我使用wget进行下载挂着慢慢下载。虽然链接稳定,没有中断过,一直在匀速下载,但是在下载了14gb数据之后我放弃挣扎。网络质量太差。
我决定使用vpn。我用hide.me vpn下载,一开始速度极快,600kb/s,后来vpn检测到我的程序在一直下载,就断开了我的网络,弹出提醒。
最后我想到cloudflare。使用cloudflare worker实现代理下载。利用cloudflare节点能够访问国外网络的特点。
部署过程
cf主页面有一个worker pages
直接创建helloworld
出现编辑区
直接输入代码,点击deploy,我用ai生成的代码进行简单的代理。
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const url = new URL(request.url);
// 直接代理到 abc.com
const targetUrl = 'https://abc.com' + url.pathname + url.search + url.hash;
const response = await fetch(targetUrl);
const modifiedResponse = new Response(response.body, response);
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
return modifiedResponse;
}
其中abc.com就是我要代理的网站
之后cf的创建的worker页面会有类似下面的worker地址,点击访问就行了,但是大概率不能直接访问。
workers.dev
dark-wildflower-xxxxx.xxxxxx.workers.dev
需要把worker绑定自己的域名,这样就可以直接通过自己的域名访问worker
在worker的setting里面,domains routes,点击add
直接选custom domain
在之后的对话框输入自己的域名就行了。前提是域名是自己的域名,通过cloudflare解析的,之前已经添加到cf里的。
比如可以设置一个二级域名
worker.yoursite.top
之后直接通过worker.yoursite.top访问就能够访问到abc.com这个网站。
测试
效果非常好。同一个文件下载
这是直接连接的速度,基本上30kb/s,之后会一直稳定在10kb/s,需要超过1h的时间下载。
52796 0%[ ] 1.02M 36.1KB/s eta 49m 58s52796 0%[ ] 1.02M 34.6KB/s eta 49m 58s52796 0%[ ] 1.03M 34.5KB/s eta 49m 58s52796 0%[ ] 1.05M 36.6KB/s eta 49m 58s52796 0%[ ] 1.06M 37.0KB/s eta 50m 34s52796 0%[ ] 1.07M 37.6KB/s eta 50m 34s52796 0%[ ] 1.07M 36.5KB/s eta 50m 34s52796 0%[ ] 1.08M 37.4KB/s eta 50m 34s52796 0%[ ] 1.09M 36.4KB/s eta 51m 34s52796 0%[ ] 1.10M 35.0KB/s eta 51m 34s52796 0%[ ] 1.11M 34.9KB/s eta 51m 34s
这是用了cf代理的,平均速度1.14mb/s,在2m30s下完了。
52796 100%[===================================================>] 155.30M 1.14MB/s in 2m 30s
总结
我发现其实不用cf也没有问题。直接连接网站速度虽然很慢,但是比较稳定一直是10kb/s,这代表只是速度限制,不是网络恶劣,频繁错误和丢包。因为它从未中断过连接,一直稳定下载。
如果是网络恶劣频繁数据出错和丢包重发,它的速度不可能稳定,会有剧烈变化,会频繁变成0kb。并且wget会频繁的出错和重试。现实就是之前下载了14gb的内容之后没有见过wget重试过。
所以我直连几乎也不会出错。只是要很多天连续下载。
后来我使用cf代理下载了2gb数据10000个文件,与之前直连下载的同样数量的文件进行验证,使用了自己开发的文件夹对比软件

发现只有几百个html文件不一致,这是正常的,因为同一个页面不同时间获取可能内容不一样。真正的资源文件完全一样,这说明之前的低速网络下能够正常传输。
扩展
现在国内的github加速代理可能就是这个原理。通过cf代理节点实现github加速访问。只需要改改worker代码就行了。
就是把一个代理网站加载github的前面。通过worker代理访问。一样的。
https://proxy.com/https://github.com/file