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

前言

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

1. 环境准备

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

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

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

bash 复制代码
pip install DrissionPage fake_useragent
2. 编写抓取函数

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

python 复制代码
# -*- 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来创建一个线程池,这样就可以同时处理多个请求了。

python 复制代码
# 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爬虫 文档、图片等数据抓取】
    请注意,希望合理设置请求间隔时间,避免对服务器造成过大负担。
    本代码仅用于学习和研究目的,不得用于商业用途或其他非法活动。
    使用者自行承担因不当使用代码而产生的任何法律责任
相关推荐
极梦网络无忧9 小时前
OpenClaw 基础使用说明(中文版)
python
codeJinger9 小时前
【Python】操作Excel文件
python·excel
XLYcmy10 小时前
一个针对医疗RAG系统的数据窃取攻击工具
python·网络安全·ai·llm·agent·rag·ai安全
Islucas10 小时前
Claude code入门保姆级教程
python·bash·claude
萝卜白菜。10 小时前
TongWeb7.0相同的类指明加载顺序
开发语言·python·pycharm
久菜盒子工作室10 小时前
高等教育学|第一章高等教育概述
经验分享·笔记·课程设计
赵钰老师10 小时前
【ADCIRC】基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟实践技术应用
python·信息可视化·数据分析
爬山算法11 小时前
MongoDB(80)如何在MongoDB中使用多文档事务?
数据库·python·mongodb
YuanDaima204811 小时前
基于 LangChain 1.0 的检索增强生成(RAG)实战
人工智能·笔记·python·langchain·个人开发·langgraph