今天,我们用python来开发一个简陋的图片搜索下载器。

由于网站使用javascript和ajax动态加载技术,还有验证码机制,对小白来说想要获得原图实在太难啦。

所以能获取缩略图,主要提供基本思路。

选择的是pixabay,挺有名的高品质图片网站,免费的, 相信许多人对此并不陌生。

一、目标

1、实现输入关键词,自动搜索到图片

2、获取图片链接

3、批量下载图片,命名保存入文件

4、代码优化,不中段、无重复,并且可指定下载范围

二、步骤:

1、首先观察分析

点击进入官网,好家伙和百度一样的瀑布流模式,查看源码发现关键字‘ajax',及异步加载模式

果不其然,要点击页面才能看到缩略图,还要点击图片才能下载。审查元素里面并不是原图的链接,源码中也没有,点开图片后还有上方的地址也并不是原图地址,按照一般的思路的话,并不能获取原图(可能要用到PhantomJS、Selenium等)。可是我还没有学到PhantonJ和Selenium呀,所以只能先试试缩略图啦。(不过最小的那一个下载模式要大一些)/2013/10/16/14/45/是时间,flower为关键词,结合源码分析196360应该是每一个图片的特殊代号。

事情由此变得简单了,只要我们用正则匹配出时间、特殊代号,再构造出原图地址就可以得到可爱的链接啦!

2、具体步骤

1)匹配图片数量的正则

 pattern=re.compile('<input name="pagi.*?>.*?/ (.*?) .*?', re.S)

2)匹配时间、特殊代号正则

pattern=re.compile('<img srcset="https://cdn.pixabay.com/photo(.*?)-(.*?)__340.*?', re.S)pattern1=re.compile('<img srcset="https://cdn.pixabay.com/photo(.*?)-(.*?)__340.*?', re.S)
pattern2=re.compile('data-lazy-srcset="https://cdn.pixabay.com/photo(.*?)-(.*?)__340.*?', re.S)

刚开始时用的是最先这个,结果只能返回16个图。百思不得解,还去看了下别的网站,准备放弃之际,

查看源码发现,我勒个去,正好与这带下划线链接的16个项吻合,而后面的图片项发现皆带有'data-lazy'。也就是说,前16和后16根本采用不是一个模式啊!这可能也是为了反恶意爬虫吧,总之厉害了我的哥^_^。后面就简单,分别匹配正则并讨论。

3)创建目录,保存入文件和之间如出一辙,不再赘述。

4)下载保存一页图片时detailURL分情况讨论。i<=16和 i>16的情况。

5)接下来对多页进行循环,发现第1页和第2页之后的url又不相同啦,具体分析之后,构造如下

url2='https://pixabay.com/zh/photos/?orientation=&image_type=&cat=&colors=&q='+str(self.keyword)+'&order=popular&pagi='+str(page)
url2='http://pixabay.com/zh/photos/?image_type=&cat=&min_width=&min_height=&q='+str(self.keyword)+'&order=popular'

6)最后优化环节:

a、检查链接错误减少下载中断

b、去掉图片下载重复(即每一次重新开始就不用重新下载之前的内容)

c、设计交互(raw_input)、优化注释

d、最后还是觉得太low又改了一下,可以选择下载页数(下多少页呀),及起始页数(从哪开始)。经验发现一页100张。这回方便了,不用每次从头开始了。

嘿嘿,这就是一个下载器的基本思路啦

三、代码如下

