技术分析:爬虫还用JPG?这个另类技术设计到一点值得我们思考,我们每次爬虫保存的图片都是默认JPG,为什么
技术关键代码:存储为位图,然后无损放大图片,就可以得到我们的效果了,还不懂的留言问我。 with open(''.join(name) + '.png', 'wb') as fw:fw.write(rr.content) img = Image.open(''.join(name) + '.png') img = img.resize((4000, 2000), Image.ANTIALIAS) # 改变大小 抗锯齿 # print(img.size) img.save(''.join(name) + '.png', quality=95) # 质量分数 95
如果看到这里觉得对你有帮助的,希望给个关注和赞,这是对我最大的支持! 项目技术:
获取分组网址和标题:
开始下载选择:
代码如下: def begin_down(title, url, headers): # 下载选择'''这里的参数为刚获取的标题和网址还有请求头''' print('白嫖方式下载高清图片'.center(30, '-')) for i, j in enumerate(title): print(i, '\t\t\t\t\t', j) inp = int(input('输入下载选项:')) # print(title[inp], url[inp]) get_image_1st(title[inp], url[inp], headers) # 调用第一页的网址进行下载 get_image(title[inp], url[inp], headers) # 下载剩下的所有页
这里获取的网址需要到下一步进行拼接,根据我的观察,分组网站的第一页和其他页网址不相连,没有规律可循,所以我写了爬取第一页和爬取其他页二个函数来获取图片,这里下面我也会说。 获取图片网址:
代码:
获得下载网址:
这里注意一点,我们获取的是src里面的图片网址,这个质量更高一点,便于我们修改画质,这里使用到了线程池和Image的使用,简单使用起来不是很难。 代码如下: def image_down(title, page_url, headers): # 下载图片 if not os.path.exists(title + '//'): os.mkdir(title + '//') os.chdir(title + '//') else: os.chdir(title + '//') for i, j in enumerate(page_url): # 遍历第一页的图表列表 r = requests.get(j, headers=headers) # 请求这个图片网址 if r.status_code == 200: r.encoding = r.apparent_encoding # 修改编码 html = etree.HTML(r.text) html = etree.tostring(html) html = etree.fromstring(html) # 以上搭建xpath对象 url = html.xpath(r'//a[@id='img']/img/@src') name = html.xpath(r'//a[@id='img']/img/@title') rr = requests.get('http://pic.netbian.com' + ''.join(url), headers=headers) if rr.status_code == 200: # 请求下载图片网址 rr.encoding = rr.apparent_encoding # 修改编码 with open(''.join(name) + '.png', 'wb') as fw: fw.write(rr.content) img = Image.open(''.join(name) + '.png') img = img.resize((4000, 2000), Image.ANTIALIAS) # 改变大小 抗锯齿 # print(img.size) img.save(''.join(name) + '.png', quality=95) # 质量分数 95 print(f'{title} 中第 {i + 1} 张下载完成!') else: print('错误啦')def pool_down(title, page_url, headers): # 线程下载 # print(title, len(page_url)) path = 'D://彼岸图库//' # 创建总的文件夹 if not os.path.exists(path): os.mkdir(path) os.chdir(path) else: os.chdir(path) # 创建一个多线程下载 pool = Pool(6) # 一次6下 if len(page_url) > 2: # 如果是其他网址 for i in page_url: pool.apply(image_down, args=(title, i, headers)) elif len(page_url) == 1: # 如果是第一页 pool.apply(image_down, args=(title, page_url, headers)) # 调用线程池 pool.close() pool.join()
项目经验:
项目后记:
|
|
来自: 紫竹林1ht2lcnc > 《Python》