使用Python爬虫大量快速下载图片
目录
推荐学习视频:
一、导入库
from concurrent.futures import ThreadPoolExecutor import requests from bs4 import BeautifulSoup import asyncio import aiohttp import aiofiles
二、把图片的下载地址写入文件中
def download_one_page(k): # 查看不同的图片页面得出url的规律 if k == 1: url = "http://www.gaoimg.com/photo/nature/" else: url = f"http://www.gaoimg.com/photo/nature/list_39_{k}.html" resp = requests.get(url) resp.encoding = utf-8 # 处理乱码 # print(resp.text) # Bs4解析 main_page = BeautifulSoup(resp.text, "html.parser") alist = main_page.find_all("div", class_="item") # 标签 属性 # print(alist) for a in alist: # 直接通过get就可以拿到属性的值,同时拼接图片下载的url href = "http://www.gaoimg.com" + a.find("img").get(data-original) # print(href) # 将图片下载链接写入文件中 with open("photo_http.txt", mode="a+", encoding="utf-8") as f: f.write(href) f.write( ) print(f"第{k}页下载完毕!!!")
三、正式下载图片
下载图片就是把图片内容写入文件中去
异步下载提高下载速度
# 图片的单个下载 async def download_ts(href, img_name, session): async with session.get(href) as img_resp: async with aiofiles.open(f"img2/{img_name}", mode="wb") as f: await f.write(await img_resp.content.read()) # 图片内容写入文件 print(f"{img_name}下载完毕") # 异步下载 async def aio_download(): tasks = [] async with aiohttp.ClientSession() as session: # 提前准备好session async with aiofiles.open("photo_http.txt", mode="r", encoding=utf-8) as f: async for href in f: # 从文件中读取图片下载的url if href.startswith(" "): continue href = href.strip() # 去掉没用的空格和换行 # print(href) img_name = href.split("/")[-1] # 图片的名字 # print(img_name) # 创建任务 task = asyncio.create_task(download_ts(href, img_name, session)) tasks.append(task) await asyncio.wait(tasks)
四、主函数
# 主函数 if __name__ == __main__: pageages=int(input(请输入页数:)) # 线程池下载图片链接 with ThreadPoolExecutor(5) as t: for i in range(1,pageages+1): # 把下载任务提交给线程池 # 下载每一页的信息 t.submit(download_one_page, i) # 异步下载图片 loop = asyncio.get_event_loop() loop.run_until_complete(aio_download())
总结
以上代码得到图片的下载地址使用了线程池,是为了提高下载速度。
而图片下载使用了异步下载,也是为了提高下载速度。
下一篇:
使用 JMX 客户端进行系统监控