只用50行Python代码爬取网络美女高清图片


Posted in Python onJune 02, 2021

一、技术路线

requests:网页请求
BeautifulSoup:解析html网页
re:正则表达式,提取html网页信息
os:保存文件

import re
import requests
import os
from bs4 import BeautifulSoup

二、获取网页信息

常规操作,获取网页信息的固定格式,返回的字符串格式的网页内容,其中headers参数可模拟人为的操作,‘欺骗'网站不被发现

def getHtml(url):  #固定格式,获取html内容
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }  #模拟用户操作
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print('网络状态错误')

三、网页爬取分析

右键单击图片区域,选择 ‘审查元素' ,可以查看当前网页图片详情链接,我就满心欢喜的复制链接打开保存,看看效果,结果一张图片只有60几kb,这就是缩略图啊,不清晰,果断舍弃。。。

只用50行Python代码爬取网络美女高清图片
只用50行Python代码爬取网络美女高清图片

没有办法,只有点击找到详情页链接,再进行单独爬取。

空白右键,‘查看页面源代码',把刚刚复制的缩略图链接复制查找快速定位,分析所有图片详情页链接存在div标签,并且class=‘list' 唯一,因此可以使用BeautifulSoup提取此标签。并且发现图片详情页链接在herf=后面(同时我们注意到有部分无效链接也在div标签中,观察它们异同,发现无效链接存在'https'字样,因此可在代码中依据此排出无效链接,对应第4条中的函数代码),只需提取出来再在前面加上网页首页链接即可打开,并且右键图片,‘审查元素',复制链接下载的图片接近1M,表示是高清图片了,到这一步我们只需调用下载保存函数即可保存图片

只用50行Python代码爬取网络美女高清图片

只用50行Python代码爬取网络美女高清图片

四、网页详情页链接获取

根据第3条分析的情况,首要目标是将每页的每个图片的详情页链接给爬取下来,为后续的高清图片爬取做准备,这里直接定义函数def getUrlList(url):

def getUrlList(url):  # 获取图片链接
    url_list = []  #存储每张图片的url,用于后续内容爬取
    demo = getHtml(url)
    soup = BeautifulSoup(demo,'html.parser')
    sp = soup.find_all('div', class_="list") #class='list'在全文唯一,因此作为锚,获取唯一的div标签;注意,这里的网页源代码是class,但是python为了和class(类)做区分,在最后面添加了_
    nls = re.findall(r'a href="(.*?)" rel="external nofollow"  rel="external nofollow" ', str(sp)) #用正则表达式提取链接
    for i in nls:
        if 'https' in i: #因所有无效链接中均含有'https'字符串,因此直接剔除无效链接(对应第3条的分析)
            continue
        url_list.append('http://www.netbian.com' + i) #在获取的链接中添加前缀,形成完整的有效链接
    return url_list

五、依据图片链接保存图片

同理,在第4条中获取了每个图片的详情页链接后,打开,右键图片'审查元素',复制链接即可快速定位,然后保存图片

def fillPic(url,page):
    pic_url = getUrlList(url) #调用函数,获取当前页的所有图片详情页链接
    path = './美女'  # 保存路径
    for p in range(len(pic_url)):
        pic = getHtml(pic_url[p])
        soup = BeautifulSoup(pic, 'html.parser')
        psoup = soup.find('div', class_="pic") #class_="pic"作为锚,获取唯一div标签;注意,这里的网页源代码是class,但是python为了和class(类)做区分,在最后面添加了_
        picUrl = re.findall(r'src="(.*?)"', str(psoup))[0] #利用正则表达式获取详情图片链接,因为这里返回的是列表形式,所以取第一个元素(只有一个元素,就不用遍历的方式了)
        pic = requests.get(picUrl).content #打开图片链接,并以二进制形式返回(图片,声音,视频等要以二进制形式打开)
        image_name ='美女' + '第{}页'.format(page) + str(p+1) + '.jpg' #给图片预定名字
        image_path = path + '/' + image_name #定义图片保存的地址
        with open(image_path, 'wb') as f: #保存图片
            f.write(pic)
            print(image_name, '下载完毕!!!')

六、main()函数

经过前面的主体框架搭建完毕之后,对整个程序做一个前置化,直接上代码

在这里第1页的链接是http://www.netbian.com/meinv/

第2页的链接是http://www.netbian.com/meinv/index_2.htm

并且后续页面是在第2页的基础上仅改变最后的数字,因此在写代码的时候要注意区分第1页和后续页面的链接,分别做处理;同时在main()函数还增加了自定义爬取页数的功能,详见代码

只用50行Python代码爬取网络美女高清图片

