使用多线程或异步技术提高图片抓取效率

news2024/10/1 21:27:24

亿牛云代理.jpg

导语

图片抓取是爬虫技术中常见的需求,但是图片抓取的效率受到很多因素的影响,比如网速、网站反爬机制、图片数量和大小等。本文将介绍如何使用多线程或异步技术来提高图片抓取的效率,以及如何使用爬虫代理IP来避免被网站封禁。

概述

多线程和异步技术都是利用计算机的并发能力来提高程序的执行速度。多线程是指在一个进程中创建多个线程,每个线程可以独立地执行一部分任务,从而实现任务的并行处理。异步技术是指在一个线程中使用非阻塞的方式来执行任务,当遇到耗时的操作时,不会等待其完成,而是继续执行其他任务,从而实现任务的并发处理。使用多线程或异步技术可以有效地减少图片抓取的等待时间,提高图片抓取的效率。爬虫代理IP是指通过第三方服务器来访问目标网站,从而隐藏自己的真实IP地址。使用爬虫代理IP可以有效地防止被目标网站识别和封禁,提高图片抓取的成功率。

正文

本文将以Python语言为例,介绍如何使用多线程或异步技术来实现图片抓取,并使用亿牛云爬虫代理来提供代理IP服务。首先,需要导入一些必要的模块,如requests、threading、asyncio、aiohttp等:

# 导入模块
import requests
import threading
import asyncio
import aiohttp

然后,需要定义一个函数来获取图片的URL列表,这里假设目标网站是https://unsplash.com/,一个提供免费高清图片的网站。可以使用requests模块来发送HTTP请求,并使用BeautifulSoup模块来解析HTML文档,提取图片的URL:

# 定义函数获取图片URL列表
def get_image_urls():
    # 目标网站URL
    url = 'https://unsplash.com/'
    # 亿牛云 爬虫代理域名、端口、用户名、密码
    proxy_host = 'http://www.16yun.cn'
    proxy_port = '8080'
    proxy_user = '16YUN'
    proxy_pass = '16IP'
    # 构造代理URL
    proxy_url = f'{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}'
    # 构造代理字典
    proxies = {
        'http': proxy_url,
        'https': proxy_url
    }
    # 发送HTTP请求,获取响应内容
    response = requests.get(url, proxies=proxies)
    html = response.text
    # 解析HTML文档,提取图片URL
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    images = soup.find_all('img', class_='oCCRx')
    image_urls = [image['src'] for image in images]
    # 返回图片URL列表
    return image_urls

接下来,需要定义一个函数来下载并保存图片,这里假设将图片保存在当前目录下的images文件夹中。可以使用requests模块来下载图片,并使用os模块来创建文件夹和文件:

# 定义函数下载并保存图片
def download_and_save_image(image_url):
    # 亿牛云 爬虫代理域名、端口、用户名、密码
    proxy_host = 'http://www.16yun.cn'
    proxy_port = '8080'
    proxy_user = '16YUN'
    proxy_pass = '16IP'
    # 构造代理URL
    proxy_url = f'{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}'
    # 构造代理字典
    proxies = {
        'http': proxy_url,
        'https': proxy_url
    }
    # 下载图片,获取图片内容
    response = requests.get(image_url, proxies=proxies)
    image_data = response.content
    # 创建images文件夹,如果不存在
    import os
    if not os.path.exists('images'):
        os.mkdir('images')
    # 从图片URL中提取图片文件名
    image_name = image_url.split('/')[-1]
    # 拼接图片文件路径
    image_path = os.path.join('images', image_name)
    # 保存图片文件
    with open(image_path, 'wb') as f:
        f.write(image_data)

最后,需要定义一个主函数来调用上述两个函数,并使用多线程或异步技术来提高图片抓取的效率。这里分别介绍两种方法:

  • 使用多线程技术:可以使用threading模块来创建多个线程对象,并将下载并保存图片的函数作为线程的目标函数,将图片URL作为线程的参数,然后启动所有线程,并等待所有线程结束:
# 定义主函数使用多线程技术
def main_threading():
    # 获取图片URL列表
    image_urls = get_image_urls()
    # 创建空列表存储线程对象
    threads = []
    # 遍历图片URL列表,创建并启动线程对象
    for image_url in image_urls:
        # 创建线程对象,指定目标函数和参数
        thread = threading.Thread(target=download_and_save_image, args=(image_url,))
        # 将线程对象添加到列表中
        threads.append(thread)
        # 启动线程对象
        thread.start()
    # 遍历线程对象列表,等待所有线程结束
    for thread in threads:
        thread.join()
  • 使用异步技术:可以使用asyncio模块来创建一个事件循环对象,并将下载并保存图片的函数改写为一个异步函数,使用aiohttp模块来发送异步HTTP请求,并使用asyncio模块的gather函数来收集所有的异步任务,并在事件循环中执行:
