一、实现目标

        在日常生活、工作中,我经常需要批量下载网上的图片,今天我们就以豆瓣网站为例,来实现电影海报图片的批量下载功能,网站地址:https://movie.douban.com/top250。

二、实现步骤

2.1 分析网页结构

        首先,我们来分析网页结构。鼠标放到网页中,点击右键选择检查,就能看到网页源代码。 点击“选择器”(图中圈起来的小箭头),将鼠标移至第一张图片的位置,就能够看到该图片对应的源代码。

        点击图片可以定位到img标签,在这个标签中,src参数对应的是图片的地址,alt参数对应的是图片的介绍,这两个参数就是我们所需要内容,同时我们发现img标签的外层是div>a标签。

2.2 获取图片链接

        我们先request.get()向网页发送一个请求,获取网页的源代码,请求方法如下。

# 导入requests模块,用于向网页发送请求
import requests
# 导入BeautifulSoup,用于解析网页内容
from bs4 import BeautifulSoup

# 定义网页地址
url = "https://movie.douban.com/top250"
# 定义headers,用于存储请求头中的参数,这里只需要设置User-Agent参数,将自己伪装成浏览器
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"}

# 向网页发起请求
response = requests.get(url, headers=headers)

print(response)

        运行后,得到请求返回的结果是200,说明请求成功。

        接下来我们需要使用BeautifulSoup对网页内容进行解析,解析方法如下。

# 使用.text属性获取网页的内容,并赋值给html
html = response.text
# 使用BeautifulSoup()传入变量html和解析器lxml,赋值给soup
soup = BeautifulSoup(html, "lxml")

print(html)

        解析后,我们就获得了网页内容。

        但是内容很多,里面有很多我们不需要的内容,我们需要进行过虑,筛选出我们需要的图片相关的标签img,常用的过虑方法有两种,一种是按照标签名称过滤,一种是按照类型(class参数)过虑。通过分析我们发现img标签在li>div>div>a>img下,这些标签名称都很常用的标签,很难进行精确定位,但内层的div标签的class参数为pic,这表示其是一个图片分类,里面应该就是我们想要的内容。

        我们使用find_all()方法来筛选所有class类型为pic的标签,这里class是python关键字,需要写成class_="pic"

# 使用find_all()查询soup中class="pic"的节点,赋值给content_all
content_all = soup.find_all(class_="pic")

print(content_all)

        如下我们得到了一下列表,里面包含了我们想要的img标签。

        接下来我们对列表进行遍历,并使用find()方法筛选img标签。

# for循环遍历content_all列表
for content in content_all:
    # 使用find()查询content中的name="img"的节点,赋值给img
    img = content.find(name="img")

    print(img)

        如下图,我们就得到了所有的img标签。

        然后,我们需要提取每个img标签中的src(图片链接)属性和alt(图片介绍)属性,提取方法为attrs["src"]、attrs["alt"]。

    # 使用.attrs分别提取src和alt属性
    imgUrl = img.attrs["src"]
    imgAlt = img.attrs["alt"]

    print(imgAlt, imgUrl)

        如图我们就获得了想要的电影海报的图片介绍和链接地址。

2.3 批量下载图片

        接下来我们使用requests.get()方法,传入图片链接地址,获取返回结果的.content属性即为图片的二进制数据,然后使用with open()保存图片,with open()的打开类型参数选择“wb”,表示写入二进制数据,完成图片的保存。

    # 将链接添加进requests.get()中,赋值给imgResponse
    imgResponse = requests.get(imgUrl)

    # 使用.content属性将响应消息转换成图片数据,赋值给imgPic 
    imgPic = imgResponse.content

    # 保存图片
    with open(f"D:/学习资料/Python/VSCode/yequbiancheng/网络爬虫/电影海报/{imgAlt}.jpg", "wb") as fp:
        fp.write(imgPic)

        运行结果如下图

2.4 实现翻页下载

        最后我们再实现一下循环获取多个页面的数据,我们对比多个页面的URL可以发现每个页面的start参数不相同,start = page * 25,共有10页。

        我们在前面加上for循环,遍历所有的页面

# 使用for遍历所有页面
for page in range(10):

    # 定义网页地址
    url = f"https://movie.douban.com/top250?start={page*25}&filter="

        完整代码如下

# 导入requests模块,用于向网页发送请求
import requests
# 导入BeautifulSoup,用于解析网页内容
from bs4 import BeautifulSoup

# 使用for遍历所有页面
for page in range(10):

    # 定义网页地址
    url = f"https://movie.douban.com/top250?start={page*25}&filter="
    # 定义headers,用于存储请求头中的参数,这里只需要设置User-Agent参数,将自己伪装成浏览器
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"}

    # 向网页发起请求
    response = requests.get(url, headers=headers)

    # 使用.text属性获取网页的内容,并赋值给html
    html = response.text
    # 使用BeautifulSoup()传入变量html和解析器lxml,赋值给soup
    soup = BeautifulSoup(html, "lxml")

    # 使用find_all()查询soup中所有的class="pic"的节点,赋值给content_all
    content_all = soup.find_all(class_="pic")

    # for循环遍历content_all列表
    for content in content_all:
        # 使用find()查询content中的name="img"的节点,赋值给img
        img = content.find(name="img")
        
        # 使用.attrs分别提取src和alt属性
        imgUrl = img.attrs["src"]
        imgAlt = img.attrs["alt"]

        # 将链接添加进requests.get()中,赋值给imgResponse
        imgResponse = requests.get(imgUrl)

        # 使用.content属性将响应消息转换成图片数据,赋值给img
        imgPic = imgResponse.content

        # 保存图片
        with open(f"D:/学习资料/Python/VSCode/yequbiancheng/网络爬虫/电影海报/{imgAlt}.jpg", "wb") as fp:
            fp.write(imgPic)
    
    print(f"第{page}海报下载完成")

        运行结果如下

三、总结

        在本实例中,我们使用requests和BeautifulSoup模块实现了豆瓣上电影海报的批量下载功能。

        requests:是一个常用的 HTTP 请求库,可以方便地向网站发送 HTTP 请求,并获取响应结果。requests 模块比 urllib 模块更简洁。

        BeautifulSoup:是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