使用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爬虫 文档、图片等数据抓取】
    请注意,希望合理设置请求间隔时间,避免对服务器造成过大负担。
    本代码仅用于学习和研究目的,不得用于商业用途或其他非法活动。
    使用者自行承担因不当使用代码而产生的任何法律责任
相关推荐
Jackson@ML17 分钟前
如何快速高效学习Python?
开发语言·python
UFIT2 小时前
Python函数与模块笔记
开发语言·python
言之。2 小时前
别学了,打会王者吧
java·python·mysql·容器·spark·php·html5
YiSLWLL2 小时前
使用Tauri 2.3.1+Leptos 0.7.8开发桌面小程序汇总
python·rust·sqlite·matplotlib·visual studio code
丰锋ff2 小时前
爬虫学习总结
爬虫
花酒锄作田3 小时前
[flask]自定义请求日志
python·flask
SsummerC4 小时前
【leetcode100】组合总和Ⅳ
数据结构·python·算法·leetcode·动态规划
Tandy12356_4 小时前
Godot开发2D冒险游戏——第一节:主角登场!
python·游戏引擎·godot
西柚小萌新5 小时前
【Python爬虫基础篇】--4.Selenium入门详细教程
爬虫·python·selenium
橘猫云计算机设计6 小时前
springboot基于hadoop的酷狗音乐爬虫大数据分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·hadoop·spring boot·爬虫·python·数据分析·毕业设计