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

news/2024/7/19 11:31:25 标签: 爬虫, python, 数据挖掘

文章目录

  • 爬虫练习
  • 分析网站
  • 代码设计
  • 下载图片
  • 完整代码

爬虫练习

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)

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

在这里插入图片描述


http://www.niftyadmin.cn/n/204864.html

相关文章

大地量子联手亚马逊云科技,应对全球天气预报系统超大数据量挑战

大地量子成立于2017年,致力于打造行业顶尖的时空数据算法体系和计算架构,助力用户实现数据驱动的业务升级。近期,大地量子在新能源功率预测业务中使用了亚马逊云科技,来满足全球天气预报系统对高算力和网络传输的需求。大地量子还…

智能手表语音提示功能芯片选型?NV340D 8脚语音芯片

近年来,智能可穿戴设备逐渐受到消费者的追捧,其中就包括功能多样、佩戴方便的智能手表。智能手表除了有指示时间的功能之外,一般还具有提醒、导航、校准、监测、交互等其中一种或者多种功能。 智能手表实现语音提醒功能主要是置入了语音芯片&…

【Android】之【自定义View实践】

这里以一个进度条的加载为例子&#xff0c;先看效果&#xff08;运行效果是动态变化的&#xff09; 一、自定义属性 首先在res->values目录下新建attrs资源文件&#xff0c;如下图&#xff1a; 内容如下&#xff1a; <?xml version"1.0" encoding"utf…

indexDB数据导出到本地

打开您的浏览器开发者工具&#xff0c;切换到控制台选项卡。找到您想要导出的 IndexedDB 数据库&#xff0c;并在控制台中执行以下命令&#xff1a; var db; var requestindexedDB.open(meta2d-materials); request.onsuccessfunction(event){dbevent.target.result;var transa…

Go 性能加速器:你需要知道的 5 个诀窍和技巧

&#x1f447;我在这儿 通过这 5个诀窍和技巧来将那些运行缓慢&#xff0c;低效的 go 代码变成精简&#xff0c;高效&#xff0c;快速的机器代码。各位 Go 大师和初学者们&#xff0c;你们是否已经厌倦了那些慢得让你想要抓狂的 Go 应用程序&#xff1f;别担心&#xff0c;我们…

记录华夏ERP配置报错

记录华夏ERP配置报错 目录后端java: diamond operator is not supported in -source 1.5java: Compilation failed: internal java compiler errorjava: package org.mybatis.spring.annotation does not existbash: mysql: command not found...access denied for user rootlo…

混淆矩阵Confusion Matrix(resnet34 基于 CIFAR10)

目录 1. Confusion Matrix 2. 其他的性能指标 3. example 4. 代码实现混淆矩阵 5. 测试&#xff0c;计算混淆矩阵 6. show 7. 代码 1. Confusion Matrix 混淆矩阵可以将真实标签和预测标签的结果以矩阵的形式表示出来&#xff0c;相比于之前计算的正确率acc更加的直观…

kafka、zookeeper单点部署及调优

MQ的工作模式: 一对一(点对点): 一个生产者对应一个消费者&#xff0c;生产者写入数据&#xff0c;消费者消费数据后&#xff0c;数据将在MQ中被删除。 一对多(发布订阅): 一个生产者可以对应多个消费者&#xff0c;生产者写入数据&#xff0c;消费者消…