背景:一张图一张图看 和下载太慢了,批量把网上的开放图源下载到本地,方便快捷。
方法:Python、requests库
首先,任意选择一个开源图片网站,这里随机选择了一个网站P站美图 。
要实现自动化下载,首先肯定要人为分析下载的过程,再依靠代码让这个流程自动化。
观察网页,一张网页里包含多个帖子,点进去后才能看到该帖发布的所有图片,因此要下载所有的图片就需要至少两步:
step1:访问页面里的帖子
step2:访问发帖里的图片
在我们访问图片时就能够获取图片的所有信息,包括图片的url地址,利用url就可以观看和下载图片了。
当然,除了第一页之外,还有第二、第三页,所以需要换页,因此还有一步:
step3: 访问新的页面
归纳一下思路:
代码部分只涉及到如何使用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")
运行结果:
成功从该网站上自动地批量下载想要的图片。如果想从其他网站下载则需要略微修改,但是原理和流程是一样的。