欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 使用Python多线程抓取某图网数据并下载图片

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

2024/11/6 12:31:18 来源:https://blog.csdn.net/2301_78198846/article/details/143445814  浏览:    关键词:使用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爬虫 文档、图片等数据抓取】
    请注意,希望合理设置请求间隔时间,避免对服务器造成过大负担。
    本代码仅用于学习和研究目的,不得用于商业用途或其他非法活动。
    使用者自行承担因不当使用代码而产生的任何法律责任

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com