猫12分类:使用多线程爬取图片的Python程序

本文目标

对于猫12目标检测部分的数据集,采用网络爬虫来制作数据集。

在网络爬虫中,经常需要下载大量的图片。为了提高下载效率,可以使用多线程来并发地下载图片。本文将介绍如何使用Python编写一个多线程爬虫程序,用于爬取图片并进行下载。

程序讲解

首先,我们需要导入所需的库,包括requests、PIL、lxml、numpy和threading。其中,requests库用于发送HTTP请求,PIL库用于处理图片,lxml库用于解析HTML,numpy库用于处理数组,threading库用于实现多线程。

复制代码
import time
import requests
from lxml import etree
import numpy as np
import threading

接下来,我们定义了一个函数searchImageurls,用于从指定网站上搜索图片的URL。在这个例子中,我们以https://www.hippopx.com/zh 为例。函数中,我们使用requests库发送HTTP请求,获取网页内容,并使用lxml库解析HTML,提取图片的URL。最后,我们将URL存储在一个数组中,并返回该数组。

复制代码
def searchImageurls():
    ImageUrls = []
    for i in range(1, 6):
        url = f"https://www.hippopx.com/zh/query?q=cat&page={i}"
        response = requests.get(url, headers=headers)
        html = response.content.decode('utf-8')
        tree = etree.HTML(html)
        # print(tree)
        image_url = tree.xpath('//*[@id="mainlist"]/li/figure/a/img/@src')
        ImageUrls.append(image_url)
    ImageUrls = np.array(ImageUrls)
    ImageUrls = ImageUrls.flatten()
    return ImageUrls

然后,我们定义了一个函数download_image,用于下载图片。在这个函数中,我们使用requests库发送HTTP请求,获取图片的内容,并使用PIL库将内容保存为图片文件。如果下载失败,我们会进行最大重试次数的重试。

复制代码
def download_image(url, filename):
    max_retries = 3  # 最大重试次数
    retries = 0
    while retries < max_retries:
        try:
            response = requests.get(url)
            with open(filename, 'wb') as f:
                f.write(response.content)
            print(f"Downloaded {filename}")
            break  # 下载成功,跳出循环
        except requests.exceptions.ConnectionError as e:
            print(f"Connection error: {e}")
            retries += 1
            time.sleep(1)  # 等待1秒后重试

    if retries == max_retries:
        print(f"Failed to download {filename}")

在主函数中,我们首先调用searchImageurls函数获取图片的URL数组。然后,我们创建多个线程,并将每个线程分配一个URL进行下载。最后,我们等待所有线程完成下载。

最后,我们输出下载完成的消息。

复制代码
if __name__ == '__main__':
    ImageUrls = searchImageurls()
    threads = []
    print("开始下载")
    for i, url in enumerate(ImageUrls):
        filename = f'./images/cat{i + 1}.jpg'
        thread = threading.Thread(target=download_image, args=(url, filename))
        thread.start()
        threads.append(thread)
    for thread in threads:
        thread.join()
    print("全部下载完毕")

注:Connection error: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')) -- 这是由于错误的url导致的

完整代码

复制代码
import time
import requests
from lxml import etree
import numpy as np
import threading

# 爬取的图片网站  https://www.hippopx.com/zh
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"}


def searchImageurls():
    ImageUrls = []
    for i in range(1, 6):
        url = f"https://www.hippopx.com/zh/query?q=cat&page={i}"
        response = requests.get(url, headers=headers)
        html = response.content.decode('utf-8')
        tree = etree.HTML(html)
        # print(tree)
        image_url = tree.xpath('//*[@id="mainlist"]/li/figure/a/img/@src')
        ImageUrls.append(image_url)
    ImageUrls = np.array(ImageUrls)
    ImageUrls = ImageUrls.flatten()
    return ImageUrls


# 图片下载
def download_image(url, filename):
    max_retries = 3  # 最大重试次数
    retries = 0
    while retries < max_retries:
        try:
            response = requests.get(url)
            with open(filename, 'wb') as f:
                f.write(response.content)
            print(f"Downloaded {filename}")
            break  # 下载成功,跳出循环
        except requests.exceptions.ConnectionError as e:
            print(f"Connection error: {e}")
            retries += 1
            time.sleep(1)  # 等待1秒后重试

    if retries == max_retries:
        print(f"Failed to download {filename}")


if __name__ == '__main__':
    ImageUrls = searchImageurls()
    threads = []
    print("开始下载")
    for i, url in enumerate(ImageUrls):
        filename = f'./images/cat{i + 1}.jpg'
        thread = threading.Thread(target=download_image, args=(url, filename))
        thread.start()
        threads.append(thread)
    for thread in threads:
        thread.join()
    print("全部下载完毕")
相关推荐
沐土Arvin9 分钟前
前端图片上传组件实战:从动态销毁Input到全屏预览的全功能实现
开发语言·前端·javascript
找不到、了12 分钟前
Spring-Beans的生命周期的介绍
java·开发语言·spring
(・Д・)ノ36 分钟前
python打卡day29
开发语言·python
若水晴空初如梦36 分钟前
QT聊天项目DAY11
开发语言·qt
有杨既安然1 小时前
Python高级特性深度解析:从熟练到精通的跃迁之路
开发语言·python·数据挖掘·flask
蹦蹦跳跳真可爱5891 小时前
Python----神经网络(《Searching for MobileNetV3》论文概括和MobileNetV3网络)
人工智能·python·深度学习·神经网络
妄想成为master1 小时前
如何完美安装GPU版本的torch、torchvision----解决torch安装慢 无法安装 需要翻墙安装 安装的是GPU版本但无法使用的GPU的错误
人工智能·pytorch·python·环境配置
wanfeng_091 小时前
CMS(plone / joomla 搭建测试)
python·多站点·本地搭建·joomla·plone
浩皓素1 小时前
Python函数库调用实战:以数据分析为例
python
为美好的生活献上中指2 小时前
java每日精进 5.18【文件存储】
java·开发语言·minio·七牛云存储·s3·七牛云