Python爬虫-搜索并下载图片

本文是我学习Python爬虫的笔记,一直想要再学一门语言来扩展自己的知识面,看了看各种语言主要使用的方向,最后决心还是来搞一搞Python.Python给我的第一印象就是语法简洁,格式另类还有各种库的支持,就喜欢这么有个性的语言为了以后深入的学习爬虫,事先肯定是先把语法学了一遍,下面是我实现的一个小爬虫,可以通过百度图库利用关键字来搜索图片并下载

工具准备:

  • 不要多想,挑个IDE吧,我用的是PyCharm(免费的~嗯,今年刚刚免费的)
  • 打开PyCharm的设置(找找在哪,我都是直接commond+,的,如果你有commond键的话)在Project下选择Project Interpreter然后点击左下角的加号,在输入框中输入requests,收索后安装,其实还有很多其他的安装方法,使用pip,在终端中敲入那些代码,然后还有什么其他的东西,不过还是这样比较偷懒(其实前面的坑我都爬过了)
  • Python为最新版,2.7应该也没问题,并未使用Scrapy爬虫框架,也没有使用lxml,仅仅使用re正则和requests网络请求

re和requests用法

  • re正则

re就是正则,主要是用来解析数据的,当我们拿到网页的数据时需要从中提取处我们想要的数据,正则匹配就时其中的一个方法,至于正则的写法,这里就不在多讲,想看的在这里正则表达式30分钟入门教程,而re的常用使用手法可以在我的这篇文章里了解Python爬虫-re(正则表达式)模块常用方法,这里我们主要使用其re.findall("正则表达式","被匹配数据",匹配限制(例如:忽略大小写))

  • requests网络请求

requests的封装异常的强大,几乎可以做任何形式的网络请求,这里我们只是使用了其最简单的get请求requests.get("url",timeout=5),详细了解,可以看一下(requests快速入门)

具体的步骤

  • 首先是想清楚想要做什么,你想要获取什么数据(没有目标哪来的动力啊),这里我们是想要通过百度图片来后去图片链接及内容,我想要搜索关键字,并可以指定搜索的数据量,选择是否保存及保存的路径~

  • 需求有了,就要去分析要爬去的网页结构了,看一下我们的数据都在哪,我们这次要扒去的图片来自百度图片

  • 首先进入百度图库,你所看见的页面当向下滑动的时候可以不停的刷新,这是一个动态的网页,而我们可以选择更简单的方法,就是点击网页上方的传统翻页版本


    QQ20160602-0@2x.png
  • 接下来就是我们熟悉的翻页界面,你可以点击第几页来获取更多的图片


    QQ20160602-1@2x.png
  • 点击鼠标的右键可以查看网页的源代码,大概就是这个样子的,我们get下来的数据,就是这个啦,我们需要在这里面找到各个图片的链接下一页的链接,然而有点懵,这么多的数据,我们想要的在哪里呢?

    QQ20160602-2@2x.png

  • 不着急,我们可以通过浏览器的开发者工具来查看网页的元素,我用的是Chrome,打开Developer Tools来查看网页样式,当你的鼠标从结构表中划过时会实时显示此段代码所对应的位置区域,我们可以通过此方法,快速的找到图片所对应的位置:


    QQ20160602-3@2x.png

    找到了一张图片的路径和下一页的路径,我们可以在源码中搜索结果找到他们的位置,并分析如何书写正则来获取信息:


    QQ20160602-4@2x.png
  • 所有的数据都分析完毕了,这个时候就要开始写我们的爬虫了,看了这么久,竟然一句代码都没有:

import requests #首先导入库
import  re
然后设置默认配置
MaxSearchPage = 20 # 收索页数
CurrentPage = 0 # 当前正在搜索的页数
DefaultPath = "/Users/caishilin/Desktop/pictures" # 默认储存位置
NeedSave = 0 # 是否需要储存
图片链接正则和下一页的链接正则
def imageFiler(content): # 通过正则获取当前页面的图片地址数组
          return re.findall('"objURL":"(.*?)"',content,re.S)
def nextSource(content): # 通过正则获取下一页的网址
          next = re.findall('<div id="page">.*<a href="(.*?)" class="n">',content,re.S)[0]
          print("---------" + "http://image.baidu.com" + next) 
          return next
爬虫主体
def spidler(source):
          content = requests.get(source).text  # 通过链接获取内容
          imageArr = imageFiler(content) # 获取图片数组
          global CurrentPage
          print("Current page:" + str(CurrentPage) + "**********************************")
          for imageUrl in imageArr:
              print(imageUrl)
              global  NeedSave
              if NeedSave:  # 如果需要保存保存
                 global DefaultPath
                 try:                
                      picture = requests.get(imageUrl,timeout=10) # 下载图片并设置超时时间,如果图片地址错误就不继续等待了
                 except:                
                      print("Download image error! errorUrl:" + imageUrl)                
                      continue            
                 pictureSavePath = DefaultPath + imageUrl.replace('/','') # 创建图片保存的路径
                 fp = open(pictureSavePath,'wb') # 以写入二进制的方式打开文件            fp.write(picture.content)
                 fp.close()
           else:   
                global MaxSearchPage
                if CurrentPage <= MaxSearchPage:
                    if nextSource(content):
                        CurrentPage += 1                                         
                        spidler("http://image.baidu.com" + nextSource(content)) # 爬取完毕后通过下一页地址继续爬取
爬虫的开启方法
def  beginSearch(page=1,save=0,savePath="/users/caishilin/Desktop/pictures/"): # (page:爬取页数,save:是否储存,savePath:默认储存路径)
          global MaxSearchPage,NeedSave,DefaultPath
          MaxSearchPage = page
          NeedSave = save
          DefaultPath = savePath
          key = input("Please input you want search 
          StartSource = "http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=" + str(key) + "&ct=201326592&v=flip" # 分析链接可以得到,替换其`word`值后面的数据来收索关键词
          spidler(StartSource)
 调用开启的方法就可以通过关键词搜索图片了
beginSearch(page=1,save=0)

小结

** 因为对Python的理解还不是特别的深入,所以代码比较繁琐,相比较爬虫框架Scrapy来说,直接使用reqests和re显得并不是特别的酷,但是这是学习理解爬虫最好的方式,接下来我会陆陆续续将我学习爬虫框架Scrapy的过程写下来,有错误的地方请指正~**

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容

  • 1 前言 作为一名合格的数据分析师,其完整的技术知识体系必须贯穿数据获取、数据存储、数据提取、数据分析、数据挖掘、...
    whenif阅读 17,967评论 45 523
  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,567评论 6 28
  • 最近iOS方面没有开发任务, 老板给了我两周的时间学习爬虫. 期间踩了无数的坑. 终于算是可以在爬虫方面有所小成,...
    Pusswzy阅读 10,443评论 39 81
  • 爬虫文章 in 简书程序员专题: like:128-Python 爬取落网音乐 like:127-【图文详解】py...
    喜欢吃栗子阅读 21,616评论 4 412
  • 特别想一个人是什么感觉. 就是在夜里你看见关于他的消息. 知道了他最近的状况. 笑了笑. 发现他还是他. 也只能是...
    雯八岁阅读 113评论 0 0