# 定义主函数使用异步技术
def main_asyncio():
    # 获取图片URL列表
    image_urls = get_image_urls()
    # 创建事件循环对象
    loop = asyncio.get_event_loop()
    # 定义异步函数下载并保存图片
    async def download_and_save_image_async(image_url):
        # 亿牛云 爬虫代理域名、端口、用户名、密码
        proxy_host = 'http://www.16yun.cn'
        proxy_port = '8080'
        proxy_user = '16YUN'
        proxy_pass = '16IP'
        # 构造代理URL
        proxy_url = f'{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}'
        # 构造代理字典
        proxies = {
            'http': proxy_url,
            'https': proxy_url
        }
        # 使用aiohttp模块发送异步HTTP请求,获取图片内容
        async with aiohttp.ClientSession() as session:
            async with session.get(image_url, proxy=proxy_url) as response:
                image_data = await response.read()
        # 创建images文件夹,如果不存在
        import os
        if not os.path.exists('images'):
            os.mkdir('images')
        # 从图片URL中提取图片文件名
        image_name = image_url.split('/')[-1]
        # 拼接图片文件路径
        image_path = os.path.join('images', image_name)
        # 保存图片文件
        with open(image_path, 'wb') as f:
            f.write(image_data)
    # 创建空列表存储异步任务对象
    tasks = []
    # 遍历图片URL列表,创建并添加异步任务对象
    for image_url in image_urls:
        # 创建异步任务对象,指定异步函数和参数
        task = asyncio.ensure_future(download_and_save_image_async(image_url))
        # 将异步任务对象添加到列表中
        tasks.append(task)
    # 使用asyncio模块的gather函数收集所有的异步任务对象
    tasks = asyncio.gather(*tasks)
    # 在事件循环中执行所有的异步任务对象,并等待其完成
    loop.run_until_complete(tasks)

结语

本文介绍了如何使用多线程或异步技术来提高图片抓取的效率,以及如何使用代理IP来避免被网站封禁。通过使用多线程或异步技术,可以有效地减少图片抓取的等待时间,提高图片抓取的效率。通过使用代理IP,可以有效地防止被目标网站识别和封禁,提高图片抓取的成功率。本文以Python语言为例,给出了相应的代码实现,供读者参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【无监督学习之聚类】

聚类 0.简介距离 和 相似度1. K均值聚类(kmeans)模型算法特点 2. 谱聚类(Spectral clustering)算法思想特点谱聚类的具体步骤:算法步骤: 3.小结参考资料 0.简介 聚类:针对给定的样本,依据他们的属性的相似度或距离,将…

spring---第一篇

系列文章目录 文章目录 系列文章目录一、如何实现一个IOC容器二、spring是什么?一、如何实现一个IOC容器 1、配置文件配置包扫描路径 2、递归包扫描获取.class文件 3、反射、确定需要交给IOC管理的类 4、对需要注入的类进行依赖注入 配置文件中指定需要扫描的包路径 定义一些…

【漏洞复现】H3C路由器信息泄露任意用户登录

漏洞描述 通过访问特地址得到密码可进行登录。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中…

【gcc 报错】/usr/bin/ld: this linker was not configured to use sysroots

解决方法:只需把/usr/bin环境变量设置在前面,系统先查找到该目录下的ld即可 vim /etc/profileexport PATH/usr/bin:$PATHsource /etc/profile

【HTML专栏2】VSCode的使用(新建HTML文件)

本文属于HTML/CSS专栏文章,适合WEB前端开发入门学习,详细介绍HTML/CSS如果使用,如果对你有所帮助请一键三连支持,对博主系列文章感兴趣点击下方专栏了解详细。 博客主页:Duck Bro 博客主页系列专栏:HTML/CS…

记录获取蓝鲸智云token的过程

一、使用python脚本获取蓝鲸智云token python版本环境:3.11 # -*- coding: utf-8 -*- import requestsdef get_user_token(domain,user,password):模拟用户登录,并返回 bk_token 和 bk_csrftokenBK_PAAS_HOST domainUSERNAME userPASSWORD password…

如何实现小程序与h5页面间的跳转

接到新需求,要在小程序页面内点击按钮实现跳转h5,一开始没接触过,还挺头疼的,但真正做起来,也就那么一回事啦,废话少说,直接上 1. 配置域名 先登录小程序开发平台,将页面需要跳转的…

