爬虫日常练习-艾图网单页面图片爬取

2023-10-27

爬虫练习

hello,大家好。好久不见了,无聊的网友今天开始更新关于爬虫的一些日常练习。每次学习完一个新的知识后没有多的案例给自己练习真的很不舒服,希望该系列文章能够让刚刚开始学习爬虫的各位练练手。今天首先对艾图网发起挑战。链接在此: https://www.iituku.com/

分析网站

要想写好一个爬虫,最重要的就是先对要爬取的网页进行分析,只有对网页知根知底,我们才能更好地写出一个优秀的爬虫
在这里插入图片描述我们可以看到这是一个多分钟类的免费图片下载网站,我们先选择旅游模块,点击后页面跳转新的界面
在这里插入图片描述我们注意看此时的url,细心的xdm应该能想到,这个就是我们需要爬取的网页url。因为我们这里只是做一个简单的图片爬取,所以只需要具体的url就可以了,如果后面想要做一个自动化图片爬取程序的话就得换另一种思路,过一阶段在和xdm细说。
在这里插入图片描述
点击一个图片可以看到页面提供了下载功能
在这里插入图片描述
但xdm能满足于此吗?当然不能
在这里插入图片描述懂事的兄弟直接一套右键检查图片的组合拳下去
在这里插入图片描述哦呦,居然直接把图片的下载链接暴露在我们面前,这不摆明了看不起兄弟们?
在这里插入图片描述
但我不得不提醒xdm一下哈,可别轻易相信它的表面,谨慎的我选择检查页面源代码,检查一下标题在不在
在这里插入图片描述你瞧瞧,心急的兄弟得被气死,真实的页面根本没有给你图片的链接。所以说凡事要小心啊兄弟们。我们一定要以页面源代码为准,不要轻信经过页面处理的elements
在这里插入图片描述

不信邪的我又去看来看是不是ajex加载的数据,结果也没有翻到,不对劲,十分有九分的不对劲。这个时候我灵机一动,把图片的文件名到源码中检查一下

在这里插入图片描述
果不其然,在源码中发现了猫腻
在这里插入图片描述缓慢往前滑动发现图片链接保存在列表嵌套的字典里

在这里插入图片描述既然知道了图片链接在哪里,那就话不多说,直接定下小目标,先把链接拿到手
在这里插入图片描述

代码设计

首先第一步,导入基本要使用的第三方库,并把要爬取的图片种类的url设置好

import requests
from lxml import etree

if __name__ == '__main__':
    url = "https://www.iituku.com/lvyou.html"
    get_pic_url(url)

然后定义一个获取图片链接的方法,经过我的测试发现图片的链接所在位置如下图所示,数据存在于body里的第二个script中,决定使用正则将数据提取出来
在这里插入图片描述

def get_pic_url(url):
    resp = requests.get(url).text
    tree = etree.HTML(resp)
 	pic_url_string = tree.xpath('//html/body/script[2]/text()')[0]
    obj = re.compile(r'var imagesarr=\"(.*?)\";')
    data = obj.findall(pic_url_string)[0]
    print(data)

为了下面顺利进行,我们先测试一下
在这里插入图片描述可以看到最后匹配到的结果并不是我们想要的形式,我们还需要进行处理使它变为我们在前端看到的样子。暂时转为字符串格式利用replace方法替换掉

data = str(data).replace('"','')

在这里插入图片描述可以看到烦人的&quot已经消失了,接下来只要提取到链接就可以
由于我们现在得到的已经是字符串格式的数据了,只能采用字符串的方法进行处理。我们可以看到返回的数据通过{}分为一个个小整体,可以通过split来切割数据,这样我们就可以获取一个列表数据

data_list = data.split('}')

获得数据如下
在这里插入图片描述通过for循环与re获取图片链接,这里我发现不带/nu的链接获取的图片清晰度更高些,因此获取不带/nu的链接

    for li in data_list:
        http = re.findall(r'picture:(.*?)/nu', li)
        http = str(http).replace(r'\\', '')
        print(http)

