Python爬虫实现百度图片自动下载


Posted in Python onFebruary 04, 2018

制作爬虫的步骤

制作一个爬虫一般分以下几个步骤:

分析需求分析网页源代码,配合开发者工具编写正则表达式或者XPath表达式正式编写 python 爬虫代码 效果预览

运行效果如下:

Python爬虫实现百度图片自动下载

存放图片的文件夹:

Python爬虫实现百度图片自动下载

需求分析

我们的爬虫至少要实现两个功能:一是搜索图片,二是自动下载。

搜索图片:最容易想到的是爬百度图片的结果,我们就上百度图片看看:

Python爬虫实现百度图片自动下载

随便搜索几个关键字,可以看到已经搜索出来很多张图片:

Python爬虫实现百度图片自动下载

分析网页

我们点击右键,查看源代码:

Python爬虫实现百度图片自动下载

打开源代码之后,发现一堆源代码比较难找出我们想要的资源。

这个时候,就要用开发者工具!我们回到上一页面,调出开发者工具,我们需要用的是左上角那个东西:(鼠标跟随)。

Python爬虫实现百度图片自动下载

然后选择你想看源代码的地方,就可以发现,下面的代码区自动定位到了相应的位置。如下图:

Python爬虫实现百度图片自动下载

Python爬虫实现百度图片自动下载

我们复制这个地址,然后到刚才的一堆源代码里搜索一下,发现了它的位置,但是这里我们又疑惑了,这个图片有这么多地址,到底用哪个呢?我们可以看到有thumbURL,middleURL,hoverURL,objURL

Python爬虫实现百度图片自动下载

通过分析可以知道,前面两个是缩小的版本,hoverURL 是鼠标移动过后显示的版本,objURL 应该是我们需要的,可以分别打开这几个网址看看,发现 objURL 的那个最大最清晰。

找到了图片地址,接下来我们分析源代码。看看是不是所有的 objURL 都是图片。

Python爬虫实现百度图片自动下载

发现都是以.jpg格式结尾的图片。

编写正则表达式

pic_url = re.findall('"objURL":"(.*?)",',html,re.S)

编写爬虫代码

这里我们用了2个包,一个是正则,一个是 requests 包

#-*- coding:utf-8 -*-
import re
import requests

复制百度图片搜索的链接,传入 requests ,然后把正则表达式写好

Python爬虫实现百度图片自动下载

url = 'https://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=%E6%A0%97%E5%B1%B1%E6%9C%AA%E6%9D%A5%E5%A4%B4%E5%83%8F&ct=201326592&ic=0&lm=-1&width=&height=&v=index' html = requests.get(url).text pic_url = re.findall('"objURL":"(.*?)",',html,re.S)

因为有很多张图片,所以要循环,我们打印出结果来看看,然后用 requests 获取网址,由于有些图片可能存在网址打不开的情况,所以加了10秒超时控制。

pic_url = re.findall('"objURL":"(.*?)",',html,re.S) i = 1 for each in pic_url:   
print each   
try:     
pic= requests.get(each, timeout=10)   
except requests.exceptions.ConnectionError:     print('【错误】当前图片无法下载')     
continue

接着就是把图片保存下来,我们事先建立好一个 images 目录,把图片都放进去,命名的时候,以数字命名。

dir = '../images/' + keyword + '_' + str(i) + '.jpg'
    fp = open(dir, 'wb')
    fp.write(pic.content)
    fp.close()
    i += 1

完整的代码

# -*- coding:utf-8 -*-
import re
import requests


def dowmloadPic(html, keyword):
  pic_url = re.findall('"objURL":"(.*?)",', html, re.S)
  i = 1
  print('找到关键词:' + keyword + '的图片,现在开始下载图片...')
  for each in pic_url:
    print('正在下载第' + str(i) + '张图片,图片地址:' + str(each))
    try:
      pic = requests.get(each, timeout=10)
    except requests.exceptions.ConnectionError:
      print('【错误】当前图片无法下载')
      continue

    dir = '../images/' + keyword + '_' + str(i) + '.jpg'
    fp = open(dir, 'wb')
    fp.write(pic.content)
    fp.close()
    i += 1


if __name__ == '__main__':
  word = input("Input key word: ")
  url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&ct=201326592&v=flip'
  result = requests.get(url)
  dowmloadPic(result.text, word)

Python爬虫实现百度图片自动下载

Python爬虫实现百度图片自动下载

我们看到有的图片没显示出来,打开网址看,发现确实没了。

Python爬虫实现百度图片自动下载

因为百度有些图片它缓存到百度的服务器上,所以我们在百度上还能看见它,但它的实际链接已经失效了。

总结

enjoy 我们的第一个图片下载爬虫吧!当然它不仅能下载百度的图片,依葫芦画瓢,你现在应该能做很多事情了,比如爬取头像,爬淘宝展示图等等。

完整代码已经放到Githut上 https://github.com/nnngu/BaiduImageDownload

Python 相关文章推荐
python使用xmlrpc实例讲解
Dec 17 Python
仅用500行Python代码实现一个英文解析器的教程
Apr 02 Python
全面了解Python环境配置及项目建立
Jun 30 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
python实现数据图表
Jul 29 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
Jul 10 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
python 自动重连wifi windows的方法
Dec 18 Python
在linux系统下安装python librtmp包的实现方法
Jul 22 Python
Python3中urlencode和urldecode的用法详解
Jul 23 Python
python os模块在系统管理中的应用
Jun 22 Python
python 通过exifread读取照片信息
Dec 24 Python
Python中的defaultdict与__missing__()使用介绍
Feb 03 #Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 #Python
numpy.random.seed()的使用实例解析
Feb 03 #Python
Python网络爬虫中的同步与异步示例详解
Feb 03 #Python
Python模块文件结构代码详解
Feb 03 #Python
Python处理文本换行符实例代码
Feb 03 #Python
Python断言assert的用法代码解析
Feb 03 #Python
You might like
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
php define的第二个参数使用方法
2013/11/04 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
PHP实现导出带样式的Excel
2016/08/28 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
JS实现简单的表格增删
2020/01/16 Javascript
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python Django批量导入数据
2016/03/25 Python
python os.path模块常用方法实例详解
2018/09/16 Python
python字典一键多值实例代码分享
2019/06/14 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
自学python用什么系统好
2020/06/23 Python
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
澳大利亚买卖正宗二手奢侈品交易平台:Luxe.It.Fwd
2019/10/16 全球购物
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
顶岗实习计划书
2014/01/10 职场文书
任命书格式模板
2015/09/22 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
nginx配置之并发频次限制
2022/04/18 Servers
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers