本文目录

  • 写作缘起
  • 上代码
  • 思路分析
  • 效果展示
  • 写在最后

写作缘起

用python爬虫实现的图片资源下载器,一页页下载图片过于缓慢,当我们要欣赏一些好看的图片时一页页翻太复杂了,干脆写一个图片下载器

上代码

有点小长

import requests
import re
import os
import time
from bs4 import BeautifulSoup
from requests import RequestException
from tqdm import tqdm
import random# 梳理:文件结构 ./meizitu2/xiezhen/美少女写真图集/1.jpg-max_page.jpg
#               当前目录->类型文件夹->图组文件夹->图片文件
#               now->class_name->pages_name->page_nameheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36','Connection': 'close','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Referer': 'http://www.quanshuwang.com/','Accept-Encoding': 'gzip, deflate, sdch','Accept-Language':'zh-CN,zh;q=0.9'
}user_agent_list = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/61.0","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)","Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",]# 从列表中移除含param字符串的项
# 思路是查找然后保存下标,最后再一起删除
# 如果直接删除的话,会导致列表访问越界
def remove_some(lists, param):move = []i = len(lists)# 查找for j in range(i):if param in lists[j]:move.append(lists[j])# 删除for m in move:lists.remove(m)return lists# url去重
# 列表去重
# 思路是创建一个空列表,然后遍历旧列表加入不重复的元素
def doubleclear(li):new_li = []for i in li:if i not in new_li:new_li.append(i)return new_li# 参数1 链接列表 每一个链接对应一个图组
# 参数2 图片类型
def download(first_page_list,class_name):# 下载每个图组的第一页for i in tqdm(range(len(first_page_list))):first_page_url = first_page_list[i]# 重置pathpath = './meizitu2/' + class_nameif not os.path.exists(path):os.makedirs(path)max_page,path = downloadFirstPage(first_page_url,path)# 第一页下载完成 准备下载其他页# print(max_page+':'+path)for i in range(2,int(max_page)+1):downloadOtherPages(first_page_url,i,path)# 获取页面信息
def get_one_page(url):try:res = requests.get(url,headers=headers)res.encoding = res.apparent_encodingif res.status_code == 200:return resreturn Noneexcept RequestException:print("获取失败")# 下载图片
def saveImages(content, path,num):if not os.path.exists(path):os.mkdir(path)path = path+'/'+str(num)+'.jpg'# print('下载到'+path)with open(path,'wb') as f:f.write(content)f.close()# 下载其他页
def downloadOtherPages(first_page_url, i, path):url ='https://www.tupianzj.com'+first_page_url.rsplit('.',1)[0]+'_'+str(i)+'.html'# print('第'+str(i)+'页url为:'+url)html = get_one_page(url).text# 获取图片url并下载img_url = re.findall('src="(.*?)" id="bigpicimg"', html)[0]img = get_one_page(img_url).contentsaveImages(img, path, i)# 下载第一页
def downloadFirstPage(first_page_url,path):# print('原路径'+path+'\n')first_page_url = 'https://www.tupianzj.com'+first_page_url# print(first_page_url + "下载每个图组的第一页")html = get_one_page(first_page_url).text# 获取标题title = re.findall('<h1>(.*?)</h1>', html)[0]# print(title)# 获取最大页max_page = re.findall('<a.*?>共(.*?)页: </a>', html)[0]# print(max_page)# 获取图片url并下载img_url = re.findall('src="(.*?)" id="bigpicimg"', html)[0]img = get_one_page(img_url).contentpath = path+'/'+title# print(path+' 第一张图')saveImages(img,path,1)return max_page,pathif __name__ == '__main__':headers['User-Agent'] = random.choice(user_agent_list)isKeep = 'y'while isKeep == 'y':print('1.清纯 2.性感 3.古装\n4.艺术 5.车模 6.丝袜 ')choice = int(input('请输入你想要下载的图片类型(填序号):'))class_list =['xiezhen/','xinggan/','guzhuang/','yishu/','chemo/','siwa/']class_url = 'https://www.tupianzj.com/meinv/'+str(class_list[choice-1])classes = class_url.split('com',1)[1]# print(classes)res = requests.get(class_url,headers=headers)res.encoding=res.apparent_encodinghtml = res.text# print(html)soup = BeautifulSoup(html,'html.parser')# print(soup)# 图组第一页urlfirst_page_list = soup.select('div .list_con_box a')first_page_list = re.findall(r'<a href="(.*?)"',str(first_page_list))# 去掉无关的url链接,格式都是/meinv/这样的,刚好是类型for link in first_page_list:if link == classes:first_page_list.remove(link)# 去掉含'list'的无用连接first_page_list = remove_some(first_page_list,'list')# 去掉重复的url链接first_page_list = doubleclear(first_page_list)print('要爬取的链接列表:'+str(first_page_list))# 图片类型class_name = classes.split('/',-1)[-2]print(class_name) #xinggan 性感类型# 下载模块download(first_page_list,class_name)print('图片爬取完成')isKeep = input('是否继续下载(y/n):')print('')

思路分析

梳理:文件结构 ./meizitu2/xiezhen/美少女写真图集/1.jpg-max_page.jpg
当前目录->类型文件夹->图组文件夹->图片文件
now->class_name->pages_name->page_name

上面是图片的大概结构,首先在首页爬取每个图组的第一页图片所在的url,如下

这还不是能直接下载的图片,需要访问img下的src属性的链接,以二进制保存图片,如下


这样才算下载好了单张图片
关于如何解析就不详细说了,这个看正则、selector、bs4的知识就知道了
接下来要做的是把每个图组的所有照片全部保存到一个以首页标题命名的文件夹。具体思路如下:


