赞
踩
本来这是个正经的图片爬取教程,但是考虑到正经的教程一向是不会有人看的,所以干脆满足一下各位老绅士的心理,改成了E站的爬图教学。
事先声明,本博客本质上还是个爬虫教学,所以不会提供任何ehentai访问方式和黄涩链接(代码本身也无法自动翻墙访问ehentai)。由于E站访问的问题,爬虫的效率具体也和网络稳定率有关,所以失败并不一定是代码有问题。
博主并不常访问E站(不要说了,真的全是因为你们喜欢),所以对相关的页面并不是十分了解,如果有些页面反复使用该爬虫仍无法运行,那就可能是触及到了博主的知识盲区。(不要问了,博主是不会改的,博主诸事缠身)
提到爬虫,就不可避免地得提到F12开发者模式(可能有的系统按键有区别,大家懂意思就行)。因为网络本身就是一个接受HTML源码并在自己的机器上编译的过程,所以绝对不存在一个你能访问但是得不到源码的网址。
得到源码后,我们就可以利用我们强大的HTML技巧,从中获取我们需要的信息。下面举例说明:
总之,我们先打开一个不太涩的E站图集。然后F12打开源码,大概就是这样:

在源码中,我们仔细调查一番后,会发现所有的图片其实都存在一个id为gdt的类中,这个大类里包含着很多子类,每个gdtm子类都是一张图片的类。类中包含着图片的大小尺寸、背景颜色……以及最重要的:图片的链接。如下

找到链接后,我们要做的就是用正则表达式把每张图片的链接提取出来,具体式子视情况而定,这里大家直接看代码就好。
随后,我们进入网址,把图片一张一张地以二进制文件格式下载下来就可以啦。


后面的某个网址url加success表示网址为url的图片爬取成功。
如果出现fail+url的情况,说明该url识别后没有爬取成功,可自行访问该url并检查原因。
import urllib.request import urllib.parse import re import time headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } def get_picture(url, path, dex): imgList = [] req = urllib.request.Request(url=url, headers=headers, method='GET') try: response = urllib.request.urlopen(req, timeout=40) text = response.read().decode('utf-8') print("total success") except: return -1 picture = re.compile('<div class="gdtm".+?</div>', re.DOTALL) all_picture_txt =re.findall(picture, text) picture_link = re.compile('(?<=<a href=").+?(?=")', re.DOTALL) #目前支持jpg、png、jpeg、tif、webp、gif、bmp、eps、pcx、tga、svg、psd img_id = re.compile('(?<=<img id="img" src=").+?\.(jpg|png|jpeg|tif|webp|gif|bmp|eps|pcx|tga|svg|psd)', re.DOTALL) cnt = 0 for item in all_picture_txt: tmp_link = re.search(picture_link, item).group() req = urllib.request.Request(url=tmp_link, headers=headers, method='GET') flag = 0 for times in range(6): try: response = urllib.request.urlopen(req, timeout=15) text = response.read().decode('utf-8') cnt += 1 print(cnt, "success") except: continue else: flag = 1; break if flag: it = re.search(img_id, text) if it: imgList.append(it.group()) else: print('fail'+tmp_link) imgName = dex for imgPath in imgList: flag = 0 # ------ 这里最好使用异常处理及多线程编程方式 ------ for i in range(6): try: f = open(path+ str(imgName)+".jpg", 'wb') f.write((urllib.request.urlopen(imgPath)).read()) print(imgPath+' success') f.close() except: continue else: flag = 1; break if not flag: print("exception",str(imgName)) imgName += 1 def crawl_picture(url, path, start_dex = 0): for i in range(10000): print('page', i+1, 'started!') if i: out = get_picture(url+'?p='+str(i), path, start_dex) else: out = get_picture(url, path, start_dex) if out == -1: break start_dex += 40 if __name__ == '__main__': #crawl_picture('https://e-hentai.org/g/1742413/26779d61ba/', 'D:\\本子\\', 0) pass
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。