#  -*-coding:utf-8 -*-
__author__='WYY'
__date__='2017.03.17'#【原创】爬虫实战小项目:pixabay 图片下载器
import re
import os
import requests
import urllib2
import timeclass Spider():#初始化参数def __init__(self):self.keyword=raw_input(u'欢迎使用pixabay 图片搜索下载神器\n请输入搜索关键词(英文):')self.siteURL='http://pixabay.com/zh/photos/?image_type=&cat=&min_width=&min_height=&q='+str(self.keyword)+'&order=popular'#获取详情页源码def getSource(self,url):result=requests.get(url).text.encode('utf-8')return result#获取图片页数def getPageNum(self):result=self.getSource(self.siteURL)pattern=re.compile('<input name="pagi.*?>.*?/ (.*?) .*?', re.S)items=re.search(pattern,result)if items.group(1)>=1:print u'\n这个主题共有图片', items.group(1), u'页'else:print u'\n哎呀,木有您想要的图呢。。。'return items.group(1)#匹配正则1def getItem1(self,url):result=self.getSource(url)pattern1=re.compile('<img srcset="https://cdn.pixabay.com/photo(.*?)-(.*?)__340.*?', re.S)items=re.findall(pattern1, result)return items#匹配正则2def getItem2(self,url):result=self.getSource(url)pattern2=re.compile('data-lazy-srcset="https://cdn.pixabay.com/photo(.*?)-(.*?)__340.*?', re.S)items=re.findall(pattern2,result)return items#保存图片入文件def saveImage(self,detailURL,name):try:picture=urllib2.urlopen(detailURL)fileName=name+'.jpg'string='F:\Desktop\code\pixabay\%s\%s' % (self.path, fileName)E=os.path.exists(string)if not E:f=open(string, 'wb')f.write(picture.read())f.close()else:print u'图片已经存在,跳过!'return Falseexcept (urllib2.HTTPError,urllib2.URLError), e:print e.reasonreturn None#创建目录def makeDir(self, path):self.path=path.strip()E=os.path.exists(os.path.join('F:\Desktop\code\pixabay', self.path))if not E:# 创建新目录,若想将内容保存至别的路径(非系统默认),需要更环境变量# 更改环境变量用os.chdir()os.makedirs(os.path.join('F:\Desktop\code\pixabay',self.path))os.chdir(os.path.join('F:\Desktop\code\pixabay',self.path))print u'成功创建名为', self.path, u'的文件夹'return self.pathelse:print u'名为', self.path, u'的文件夹已经存在...'return False#对一页的操作def saveOnePage(self,url):i=1items=self.getItem1(url)for item in items:detailURL='https://cdn.pixabay.com/photo'+str(item[0])+'-'+str(item[1])+ '_960_720.jpg'print u'\n', u'正在下载并保存图片', i, detailURLself.saveImage(detailURL, name='Num'+str(i))time.sleep(0.5)i+=1if i>16:items=self.getItem2(url)i=17for item in items:detailURL = 'https://cdn.pixabay.com/photo'+str(item[0])+'-'+str(item[1])+'_960_720.jpg'print u'\n', u'正在下载并保存图片', i, detailURLself.saveImage(detailURL,name='Num'+str(i))time.sleep(0.5)i += 1#对多页图片的操作def saveMorePage(self):numbers=self.getPageNum()Num=int(raw_input(u'一页共100张图,\n请输入要下载的页数(默认页数大于等于1):'))Start=int(raw_input(u'请输入下载起始页数:'))if numbers>=1:for page in range(Start,Start+Num):if page==1:print u'\n',u'正在获取第1页的内容......'self.url1=self.siteURLself.makeDir(path=self.keyword + 'page' + str(page))self.saveOnePage(url=self.url1)else:print u'\n',u'正在获取第',page, u'页的内容'self.url2='https://pixabay.com/zh/photos/?orientation=&image_type=&cat=&colors=&q='+str(self.keyword)+'&order=popular&pagi='+str(page)self.makeDir(path=self.keyword + 'page' + str(page))self.saveOnePage(url=self.url2)else:return Falseprint  u'\n',u'圆满成功!!!'spider=Spider()
spider.saveMorePage()


四、看结果

第一页


最后一页

实现了去重

看看文件里的变化,食物已经乖乖躺在指定文件夹啦~

本篇只设计基本的思路,之后带我学好了如何爬取动态网页再进行补充。

