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/