Python - 使用XPath提取数据并下载图片

144 阅读2分钟

1. 项目需求

我们将从一个网页中抓取图片数据,提取图片的URL,并将图片下载到本地。我们将使用lxml库结合XPath来定位网页中的图片元素。

2. 环境准备

安装必要的Python库:

pip install lxml urllib

3. 完整代码示例

from lxml import etree
import urllib.request
import os


# 1. 定制请求对象
# 2. 获取网页数据
# 3. 下载图片

# 分析网页的特征
# 第一页数据连接 https://sc.chinaz.com/tupian/fengjing.html
# 第二页数据连接 https://sc.chinaz.com/tupian/fengjing_2.html
# 第三页数据连接 https://sc.chinaz.com/tupian/fengjing_3.html

def create_request(page):
    """定制请求对象"""
    url = f'https://sc.chinaz.com/tupian/fengjing_{page}.html' if page > 1 else 'https://sc.chinaz.com/tupian/fengjing.html'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'}
    return urllib.request.Request(url=url, headers=headers)

def get_content(request):
    """获取网页源码"""
    with urllib.request.urlopen(request) as response:
        return response.read().decode('utf-8')

def download_images(content, save_folder='./fengjingImg'):
    """下载图片"""
    if not os.path.exists(save_folder):
        os.makedirs(save_folder)

    tree = etree.HTML(content)
    img_list = tree.xpath('//div[@class="container"]//div//img/@data-original')
    alt_list = tree.xpath('//div[@class="container"]//div//img/@alt')

    for i, img_url in enumerate(img_list):
        full_url = 'https:' + img_url
        img_name = alt_list[i] + '.jpg'
        file_path = os.path.join(save_folder, img_name)
        urllib.request.urlretrieve(url=full_url, filename=file_path)
        print(f"下载 {img_name}")

if __name__ == '__main__':
    # 输入起始页和结束页
    start_page = int(input('输入起始页: '))
    end_page = int(input('输入结束页: '))

    # 循环抓取指定范围的页面
    for page in range(start_page, end_page + 1):
        request = create_request(page)  # 请求对象的定制
        content = get_content(request)  # 获取网页源码
        download_images(content)  # 下载图片

4. 代码解析

  1. 创建请求
    create_request(page):根据传入的页码,动态生成请求的URL,并添加User-Agent头部。
  2. 获取网页内容
    get_content(request):通过urllib.request.urlopen()发送请求,获取网页源码并解码为UTF-8格式。
  3. 下载图片
    download_images(content):使用XPath提取图片链接(data-original属性),并下载图片到本地指定文件夹。如果文件夹不存在,代码会自动创建。

5. 执行过程

  1. 输入起始页和结束页,程序会循环抓取这些页码的图片数据。
  2. 每页的图片链接会被提取并下载保存。