使用Python多线程抓取某图网数据并下载图片

前言

在互联网开发领域,数据抓取是一项非常实用的技术。通过数据抓取,我们可以从网页上获取所需的信息,并将其转化为结构化数据,以便进一步分析或使用。本文将介绍如何利用Python编写一个多线程程序来抓取网页上的图片数据,并将其下载到本地。
目标网站
在这里插入图片描述

1. 环境准备

在开始之前,请确保您的环境中已安装以下Python包:

  • DrissionPage:这是一个强大的网页操作库,支持多种浏览器,可以方便地进行页面加载、元素查找等操作。
  • fake_useragent:用于生成随机的User-Agent,模拟不同的浏览器访问,减少被网站识别为爬虫的风险。
  • concurrent.futures:Python标准库中的并发执行模块,这里用来实现多线程抓取。

可以通过pip命令安装这些包:

pip install DrissionPage fake_useragent
2. 编写抓取函数

接下来,我们将定义一个名为fetch_table_data的函数,该函数负责访问指定网页,抓取图片链接,并将图片保存到本地。

# -*- coding: utf-8 -*-
import concurrent.futures
import time
import random
import os
from DrissionPage import ChromiumPage, ChromiumOptions
from fake_useragent import UserAgent# 定义一个函数来抓取表格数据
def fetch_table_data(num):# 2.1 设置Chromium的选项co = ChromiumOptions()co.set_browser_path(r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe")co.set_user_data_path(r"C:\Users\20220\AppData\Local\Microsoft\Edge\User Data\Default")# 2.2 初始化ChromiumPage实例Page = ChromiumPage(addr_or_opts=co)url = f"https://www.doutub.com/img_lists/new/{num}"tab = Page.new_tab(url)tab.wait.load_start()time.sleep(random.uniform(2, 3))  # 随机等待2到3秒,模拟用户行为set_links = set()  # 创建一个集合用于存储链接,避免重复# 2.3 遍历页面上的每个表情元素for doutu in tab.eles('x://div[@class="expression-list clearfix"]/div[@class="cell"]'):img = doutu("t:img")  # 获取图片元素img_src = img.attr('data-src')  # 获取图片的data-src属性值print(img_src)set_links.add(img_src)  # 将图片链接添加到集合中img.save(path=r"E:\Python\斗图", name=img_src.split('/')[-1].split('?')[0])  # 保存图片time.sleep(random.uniform(2, 3))  # 再次随机等待2到3秒print(len(set_links))  # 打印抓取到的链接数量print(f"正在抓取第{num}页")  # 打印当前抓取的页数信息tab.close()  # 关闭标签页
3. 多线程抓取

为了提高效率,我们使用concurrent.futures.ThreadPoolExecutor来创建一个线程池,这样就可以同时处理多个请求了。

# 3.1 使用线程池来并行处理多个请求
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:# 3.2 提交任务到线程池futures = [executor.submit(fetch_table_data, num) for num in range(1, 3)]  # 调整范围以抓取更多或更少的页数# 3.3 等待所有任务完成concurrent.futures.wait(futures)
4.运行结果

在这里插入图片描述
在这里插入图片描述

5. 注意事项
  • 在设置ChromiumOptions时,请确保提供的浏览器路径和用户数据路径是正确的,否则可能会导致程序无法正常运行。
  • 本示例中使用了time.sleep()来模拟用户的随机等待时间,这是为了避免频繁请求导致目标网站封禁IP地址。
  • 图片的保存路径也需要根据实际情况进行调整。
    以上是使用Python多线程技术抓取网页数据并下载图片的一个完整示例。
    如果有爬虫的需求的话可以到,【python爬虫 文档、图片等数据抓取】
    请注意,希望合理设置请求间隔时间,避免对服务器造成过大负担。
    本代码仅用于学习和研究目的,不得用于商业用途或其他非法活动。
    使用者自行承担因不当使用代码而产生的任何法律责任

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《IMM交互式多模型滤波MATLAB实践》专栏目录,持续更新……

专栏链接:https://blog.csdn.net/callmeup/category_12816762.html 专栏介绍 关于IMM的例程 双模型EKF: 【逐行注释】基于CV/CT模型的IMM|MATLAB程序|源代码复制后即可运行,无需下载三模型EKF: 【matlab代码】3个模型的IMM例程&…

鸿蒙开发案例:指南针

【1】引言(完整代码在最后面) 在本文中,我们将介绍如何使用鸿蒙系统(HarmonyOS)开发一个简单的指南针应用。通过这个案例,你可以学习如何使用传感器服务、状态管理以及UI构建等基本技能。 【2】环境准备 …

人工智能的发展与未来:从Yann LeCun的观点谈起

引言 在当今的人工智能(AI)领域,AGI(通用人工智能)已成为热门话题。许多专家认为,随着技术的不断发展,AGI的实现只是时间问题。然而,Yann LeCun——图灵奖得主、Meta首席AI科学家&a…

【The Art of Unit Testing 3_自学笔记06】3.4 + 3.5 单元测试核心技能之:函数式注入与模块化注入的解决方案简介

文章目录 3.4 函数式依赖注入技术 Functional injection techniques3.5 模块化依赖注入技术 Modular injection techniques 写在前面 上一篇的最后部分对第三章后续内容做了一个概括性的梳理,并给出了断开依赖项的最简单的实现方案,函数参数值注入法。本…

电磁兼容(EMC):整改案例(六)Y电容过大导致雷击浪涌炸机

目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某金属外壳带接地线的产品按GB/T 17626.5进行雷击浪涌测试,在L,N线对PE进行4kV浪涌电压测试时,出现炸机现象,AC-DC电源芯片损坏。而在L,N线间进行2…