在这里插入图片描述此处获取的结果如上图,一开始想用索引直接提取出字符串,结果一直报错超出索引,后来才发现有的列表获取到的是空值,因此我们还需要价格判断,不然会报错如下
在这里插入图片描述对代码改动一下

    for li in data_list:
        http = re.findall(r'picture:(.*?)/nu', li)
        if not http:
            continue
        else:
            http_str = http[0]
        http = http_str.replace('\\', '')
        print(http)

ok兄弟们看看效果,完美获取到图片链接
在这里插入图片描述

下载图片

获取到所有图片后就可以开始下载图片了

def download(list):
    for src in list:
        resp = requests.get(src)
        pic_name = src.split('/')[-1]
        with open('./'+pic_name, mode='wb') as f:
            f.write(resp.content)
        print('下载完成')

运行完成后可以看到图片已经全部下载完成
在这里插入图片描述

完整代码

完整代码如下:

import requests
from lxml import etree
import re


def get_pic_url(url):
    resp = requests.get(url)
    resp.encoding = 'utf-8'
    tree = etree.HTML(resp.text)
    pic_url_string = tree.xpath('//html/body/script[2]/text()')[0]
    obj = re.compile(r'var imagesarr=\"(.*?)\";')
    data = obj.findall(pic_url_string)[0]
    data = str(data).replace('"', '')
    data_list = data.split('}')
    pic_url_list = []
    for li in data_list:
        http = re.findall(r'picture:(.*?)/nu', li)
        if not http:
            continue
        else:
            http_str = http[0]
        http = http_str.replace('\\', '')
        pic_url_list.append(http)
    return pic_url_list


def download(list):
    for src in list:
        resp = requests.get(src)
        pic_name = src.split('/')[-1]
        with open('./'+pic_name, mode='wb') as f:
            f.write(resp.content)
        print('下载完成')


if __name__ == '__main__':
    url = "https://www.iituku.com/lvyou.html"
    pic_url_list = get_pic_url(url)
    download(pic_url_list)

在这里插入图片描述打开工作目录就可以看到精美的图片已经下载完成啦
明天接着更新多页面图片爬取以及协程和进程的方式

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫日常练习-艾图网单页面图片爬取 的相关文章

