main.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. """
  4. ---------------------------------------
  5. # @Project : Alcorart Downloader
  6. # @File : main.py
  7. # @Author : GrayZhao
  8. # @Date : 2023/2/18 17:04
  9. # @Version :
  10. # @Description :
  11. ---------------------------------------
  12. """
  13. from gevent import monkey; monkey.patch_all()
  14. import gevent
  15. import requests
  16. import os
  17. from queue import Queue
  18. from tqdm import tqdm
  19. URL = "https://baraag.net/api/v1/accounts/387484/statuses?only_media=true&limit=40"
  20. HEADER = {
  21. "referer": "https://baraag.net/@Butterchalk/media",
  22. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46"
  23. }
  24. def producer(until_id: str, data_q: Queue):
  25. """
  26. 下载进程
  27. :param until_id: 截止作品ID(包含该ID)
  28. :param data_q: 下载队列
  29. """
  30. flag = True
  31. img_index = 0
  32. work_url = URL
  33. while flag:
  34. now_id = ""
  35. response = requests.get(url=work_url, headers=HEADER)
  36. data_json = response.json()
  37. for data_item in data_json:
  38. img_index += 1
  39. image_url = data_item["media_attachments"][0]["url"]
  40. data_q.put_nowait({"img_index": img_index, "image_url": image_url})
  41. now_id = data_item["id"]
  42. if now_id == until_id:
  43. flag = False
  44. break
  45. work_url = URL + f"&max_id={now_id}"
  46. def download(data_q: Queue):
  47. while not data_q.empty():
  48. image_info = data_q.get_nowait()
  49. image_index = image_info["img_index"]
  50. image_url = image_info["image_url"]
  51. ext = os.path.splitext(image_url)[1]
  52. response = requests.get(url=image_url, headers=HEADER, stream=True)
  53. total_size = int(response.headers.get("content-length", 0))
  54. block_size = 1024
  55. save_path = f"img/{image_index}{ext}"
  56. with tqdm(desc=f"第{image_index}张图片", total=total_size, unit="KB",
  57. unit_scale=True, leave=False) as pbar:
  58. with open(save_path, "wb") as file:
  59. for data in response.iter_content(block_size):
  60. file.write(data)
  61. pbar.update(len(data))
  62. def consumer(data_q: Queue):
  63. tasks = [gevent.spawn(download, data_q) for x in range(4)]
  64. gevent.joinall(tasks)
  65. if __name__ == '__main__':
  66. data_queue = Queue()
  67. ID = "108186424765846031"
  68. producer(ID, data_queue)
  69. # 并发下载
  70. print(f"共有{data_queue.qsize()}张图片,开始下载... [请耐心等待]")
  71. consumer(data_queue)
  72. print("下载完成...")