Java学习笔记---多态

面向对象三大特征之一(继承,封装,多态) 多态的应用场景:根据传递对象的不同,调用不同的show方法 一、多态的定义 同类型的对象,表现出的不同形态(对象的多种形态) 二…

Tomcat详解 一:tomcat的部署

文章目录 1. Tomcat的基本介绍1.1 Tomcat是什么1.2 Tomcat的构成组件1.2.1 Web容器1.2.2 Servlet容器1.2.3 JSP容器(JAVA Scripts page) 1.3 核心功能1.3.1 Container 结构分析 1.4 配置文件1.5 Tomcat常用端口号1.6 启动和关闭Tomcat 2. 部署Tomcat服务…

DockerCompose部署es和kibana

DockerCompose文件 version: 3.1 services:elasticsearch:image: elasticsearch:7.13.3container_name: elasticsearchprivileged: trueports:- "9200:9200"- "9300:9300"environment:- ES_JAVA_OPTS-Xms128m -Xmx1024m #设置使用jvm内存大小- cluster.na…

【unity3D】如何修改相机的默认视角

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity的如何修改相机的默认视角 如何修改相机的默认视角 Game窗口运行的话视角是这样的: 此时Scene窗口的视角是这样的&…

申请Tik Tok的菲律宾公会需要什么条件?

近年来的跨境电商出海各个国家,使得跨境电子商务在全球范围内迅猛发展。菲律宾作为东南亚地区的重要经济体之一,其电商市场也呈现出蓬勃的增长势头。本文将介绍菲律宾国内外电商的发展趋势,并分析目前菲律宾的市场团队佳薇cmxyci 神秘代码开启…

论文解读 | 点对照:3D点云理解无监督式预训练

原创 | 文 BFT机器人 《PointContrast: Unsupervised Pre-training for 3D Point Cloud Understanding》是一篇关于三维点云数据理解领域的研究论文,旨在提出一种无监督预训练方法,以改善对三维点云数据的理解。 01 背景 三维点云数据是从传感器&#…

手写Spring:第4章-基于Cglib实现含构造函数的类实例化策略

文章目录 一、目标:含构造函数的类实例化二、设计:含构造函数的类实例化三、实现:含构造函数的类实例化3.1 工程结构3.2 含构造函数的类实例化类图3.3 类实例化策略3.3.1 定义实例化策略接口3.3.2 JDK实例化3.3.3 Cglib实例化 3.4 抽象类定义…

INS惯性导航系统相关技术(概念版)

一、参考资料 组合导航系统生产商 applanix 官网 新手入门系列3——Allan方差分析方法的直观理解 惯性测量单元Allan方差分析详解 IMU标定之—Allan方差 b站视频:武汉大学惯性导航课程合集【2021年秋】 资料下载:PPT:《惯性导航原理与方法》…

nginx-ingress多控制器部署

nginx-ingress直接使用yaml来部署 wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml修改里面的镜像 多控制器部署实现: 在同一个命名空间中只需要新增一个IngressClass跟 ingress-…

EFG-02-10-31、ERBG-06-B-51电液比例控制调速阀放大器

EFCG-02-10-31、EFG-03-60-26、EFCG-03-125-26、EFCG-03-125-51、EFG-06-250-22、EFCG-06-250-22、EFG-06-250-51、EFCG-02-30-31、ERBG-06-B-51、ERBG-10-C-51、ERBG-06-H-51、ERBG-10-B-51、ERBG-06-C-51、ERBG-10-H-51、EFG-02-10-31、EFCG-03-60-26、EFG-03-125-26、EFG-03…

Mysql存储过程与存储函数

文章目录 1. 简介2. 存储过程的特点3. 存储过程操作语法4. 存储过程变量5. 其它语法6. 存储函数 1. 简介 存储过程是事先经过编译并存储在数据库中的一段SQL集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输&a…

生成式AI的JavScript技术栈

如果不使用新的软件基础设施技术,就很难理解它们。 至少,a16z 基础设施团队发现了这一点,而且因为我们中的许多人都是以程序员的身份开始职业生涯的,所以我们经常通过实践来学习。 尤其是生成式AI浪潮的情况尤其如此,它…

使用Blender 在影片剪辑上创建粘滞标签

推荐:使用 NSDT场景编辑器快速搭建3D应用场景 准备场景 步骤 1 在新文件中,右键单击默认立方体和灯光,然后按键盘上的 Del 将其删除。按住 Shift 键,然后右键单击以选择多个对象。 删除默认对象 步骤 2 选择摄像机并按 Alt-R …