使用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爬虫 文档、图片等数据抓取】
    请注意,希望合理设置请求间隔时间,避免对服务器造成过大负担。
    本代码仅用于学习和研究目的,不得用于商业用途或其他非法活动。
    使用者自行承担因不当使用代码而产生的任何法律责任
相关推荐
汪洪墩17 分钟前
【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换
开发语言·javascript·python·ecmascript·webgl·cesium
程序员shen1616111 小时前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
长潇若雪2 小时前
《类和对象:基础原理全解析(上篇)》
开发语言·c++·经验分享·类和对象
人人人人一样一样2 小时前
作业Python
python
四口鲸鱼爱吃盐2 小时前
Pytorch | 利用VMI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python
四口鲸鱼爱吃盐2 小时前
Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python
小陈phd2 小时前
深度学习之超分辨率算法——SRCNN
python·深度学习·tensorflow·卷积
CodeClimb3 小时前
【华为OD-E卷-简单的自动曝光 100分(python、java、c++、js、c)】
java·python·华为od
数据小小爬虫3 小时前
如何利用Python爬虫获取商品历史价格信息
开发语言·爬虫·python