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


    本文目标

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

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

    程序讲解

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

    1. import time
    2. import requests
    3. from lxml import etree
    4. import numpy as np
    5. import threading

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

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

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

    1. def download_image(url, filename):
    2. max_retries = 3 # 最大重试次数
    3. retries = 0
    4. while retries < max_retries:
    5. try:
    6. response = requests.get(url)
    7. with open(filename, 'wb') as f:
    8. f.write(response.content)
    9. print(f"Downloaded {filename}")
    10. break # 下载成功,跳出循环
    11. except requests.exceptions.ConnectionError as e:
    12. print(f"Connection error: {e}")
    13. retries += 1
    14. time.sleep(1) # 等待1秒后重试
    15. if retries == max_retries:
    16. print(f"Failed to download {filename}")

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

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

    1. if __name__ == '__main__':
    2. ImageUrls = searchImageurls()
    3. threads = []
    4. print("开始下载")
    5. for i, url in enumerate(ImageUrls):
    6. filename = f'./images/cat{i + 1}.jpg'
    7. thread = threading.Thread(target=download_image, args=(url, filename))
    8. thread.start()
    9. threads.append(thread)
    10. for thread in threads:
    11. thread.join()
    12. print("全部下载完毕")

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

    完整代码

    1. import time
    2. import requests
    3. from lxml import etree
    4. import numpy as np
    5. import threading
    6. # 爬取的图片网站 https://www.hippopx.com/zh
    7. headers = {
    8. "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"}
    9. def searchImageurls():
    10. ImageUrls = []
    11. for i in range(1, 6):
    12. url = f"https://www.hippopx.com/zh/query?q=cat&page={i}"
    13. response = requests.get(url, headers=headers)
    14. html = response.content.decode('utf-8')
    15. tree = etree.HTML(html)
    16. # print(tree)
    17. image_url = tree.xpath('//*[@id="mainlist"]/li/figure/a/img/@src')
    18. ImageUrls.append(image_url)
    19. ImageUrls = np.array(ImageUrls)
    20. ImageUrls = ImageUrls.flatten()
    21. return ImageUrls
    22. # 图片下载
    23. def download_image(url, filename):
    24. max_retries = 3 # 最大重试次数
    25. retries = 0
    26. while retries < max_retries:
    27. try:
    28. response = requests.get(url)
    29. with open(filename, 'wb') as f:
    30. f.write(response.content)
    31. print(f"Downloaded {filename}")
    32. break # 下载成功,跳出循环
    33. except requests.exceptions.ConnectionError as e:
    34. print(f"Connection error: {e}")
    35. retries += 1
    36. time.sleep(1) # 等待1秒后重试
    37. if retries == max_retries:
    38. print(f"Failed to download {filename}")
    39. if __name__ == '__main__':
    40. ImageUrls = searchImageurls()
    41. threads = []
    42. print("开始下载")
    43. for i, url in enumerate(ImageUrls):
    44. filename = f'./images/cat{i + 1}.jpg'
    45. thread = threading.Thread(target=download_image, args=(url, filename))
    46. thread.start()
    47. threads.append(thread)
    48. for thread in threads:
    49. thread.join()
    50. print("全部下载完毕")

  • 相关阅读:
    revit中如何实现【管线编辑】?
    《STM32 HAL库》RCC 相关系列函数详尽解析—— HAL_RCC_OscConfig()
    反射学习总结
    IPsec封装问题详解
    STM32如何使用定时器
    你还在找淘宝商品信息查询的接口吗?
    空调外机清洁机器人设计
    spring事务传播特性,即spring管理事务的策略
    2024年移动端技术探索
    go mod tidy 报错:x509: certificate signed by unknown authority 最佳实践
  • 原文地址:https://blog.csdn.net/qq_62238325/article/details/134495380