使用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爬虫 文档、图片等数据抓取】
    请注意,希望合理设置请求间隔时间,避免对服务器造成过大负担。
    本代码仅用于学习和研究目的,不得用于商业用途或其他非法活动。
    使用者自行承担因不当使用代码而产生的任何法律责任
相关推荐
qq_5260991314 分钟前
工控机的用途与介绍:工业自动化的重要引擎
嵌入式硬件·自动化·电脑
三年呀16 分钟前
**标题:发散创新之力,探索隐私计算的未来**隐私计算,作为当下数字化时代的热门话题,正受
python
R-G-B1 小时前
OpenCV Python——报错AttributeError: module ‘cv2‘ has no attribute ‘bgsegm‘,解决办法
人工智能·python·opencv·opencv python·attributeerror·module ‘cv2‘·no attribute
DavieLau1 小时前
C#项目WCF接口暴露调用及SOAP接口请求测试(Python版)
xml·服务器·开发语言·python·c#
白露与泡影2 小时前
Spring容器初始化源码解析
java·python·spring
码界筑梦坊2 小时前
98-基于Python的网上厨房美食推荐系统
开发语言·python·美食
计算机源码社2 小时前
分享一个基于Hadoop的二手房销售签约数据分析与可视化系统,基于Python可视化的二手房销售数据分析平台
大数据·hadoop·python·数据分析·毕业设计项目·毕业设计源码·计算机毕设选题
lpfasd1232 小时前
非中文语音视频自动生成中文字幕的完整实现方案
开发语言·python
大志说编程3 小时前
LangChain框架入门15:深度解析Retrievers检索器组件
python·langchain·llm
₯㎕星空&繁华3 小时前
Linux-地址空间
linux·运维·服务器·经验分享·笔记