python网络爬虫入门(三)—— 做个简陋的pixabay 图片下载器相关推荐

  1. Python网络爬虫(三) 爬虫进阶

    ###目录: Python网络爬虫(一)- 入门基础 Python网络爬虫(二)- urllib爬虫案例 Python网络爬虫(三)- 爬虫进阶 Python网络爬虫(四)- XPath Python ...

  2. Python网络爬虫入门

    Python网络爬虫入门 网络爬虫(web crawler),也叫网络蜘蛛(Web Spider).网络机器人(Internet Bot).简单地说,抓取万维网(World Wide Web)上所需要 ...

  3. Python网络爬虫入门(一)入门

    Python网络爬虫(一)入门 使用到的库:requestspip+BeautifulSoup4pip+tqdmpip+html5lib python版本:3.8 编译环境:Jupyter Noteb ...

  4. IT宅男利用Python网络爬虫抓取百度贴吧评论区图片和视频(实战篇)

    [一.项目背景] 百度贴吧是全球最大的中文交流平台,你是否跟我一样,有时候看到评论区的图片想下载呢?或者看到一段视频想进行下载呢? 今天,小编带大家通过搜索关键字来获取评论区的图片和视频. [二.项目 ...

  5. 【Python网络爬虫实战篇】使用selenium+requests爬取下载高清源视频:关于爬取m3u8文件链接解析为ts视频合并成mp4视频的分析实战

    这两天博主在摸鱼时,偶然间接触到了流媒体的概念,一时间来了兴致.再加上之前博主有着七.八年的视频制作经验,深知视频素材获取的不易.因此,打算利用自己所学的python网络爬虫的知识,通过编写代码实现获 ...

  6. Python网络爬虫入门篇---小白必看

    1.  预备知识 学习者需要预先掌握Python的数字类型.字符串类型.分支.循环.函数.列表类型.字典类型.文件和第三方库使用等概念和编程方法. 2. Python爬虫基本流程 a. 发送请求 使用 ...

  7. Python网络爬虫入门案例

    一.什么是网络爬虫? 网络爬虫又称网络蜘蛛.网络蚂蚁.网络机器人等,本质上是一段程序或脚本,可以自动化浏览网络中的信息,浏览信息时程序会按照一定的规则去浏览,这些规则我们称之为网络爬虫算法. 作用: ...

  8. Python 网络爬虫入门详解

    什么是网络爬虫 网络爬虫又称网络蜘蛛,是指按照某种规则在网络上爬取所需内容的脚本程序.众所周知,每个网页通常包含其他网页的入口,网络爬虫则通过一个网址依次进入其他网址获取所需内容. 优先申明:我们使用 ...

  9. python 网络爬虫入门(四)— 破解pexels高清原图

    最近貌似对好看的图着迷,Pixabay爬不到原图不甘心呀. 百度+知乎了下,于是转向pexels,同样一个高人气图片网站. 颜值逆天,画质不输Pixabay,瞬间感觉有了动力? 不到一下午就爬到高清原 ...

  10. Python爬虫实战(一) — Pixabay图片下载器

    前言 最近学习数据分析的时候,突然对网络爬虫有了兴趣,经过一些练习和资料的参考,编写了一些简单的爬虫代码,今天,我们来爬取Pixabay网站的图片. Pixabay我最常用的一家图片网站,可以说是全球 ...

最新文章

  1. 在Ubuntu 16.04.6 LTS上安装python3.7和pip3后出现Command '('lsb_release', '-a')' 出错问题的解决方法
  2. 大一计算机考试题库window,2016年计算机考试Windows题库及答案
  3. matlab拟合未定义函数或变量,关于matlab的未定义函数或变量的问题
  4. jquery.dataTables.min.js:62 Uncaught TypeError: Cannot read property ‘style‘ of undefined原因
  5. python常用格式化_python的常用三种格式化方法
  6. .Net程序员学习Linux最简单的方法(转载)
  7. java季度第一天_Java得到年在一个季度的错误的第一天
  8. 神奇的python系列11:函数之生成器,列表推导式
  9. 仿360加速球。(实现内存释放)
  10. 网吧IC卡收费系统常见问题与解决(转)
  11. docker源码编译安装步骤解析
  12. js 翻转数组 倒序排列
  13. Mac 显示/不显示隐藏文件
  14. Java UI设计 计算三角形周长
  15. python中的Empty suite
  16. 讯飞AIUI集成语音语义的21003错误
  17. PDF格式转换WPS格式如何实现
  18. ROG 魔霸新锐 2022 评测
  19. 艾诗娜:红女巫 Ashina: The Red Witch Build.10280376 官方中文 免安装【209M】
  20. CAD如何编辑多段线的顶点信息

热门文章

  1. 视频倒立解决方法/USB 视频设备ID:USB\VID_13D3PID_5130MI_00\621DA5E0900000
  2. Serializable与serialVersionUID的作用
  3. 镁光ssd管理工具 linux,解决BIOS找不到SSD,镁光SSD固态硬盘升级固件方法
  4. DNF11.22服务器维护到几点,11.22体验服更新详情,文字版。预计正式服更新是11.26...
  5. 红旗linux桌面版_瑞星ESM杀毒软件For Linux获红旗兼容性认证
  6. JavaScript正则表达式大全
  7. 安装 Northwind 示例数据库
  8. 人民币大写金额转换为数字
  9. 如何用photoshop做24色环_PS教程!手把手教你快速绘制超漂亮的色环!
  10. uchome登陆机制分析(三)