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之网站的结构
Oct 24 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
python计算两个地址之间的距离方法
Jun 09 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
Python操作MySQL数据库的方法
Jun 20 Python
对django views中 request, response的常用操作详解
Jul 17 Python
VScode连接远程服务器上的jupyter notebook的实现
Apr 23 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 Python
Django 构建模板form表单的两种方法
Jun 14 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
Jun 29 Python
python dir函数快速掌握用法技巧
Dec 09 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
2019/06/10 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
详解python单元测试框架unittest
2018/07/02 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
python3的输入方式及多组输入方法
2018/10/17 Python
django使用LDAP验证的方法示例
2018/12/10 Python
python爬虫之遍历单个域名
2019/11/20 Python
Python实现点云投影到平面显示
2020/01/18 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
利用jupyter网页版本进行python函数查询方式
2020/04/14 Python
毕业生医学检验求职信
2013/10/16 职场文书
物流专员岗位职责
2014/02/17 职场文书
领导调研接待方案
2014/02/27 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
Python打包为exe详细教程
2021/05/18 Python
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL