背景:一张图一张图看 和下载太慢了,批量把网上的开放图源下载到本地,方便快捷。

方法:Python、requests库

首先,任意选择一个开源图片网站,这里随机选择了一个网站P站美图 。

要实现自动化下载,首先肯定要人为分析下载的过程,再依靠代码让这个流程自动化。

观察网页,一张网页里包含多个帖子,点进去后才能看到该帖发布的所有图片,因此要下载所有的图片就需要至少两步:

step1:访问页面里的帖子

step2:访问发帖里的图片

在我们访问图片时就能够获取图片的所有信息,包括图片的url地址,利用url就可以观看和下载图片了。

Python批量下载图片_二次元

当然,除了第一页之外,还有第二、第三页,所以需要换页,因此还有一步:

step3: 访问新的页面

归纳一下思路:

Python批量下载图片_爬虫_02

代码部分只涉及到如何使用requets请求:

def request_html(url):
    r = requests.get(url)
    r.encoding = "utf-8"
    soup = BeautifulSoup(r.text, "lxml")
    return soup

如何解析网页:

soup = BeautifulSoup(r.text, "lxml")

如何查找网页里需要的元素:

这一步骤根据需求自定义。

tag_list = soup.find_all("div", class_="kzpost-data")

如何根据url下载图片:

# 根据url下载图片,指定保存路径dirs
def download_img(src, dirs):
    filename = src.split("/")[-1]
    savepath = dirs + '/' +filename
    if os.path.exists(savepath):
        return
    rimg = requests.get(src)
    with open(savepath, "wb")as f:  # wb是写二进制
        f.write(rimg.content)

下面是所有的代码:

import requests
import os
from tqdm import trange
from bs4 import BeautifulSoup

# 根据一个url发送请求,返回html页面
def request_html(url):
    r = requests.get(url)
    r.encoding = "utf-8"
    soup = BeautifulSoup(r.text, "lxml")
    return soup

# 根据url下载图片,指定保存路径dirs
def download_img(src, dirs):
    filename = src.split("/")[-1]
    savepath = dirs + '/' +filename
    if os.path.exists(savepath):
        return
    rimg = requests.get(src)
    with open(savepath, "wb")as f:  # wb是写二进制
        f.write(rimg.content)

# 图片保存路径
save_path = r"D:\Tempdownload\二次元图片"
# 请求网页
r = requests.get("https://dimtown.com/pzmt")
r.encoding = "utf-8"
#解析网页
soup = BeautifulSoup(r.text, "lxml")
#查找需要网页元素
tag_list = soup.find_all("div", class_="kzpost-data")

while True:
    # 循环请求网页内每张帖子
    for tag in tag_list:
        a_tag = tag.find("a")
        print("正在下载 ", a_tag["title"], '...')
        sub_url = a_tag['href']
        sub_soup = request_html(sub_url)
        
        sub_div1 = sub_soup.find("div", attrs={"class": "content_left"})
        img_list = sub_div1.find_all("img")
        #循环下载本帖图片
        for k in trange(len(img_list), leave=False):
            imgl = img_list[k]
            try:
                src = imgl["src"]
            except KeyError as e:
                print(src)
            #下载图片
            download_img(src, save_path)
    print("页面下载完成,继续下一页...")
    # 更新下一页
    next_page = soup.find("a", attrs={"class":"next page-numbers"})
    #如果没有下一页 停止请求
    if next_page is None:
        break
    r = requests.get(next_page["href"])
    r.encoding = "utf-8"
    soup = BeautifulSoup(r.text, "lxml")
    tag_list = soup.find_all("div", class_="kzpost-data")

运行结果:

成功从该网站上自动地批量下载想要的图片。如果想从其他网站下载则需要略微修改,但是原理和流程是一样的。

Python批量下载图片_Python_03

Python批量下载图片_Python_04