随机推荐

  • 手把手教你搭建Scala开发环境 步骤详细

    个人主页 csdn春和 推荐专栏 JavaWeb专栏 从入门到实战超详细 本期文章 搭建Scala开发环境 如果对您有帮助还请三连支持 定会一 一回访 本文目录 一 Scala开发环境搭建 1 1 安装scala 1 2 scala插件安装
  • scala学习-12-scala读取java项目下Src目录下的properties文件

    1 概述 scala读取java项目下Src目录下的properties文件 package scala import java util Properties import java io FileInputStream import s
  • springbootweb请求响应

    web三层架构流程 先是前端传送一个请求给后端 然后controller层接受数据进行处理 传给service层进行逻辑处理再交给dao层 dao层访问数据库 数据库再返回数据给dao层 然后再传给service层处理 最后回到contro
  • ResourceUtils

    ResourceUtils org springframework util ResourceUtils 从资源路径获取文件 判断字符串是否是一个合法的 URL 字符串 static boolean isUrl String resourc
  • Java自动装箱和自动拆箱

    基本类型的包装类 在java中 每一种基本类型都有一个对应的包装类 这些类都在java lang包中 8种基本数据类型所对应的包装类是byte Byte short Short int Integter long Long char Cha
  • 【金融系列】使用Python分析债券,画零息利率曲线,对债券进行精确定价,计算债券的麦考利久期、修正久期和凸度,并进行价格敏感性分析

    目前许多代码和资源在进行债券定价时 大多以债券发行日作为贴现值的时间点 但在实际应用中我们常常需要对早就发行的债券进行定价 这就需要计算准确的现金流 现金流日距离当前贴现时间点的时间距离和不同时间距离的零息利率 这一过程会较多使用插值法 还
  • css中的渐变的属性,CSS3 渐变属性(Gradients)-线性渐变(linearGradient)

    通过使用 CSS3 渐变 gradients 你可以减少下载的事件和宽带的使用 此外 渐变效果的元素在放大时看起来效果更好 因为渐变 gradient 是由浏览器生成的 丛本质上来说 既然 background image 属性中的渐变是浏
  • element框架table多选分页时保留原有选中项(vue2和vue3均适用)

    element中table表格多选 分页 1 表格多选 手动添加一个 el table column 设 type 属性为 selection 即可
  • DLT(Direct Linear Transform)算法

    一 定义 直接线性变换解法是建立像点的 坐标仪坐标 和相应物点的物方空间坐标直接的线性关系的解法 直接线性变换解法的特点 不归心 不定项 不需要内外方位元素的起始值 物方空间需布置一组控制点 特别适合于处理非量测相机所摄影像 本质是一种空间
  • 数据结构常用的算法

    一 排序算法 本质上就是按照某种顺序将一组数排好 分多次重复进行 每次只负责把一个数字放到合适的位置上 两种思路 先确定一个数字 然后根据数据找合适的位置 先确定一个位置 根据位置找合适的数字 1 冒泡排序算法 先确定位置 选最前面或者最后
  • 解决protobuf内存泄漏的3种办法

    1 protobuf对象是如何释放 数组 内存的 毫无疑问是 通过调用析构函数 只要让protobuf定义的对象调用析构函数 无论嵌套了多少层数据 包含了多少个数组都可以释放new出来的内存 2 protobuf对象Clear 接口和STL
  • clickhouse系列第三篇之clickhouse客户端使用教程(1.命令行客户端连接)

    文章目录 一 客户端支持的配置项 1 配置项的配置方式 1 1 从命令行传入 1 2 配置文件 2 配置项列表 二 客户端用法 1 非交互模式 1 1 query 参数指定执行语句 1 2 query 参数和发送到stdin的数据联合使用
  • JVM -- 类加载(七)

    一 加载 将类的字节码载入方法区中 内部采用 C 的 instanceKlass 描述 java 类 它的重要 field 有 java mirror 即 java 的类镜像 如对 String 来说 就是 String class 作用是
  • 前端 报错处理(长期更新 2023.9.06)

    目录 一 ECharts 相关 1 1 Error yAxis 0 not found 1 2 Cannot read properties of undefined reading 0 1 3 Cannot read properties
  • Python编程:从入门到实践 动手试一试之8-6

    根据之前学习的返回字典先写了一版 定义函数city countyr 并定义两个形参guojia和city def city country guojia city 定义函数国家和对应的城市 C city guo guojia chen ci
  • 推荐微信小程序常用的几个UI组

    1 WeUI WeUI 是一套同微信原生视觉体验一致的基础样式库 由微信官方设计团队为微信 Web 开发量身设计 可以令用户的使用感知更加统一 包含button cell dialog progress toast article acti
  • ubuntu下安装软件的方法

    一 ubuntu下软件安装 ubuntu系统下 软件安装方法有几种 常用的方法如下 1 使用 apt 工具安装 2 deb 软件包安装 3 自己下载程序源码编译安装 4 通过 ubuntu系统自带的软件中心安装 这种方法不常用 因为一直不太
  • python中SSL/TLS认证失败的解决方案

    重装了ubuntu22 04版本的系统后 跑yolov5的train py脚本时出现以下报错 原因是本地计算机上缺少了需要的根证书 File home anaconda3 envs py37 lib python3 7 urllib req
  • PaddleGAN

    产品动态 人脸编辑神器 StyleGAN V2人脸属性编辑之年龄变换 时光穿梭机 一键实现变老变年轻 完整在线教程 视频超分SOTA算法PP MSVSR 一行命令从 马赛克 到 高清影像 完整在线教程 人脸编辑神器 StyleGAN V2人
  • 爬虫日常练习-艾图网单页面图片爬取

    文章目录 爬虫练习 分析网站 代码设计 下载图片 完整代码 爬虫练习 hello 大家好 好久不见了 无聊的网友今天开始更新关于爬虫的一些日常练习 每次学习完一个新的知识后没有多的案例给自己练习真的很不舒服 希望该系列文章能够让刚刚开始学习