def main():
    n = input('请输入要爬取的页数:')
    url = 'http://www.netbian.com/meinv/'  # 资源的首页,可根据自己的需求查看不同分类,自定义改变目录,爬取相应资源
    if not os.path.exists('./美女'):  # 如果不存在,创建文件目录
        os.mkdir('./美女/')
    page = 1
    fillPic(url, page)  # 爬取第一页,因为第1页和后续页的链接的区别,单独处理第一页的爬取
    if int(n) >= 2: #爬取第2页之后的资源
        ls = list(range(2, 1 + int(n)))
        url = 'http://www.netbian.com/meinv/'
        for i in ls: #用遍历的方法对输入的需求爬取的页面做分别爬取处理
            page = str(i)
            url_page = 'http://www.netbian.com/meinv/'
            url_page += 'index_' + page + '.htm' #获取第2页后的每页的详情链接
            fillPic(url, page) #调用fillPic()函数

七、完整代码

最后再调用main(),输入需要爬取的页数,即可开始爬取,完整代码如下

import re
import requests
import os
from bs4 import BeautifulSoup

def getHtml(url):  #固定格式,获取html内容
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }  #模拟用户操作
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print('网络状态错误')

def getUrlList(url):  # 获取图片链接
    url_list = []  #存储每张图片的url,用于后续内容爬取
    demo = getHtml(url)
    soup = BeautifulSoup(demo,'html.parser')
    sp = soup.find_all('div', class_="list") #class='list'在全文唯一,因此作为锚,获取唯一的div标签;注意,这里的网页源代码是class,但是python为了和class(类)做区分,在最后面添加了_
    nls = re.findall(r'a href="(.*?)" rel="external nofollow"  rel="external nofollow" ', str(sp)) #用正则表达式提取链接
    for i in nls:
        if 'https' in i: #因所有无效链接中均含有'https'字符串,因此直接剔除无效链接(对应第3条的分析)
            continue
        url_list.append('http://www.netbian.com' + i) #在获取的链接中添加前缀,形成完整的有效链接
    return url_list

def fillPic(url,page):
    pic_url = getUrlList(url) #调用函数,获取当前页的所有图片详情页链接
    path = './美女'  # 保存路径
    for p in range(len(pic_url)):
        pic = getHtml(pic_url[p])
        soup = BeautifulSoup(pic, 'html.parser')
        psoup = soup.find('div', class_="pic") #class_="pic"作为锚,获取唯一div标签;注意,这里的网页源代码是class,但是python为了和class(类)做区分,在最后面添加了_
        picUrl = re.findall(r'src="(.*?)"', str(psoup))[0] #利用正则表达式获取详情图片链接,因为这里返回的是列表形式,所以取第一个元素(只有一个元素,就不用遍历的方式了)
        pic = requests.get(picUrl).content #打开图片链接,并以二进制形式返回(图片,声音,视频等要以二进制形式打开)
        image_name ='美女' + '第{}页'.format(page) + str(p+1) + '.jpg' #给图片预定名字
        image_path = path + '/' + image_name #定义图片保存的地址
        with open(image_path, 'wb') as f: #保存图片
            f.write(pic)
            print(image_name, '下载完毕!!!')

def main():
    n = input('请输入要爬取的页数:')
    url = 'http://www.netbian.com/meinv/'  # 资源的首页,可根据自己的需求查看不同分类,自定义改变目录,爬取相应资源
    if not os.path.exists('./美女'):  # 如果不存在,创建文件目录
        os.mkdir('./美女/')
    page = 1
    fillPic(url, page)  # 爬取第一页,因为第1页和后续页的链接的区别,单独处理第一页的爬取
    if int(n) >= 2: #爬取第2页之后的资源
        ls = list(range(2, 1 + int(n)))
        url = 'http://www.netbian.com/meinv/'
        for i in ls: #用遍历的方法对输入的需求爬取的页面做分别爬取处理
            page = str(i)
            url_page = 'http://www.netbian.com/meinv/'
            url_page += 'index_' + page + '.htm' #获取第2页后的每页的详情链接
            fillPic(url_page, page) #调用fillPic()函数

main()

到此这篇关于只用50行Python代码爬取网络美女高清图片的文章就介绍到这了,更多相关Python爬取图片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python类定义的讲解
Nov 01 Python
Python脚本实现集群检测和管理功能
Mar 06 Python
简单介绍Python中的struct模块
Apr 28 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 Python
详解Python中where()函数的用法
Mar 27 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
使用python进行拆分大文件的方法
Dec 10 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
python中类的输出或类的实例输出为这种形式的原因
Aug 12 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
Apr 15 Python
python redis存入字典序列化存储教程
Jul 16 Python
这样写python注释让代码更加的优雅
Jun 02 #Python
上帝为你开了一扇窗之Tkinter常用函数详解
只用20行Python代码实现屏幕录制功能
TensorFlow中tf.batch_matmul()的用法
Jun 02 #Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 #Python
python flask开发的简单基金查询工具
python爬取网页版QQ空间,生成各类图表
You might like
Windows IIS PHP 5.2 安装与配置方法
2009/06/08 PHP
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
解析PHP中如何将数组变量写入文件
2013/06/06 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
如何离线执行php任务
2017/02/21 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
Python中的变量和作用域详解
2016/07/13 Python
Python贪心算法实例小结
2018/04/22 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
表演方阵解说词
2014/02/08 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