这篇文章上次修改于 301 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

起因

今天出于下载需要,去某个网站下载一个压缩包资源,但不幸的是那个东西有问题,六个镜像服务器,只有第六个有我要的资源,而且还报502了(其他资源没问题).但是压缩包内容是漫画,可以在线看,测试了一下,即使referer为空也可以访问,这不就简单了吗!于是我花了点时间来写了个简单的脚本下载这接近两百页的漫画.

首先我需要获取全部的链接,但很明显,这些图片之间并没有什么强关联,图片链接如下:

16371644929764.jpg
16371644949429.jpg
16371644972558.jpg
16371644990623.jpg
163716450086.jpg
16371645028933.jpg
16371645048686.jpg
16371645068188.jpg
16371645089279.jpg
16371645104181.jpg
1637164511633.jpg
16371645138722.jpg
16371645158262.jpg
1637164517908.jpg
16371645198571.jpg
16371645219287.jpg
16371645240703.jpg

一看就是时间戳命名的,但问题是零没了,所以图片看起来乱序了,那就直接保存到本地再来分析罢!于是我保存了这个一百多兆的网页资源,然后把不是漫画的资源全删了,果然是乱序的,而且离谱的是部分jpg文件后缀变成了webp,这是我没想到的,好在不算太多,我全手动改回去了.

既然拿到图片了那就好办了,在原来的网页通过查看网络请求复制这两百个链接(为什么只能复制屏幕内的,全选都不行,害得我漏了一个),保存为txt文本,然后交给Python去处理就好了.复制得到的图片格式为图片16371643313971.jpg图片1637164332882.jpg图片16371643340696.jpg这样的,带制表符,查找删除就好了.下面是处理+下载代码

from os import remove, write
import os
from urllib import request as urllib2
import requests

f_url='https://img3.hentaicomic.org/data/1338/42/'
p_url = 'http://pornhub.com/assets/img_bak/'
ua_headers = {
    'User-Agent': 'Visual Studio Code 1.62.3'
}
dic = {}
index = 0

with open('url.txt', mode='rt', encoding='utf-8') as f, open('url', mode='w', encoding='utf-8') as link:

    for i in f:
        urls = i.split('图片')

        # print(urls)
        for j in urls:
            if j:
                link.write(j.strip()+"\n")
                dic[index] = j
                index += 1
# print(dic)

if not os.path.exists('[風的工房][ゆきの] 1/10の花嫁 1 十等分的新娘 1'):

    os.makedirs('[風的工房][ゆきの] 1/10の花嫁 1 十等分的新娘 1')

for i in dic:
    # request = urllib2.Request(p_url+dic[i], data=None, method='GET')
    response = requests.get(f_url+dic[i], headers=ua_headers)

    with open('[風的工房][ゆきの] 1/10の花嫁 1 十等分的新娘 1/'+str(i+1)+'.jpg', mode='wb') as pic:

        for data in response.iter_content(128):
            pic.write(data)
        # remove(r'D:\XAMPP\htdocs\assets\img_bak\\'+dic[i])
        print('第'+str(i+1)+'张图片'+dic[i]+'下载完成')

上面的with是提取初始文本内容并转换成字典.保存为新文件只是为了方便我分析链接规律.下面的with则是下载图片的.上面说到我漏了一张,于是我就通过下载一张删一张来找到漏掉的图片,既然要删除,那就得做好备份了,所以我的文件夹名字为img_bak,通过remove(r'D:\XAMPP\htdocs\assets\img_bak\\'+dic[i])我成功的找到了漏掉的图片,并通过时间戳大小给它还原回去了.找到漏掉图片的上一张图,然后在源文件url.txt上补充就行了,再运行一遍就是最终结果.

问题

图片问题.以往我请求的内容基本都是json,这次是图片,所以在写入格式上要选择二进制模式,这点我想到了.但是我没想到还要分段,第一次报错的时候我的直觉告诉我是因为一次写入太多内容了,看到别人的实例,果然是这样,实例一次写入128个字节,我抄过去就可以正常写入文件了.

结束

最后是效果图

2021-11-19T11:56:37.png
2021-11-19T11:56:05.png