一、代码
"""
演示携带cookie爬取网页图片后并下载到本地
"""
# 1.导包
import requests
from bs4 import BeautifulSoup
import os
# 下载文件
# 9.封装download_image函数 用于单独处理下载
def download_image(url, path_name):
print(f"正在下载:{url}")
# 获取图片地址
response = requests.get(url)
with open(path_name, "wb") as file:
file.write(response.content)
# # 获取图片的二进制
print(f"{url}下载完成")
def main():
# 2.设置url
url = "xxx"
# 3.设置cookie 爬取的网页限制年龄访问 所以必须携带cookie设置年龄字段
headers = {"Cookie": "over18=1"}
# 4.接收响应
response = requests.get(url, headers=headers)
# print(response.text)
# 5.根据状态码判断网页是否爬取完成
if response.status_code == 200:
print("爬取成功!")
# 解析网页
soup = BeautifulSoup(response.text, "html.parser")
spans = soup.find_all("span", class_="article-meta-value")
# print(spans[2].text)
# 文章标题
title = spans[2].text
# 6.爬取完成后找到文章标题 根据文章标题配合os库创建目录images/标题名 此处需要判断目录是否已经创建过了 创建过了就不再创建(做此判断避免程序报错)
mdir_file_name = f"images/{title}"
if not os.path.exists(mdir_file_name):
os.makedirs(mdir_file_name)
# 7.找到网页上的所有img标签 获取img标签的src属性 根据属性值筛选出后缀符合图片格式的链接
# 找到所有的img标签
imgs = soup.find_all("img")
# 设置图片的常用格式
allow_image_file = ["jpg", "png", "jpeg", "gif"]
# 遍历a标签找到href属性
for link in imgs:
src = link.get("src")
img_suffix = src.split(".")[-1].split("?")[0] # 文件后缀名
img_name = src.split("/")[-1].split("?")[0] # 图片名称
# print(f"后缀:{img_suffix}")
# print(f"图片名称:{img_name}")
# 8.把图片名称取出来作为要下载的文件名
if img_suffix in allow_image_file:
# print(f"url:{src}")
# print(f"file_path:{mdir_file_name}/{img_name}")
download_image(src, f"{mdir_file_name}/{img_name}")
else:
print("爬取失败!")
# 调试代码
if __name__ == "__main__":
main()
二、下载的图片目录文件截图
三、注意事项
- 在爬取其他网页的时候遇到网页展示的图片并不是真实的图片源地址,需要自己手动拼接成源地址,此处需要具备一些前端知识,能分辨出图片的地址【图片链接打开后是在一个黑窗口中打开的基本是图片的源地址,可以以此来判断】
- 举个例子:
-源地址:https://i.imgur.com/UWmsjWi_d.webp?maxwidth=760&fidelity=grand
-网页默认展示:https://i.imgur.com/UWmsjWi.jpg
- 请求图片资源如果失败的情况下,可以尝试在requests.get()方法中加上关键字参数headers={"User-Agent": "xxx"} 模拟人的行为