代码之眼,陈欣的xml解密之路

第一章 在未来的世界里,科技已经发展到了令人难以想象的地步。人工智能、量子计算和生物技术交织在一起,创造了一个全新的社会形态。在这个世界中,有一个名为“代码守护者”的组织,专门负责维护全球信息系统的安全和稳定。 陈欣是…

L0G1000:Linux+InternStudio 闯关作业

1. 配置基础环境 首先,打开 Intern Studio 界面,点击 创建开发机 配置开发机系统。 InternStudio 填写 开发机名称 后,点击 选择镜像 使用 Cuda11.7-conda 镜像,然后在资源配置中,使用 10% A100 * 1 的选项&#xff…

爬虫笔记22——当当网图书详情页静、动态数据爬取

当当网动态数据爬取 静态数据爬取动态数据爬取接口参数的获取 静态数据爬取 进入图书详情,这里的图书数据信息比如标题、价格、图片都是非结构化数据,可以使用xpath语法提取。是很简单的数据采集了,就不细说了。 动态数据爬取 滑到下面这里的…

使用pathview在线渲染KEGG Pathway Map,给感兴趣的基因、化合物添加颜色

导读: 通过将用户提供的基因表达定量数据,化合物定量数据映射并渲染到相关的KEGG通路图上,能够帮助我们直观且系统地研究基因、酶、化合物间的关系。 KEGG通路图简介 KEGG PATHWAY数据库是一系列手动绘制的图形图谱的集合,称为…

自动化测试工具Ranorex Studio(二十一)-适配一个已存在的对象库

通过录制一个手工测试场景我们创建了一个对象库。录制期间用到的每个UI元素都在库中创建了一个新的条目。默认情况下,一个新的Ranorex Studio项目包含一个库文件(*.rxrep),这个文件可以被多个录制模块或代码模块使用。 图:一个库的文件视图…

OpenSLL下载,环境变量配置

https://slproweb.com/products/Win32OpenSSL.html 环境变量 新建一个path为安装选择的目录的bin路径

【MyBatis】【基于轻量型架构的WEB开发】课程 课后习题 章节测试

mybatis关联查询、缓存、注解 一. 单选题 1. 下列关于 <collection> 元素的描述正确的是&#xff08;&#xff09;。 A. MyBatis 就是通过 <collection> 元素来处理一对多关联关系的 B. <collection> 元素的属性与 <association> 元素完全相同 C.…

JavaEE-多线程上

文章目录 线程概述进程/线程多线程的作用JVM关于线程资源的规范关于Java程序的运行原理 并发与并行并发(concurrency)并行(parallellism)并发编程与并行编程 线程的调度策略分时调度模型抢占式调度模型 创建线程线程类分析入门实现线程的第一种方式实现线程的第二种方式 线程的…

SQL 常用语句

目录 我的测试环境 学习文档 进入数据库 基础通关测验 语句-- 查 展示数据库&#xff1b; 进入某个数据库&#xff1b; 展示表&#xff1a; 展示某个表 desc 查询整个表&#xff1a; 查询特定列&#xff1a; 范围查询 等于特定值 不等于 介于 特定字符查询 Li…

[MySQL]DQL语句(一)

查询语句是数据库操作中最为重要的一系列语法。查询关键字有 select、where、group、having、order by、imit。其中imit是MySQL的方言&#xff0c;只在MySQL适用。 数据库查询又分单表查询和多表查询&#xff0c;这里讲一下单表查询。 基础查询 # 查询指定列 SELECT * FROM …

【Unity】鼠标点击获取世界坐标位置:物体移动至鼠标点击的位置

需求说明 鼠标点击3D场景时&#xff0c;可以获取其所在的世界坐标&#xff1b; 鼠标点击3D物体时&#xff0c;可以获取该物体&#xff1b; 鼠标点击3D物体时&#xff0c;可以让玩家移动至该物体&#xff1b; 成果展示 Scene部分 关于仓库栏的设置&#xff0c;物体如何进入…

使用nvm切换node版本失败

​ 使用nvm切换node版本失败&#xff08;原node版本v20.14.0&#xff0c;我使用nvm use 16.9.1切换node版本后&#xff0c;显示Now using node v16.9.1可当我使用命令node -v查看当前node版本时还是v20.14.0&#xff0c;意味着版本切换失败&#xff09;&#xff1a; 这个原因大…

Hive数据库操作语法

数据类型 内部表和外部表 内部表 &#xff08;CREATE TABLE table_name ......&#xff09;未被external关键字修饰的即是内部表&#xff0c; 即普通表。 内部表又称管理表,内部表数据存储的位置由hive.metastore.warehouse.dir参数决定&#xff08;默认&#xff1a;/user/h…

【Python TensorFlow】入门到精通

TensorFlow 是一个开源的机器学习框架&#xff0c;由 Google 开发&#xff0c;广泛应用于机器学习和深度学习领域。本篇将详细介绍 TensorFlow 的基础知识&#xff0c;并通过一系列示例来帮助读者从入门到精通 TensorFlow 的使用。 1. TensorFlow 简介 1.1 什么是 TensorFlow…

设计模式08-行为型模式1(命令模式/迭代器模式/观察者模式/Java)

五、行为型模式 **行为模式的定义&#xff1a;**行为型模式是对不同的对象之间划分职责和算法的抽象化。行为型模式定义了系统中对象之间的交互与通信&#xff0c;研究系统在运行时对象之间的相互通信与协作&#xff0c;进一步明确对象的职责&#xff0c;包括对系统中较为复杂的…