从〇到一 轻松学编程

Python 网络爬虫:批量下载图片

by 星辉


Posted on 2019年10月25日周五 at 08:51上午 in 教程


网络爬虫即通过编写程序来自动化访问互联网,快速地获取海量的有价值信息,这是Python语言的又一个重要应用领域。Python网络爬虫程序通常使用Requests软件包来发送HTTP请求,数据科学发行版Anaconda已经直接附带了Requests,对于Python官方版则可以使用以下pip命令安装Requests:

pip install requests

这里将在Jupyter笔记本中演示一个批量下载图片的网络爬虫,它会根据指定的搜索词在百度搜索相应的图片——例如想要搜索“国画”,用户可以在浏览器中输入以下网址打开相应的结果页面: http://image.baidu.com/search/flip?tn=baiduimage&word=国画

网络爬虫程序则可以代替浏览器来访问相同的网址,再找出其中所有原图片的网址,发送相应的HTTP请求去获取并保存图片文件。以下代码块首先导入requests模块,调用其中的get函数向指定网址发送HTTP请求,得到包含结果页面的响应对象:

import requests
url = "http://image.baidu.com/search/flip?tn=baiduimage&word=国画"
r = requests.get(url)

以下代码块使用了标准库的re模块,通过正则表达式从结果页面中找出所有原图片的网址:

import re
po = re.compile(r'"objURL":"(.+?)"')
po.findall(r.text)

以下代码块实际执行批量下载图片操作,首先使用标准库os模块中的函数创建保存目录,然后逐一请求每个图片网址,并将返回的数据写入文件——图片文件名是根据网址生成的,这样可以避免重复下载:

import os
imgdir = "img"
if not os.path.exists(imgdir):
    os.mkdir(imgdir)

po = re.compile(r'"objURL":"(.+?)"')
urls = po.findall(r.text)
for url in urls:
    imgpath=os.path.join(imgdir, requests.utils.quote(url,""))
    if os.path.exists(imgpath):  # 如果图片文件已存在则提示已下载
        print(url,"已下载")
    else:  # 否则发送请求获取图片数据
        r = requests.get(url)
        if r.status_code == 200:  # 如果请求成功则将响应内容写入文件
            print("开始下载:", url)
            with open(imgpath, 'wb') as f:
                f.write(r.content)
        else:
            print("无法下载:", url)

下载的图片可在Jupyter页面中点击显示,或是在系统资源管理器中打开相应文件夹来查看(Windows中的Jupyter根目录即C盘用户目录下的当前用户主目录)。

你可能会发现对于某些图片链接爬虫程序将提示“无法下载”,实际编写爬虫程序时将会涉及到计算机网络的许多技术细节,还需要花费更多的时间才能熟练掌握。

有关Requests的详细使用方法可参阅官方中文文档 http://cn.python-requests.org/zh_CN/latest/



No one has commented yet.

Leave a Comment

HTML语法: 禁用