通过比较我们能够发现规律,第一张图的url拼凑一个number可以得到后面所有页的url 比如第七页可以得到是 "https://www.tupianzj.com/meinv/20200728/214784_"+str(7)+".html",而且我们能够在第一页提取到图组的最大页数。这样通过一个循环就能访问所有图片了

经过整理,我给所有图片分了几个类型(网站现成的),通过输入数字选定相应的类型我们就可以依据自己的喜好下载了。

效果展示

爬取到的图片

写在最后

本程序采用的单线程,下载速度比较缓慢,为了及时看到进度,我做了进度条模块,通过下载引用tqdm模块就可以。比较好用方便。使用方法就是在一个循环里套上,如 for i in tqdm(range(len(first_page_list))):

之后看能不能把.py文件打包成.exe文件,然后再修改下存储路径就可以实现对非专业人士的用户友好体验了。

【爬虫实战】手把手教你使用python爬取美女图片相关推荐

  1. 手把手教你使用Python爬取西刺代理数据,不用担心我封IP了!

    /1 前言/ 前几天小编发布了手把手教你使用Python爬取西次代理数据(上篇),木有赶上车的小伙伴,可以戳进去看看.今天小编带大家进行网页结构的分析以及网页数据的提取,具体步骤如下. /2 首页分析 ...

  2. python爬取美女图片的练习

    python 爬取美女图片的练习 主要使用 xpath 定位获取 图片的链接 本次练习使用到os库 ,lmxl库 , requests库 import requests from lxml impor ...

  3. 手把手教你用python爬取人人贷网站借款人信息

    P2P是近年来很热的一个行业,由于这个行业在国内兴起才不久,国内的很多学者对这个行业都兴趣盎然,在大学研究互联网金融的学者更是有一大群.小编是学金融出身,深知数据在做学术研究的重要性,之前有不少学互联 ...

  4. python爬取京东商品数据要先登录_手把手教你用python 爬取京东评论

    本次python实战,主要目标是利用 Python爬取京东商品评论数,如上图所示:爬取"Python之父"推荐的小蓝书,这些信息主要包括用户名.书名.评论等信息. 爬取的网址url ...

  5. pythonqq音乐爬虫_手把手教你使用Python抓取QQ音乐数据(第二弹)

    [一.项目目标] 通过Python爬取QQ音乐数据(一)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 此次我们在之前的基础上获取QQ音乐指定歌曲的歌词及前15个精 ...

  6. python爬取物流信息_手把手教你用Python爬取快递100查询你的物流信息

    前言 我们经常会去查快递的物流单号,可是这些物流单号是从哪里来的呢? 快递鸟集合了多家快递公司查询接口,输入相应快递公司编码和快递单号就可以获取到对应的物流信息很方便快捷. 项目目标 教会大家如何用P ...

  7. Python网络爬虫(四):selenium+chrome爬取美女图片

    说明: Python版本:Python IDE:PyCharm chrome版本:我的版本63 chromedriver.exe:因为是模拟浏览器访问,chrome需要再下载一个驱动,具体方式在我的上 ...

  8. 【爬虫实战】手把手教你用Python爬取某图网4000张图片

    相信很多设计小伙伴有好的灵感,但是没有好的设计素材,今天它来了.摄图网4000张设计素材,取之不尽,如下图所示: 好了,废话不多说,开始用Python采集. 01需求分析 采集摄图网的素材图片,目标网 ...

  9. 【爬虫实战】手把手教你使用python爬取网络小说

    文章目录 写作缘起 上代码 思路分析 效果展示 写在最后 写作缘起 南墙最近发现自己常用的看小说网站多了许多广告,果然商业化的现今网上几无净土啊,便决定自己写个小说下载器,这样看小说贼爽 上代码 im ...

最新文章

  1. UIButton文字居左显示
  2. elasticsearch 集群no known master node
  3. 深入了解asp.net框架。生命周期以及事件处理机制
  4. mysql清除数据痕迹_MySQL使用痕迹清理~/.mysql_history - milantgh
  5. java 线程接口_java - 实现线程的接口
  6. Ruby设计模式透析之 —— 组合(Composite)
  7. LeetCode28.实现strStr() JavaScript
  8. 三星Bixby如此人性 小娜的下一步就是善解人意
  9. Matlab之三维曲面的绘制
  10. Mysql中Drop,Truncate,Delete的区别
  11. C# richTextBox重刷最后一行,richTextBox只更新最后一行
  12. 深度学习之RNN循环神经网络(理论+图解+Python代码部分)
  13. LeetCode-21. 合并两个有序链表_JavaScript
  14. 和陌陌一样,今天 Instagram 也在网页版上又迈了一步
  15. Liunx文件常用命令总结
  16. Arduino ESP8266当中的yield 函数
  17. matlab图像增强实验总结,图像处理实验报告
  18. 2021年中式烹调师(中级)考试题库及中式烹调师(中级)操作证考试
  19. linux(shell)查看文件时间戳
  20. EOS系列 - EOSIO 跨链通信

热门文章

  1. 小菜鸟的python进阶之路 ------- for循环打印四种形式的星星
  2. 阅读Skeleton.css源码,改善睡眠质量(尽管它只有419行代码)
  3. 2022.5.7 腾讯天美暑期实习(更新中)
  4. 如何查看linux服务器是否为amd64架构还是x86_64架构
  5. Threejs实现3D场景浏览器内存消耗过高导致浏览器卡顿崩溃刷新等问题解决办法以及3D场景在手机浏览器中画质不高的原因
  6. 从头开始训练BERT语言模型
  7. CentOS7目录结构详细版
  8. C++堆空间和栈空间的区别
  9. 天刀论剑显示服务器,天刀S2论剑 各段位奖励称号外观及属性一览
  10. prism 创建ViewModel