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 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
详解Python中的__new__()方法的使用
Apr 09 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
python制作小说爬虫实录
Aug 14 Python
Python OpenCV实现图片上输出中文
Jan 22 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
Python 实现大整数乘法算法的示例代码
Sep 17 Python
django实现模板中的字符串文字和自动转义
Mar 31 Python
Jupyter打开图形界面并画出正弦函数图像实例
Apr 24 Python
详解python算法常用技巧与内置库
Oct 17 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
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
基于pear auth实现登录验证
2010/02/26 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
jQuery写fadeTo示例代码
2014/02/21 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
详解jQuery中的事件
2016/12/14 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
2019/07/19 Javascript
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
Python元组及文件核心对象类型详解
2018/02/11 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
详解python破解zip文件密码的方法
2020/01/13 Python
python 的topk算法实例
2020/04/02 Python
致400米运动员广播稿
2014/02/07 职场文书
石油工程专业毕业生求职信
2014/04/13 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
离婚答辩状范文
2015/05/22 职场文书
预备党员半年考察意见
2015/06/01 职场文书
公司中层管理培训心得体会
2016/01/11 职场文书
Java中的随机数Random
2022/03/17 Java/Android
Python使用openpyxl模块处理Excel文件
2022/06/05 Python