首頁  >  文章  >  後端開發  >  利用python5分鐘做個圖片自動下載器

利用python5分鐘做個圖片自動下載器

怪我咯
怪我咯原創
2017-06-23 14:26:191519瀏覽


 

python爬蟲實戰-圖片自動下載器

 

#python實戰-圖片自動下載器

 

#製作爬蟲的基本步驟

    順便透過這個小例子,可以掌握一些關於製作爬蟲的基本的步驟。
  1. 一般來說,製作一個爬蟲需要分成以下幾個步驟:

  2. 分析需求(對,需求分析非常重要,不要告訴我你老師沒教你)

  3. 分析網頁原始碼,配合F12(沒有F12那麼亂的網頁原始碼,你想看死我?)

  4. 寫正規表示式或XPath表達式(就是前面說的那個神器)

#正式寫python爬蟲程式碼

##效果

#運行:

恩,讓我輸入關鍵字,讓我想想,輸入什麼好?好像有點暴露愛好了。

Enter

#好像開始下載了!好讚! ,我看看下載的圖片,哇瞬間我感覺我又補充了很多表情包....

#好了,差不多就是這麼個東西。


需求分析

"我想要圖片,我又不想上網搜「

」最好還能自動下載"

這就是需求,好了,我們開始分析需求,至少要實現兩個功能,一是搜尋圖片,二是自動下載。

首先,搜尋圖片,最容易想到的就是爬百度圖片的結果,好,那我們就上百度圖片看看

##基本上就是這樣,還挺漂亮的。

我們試著搜一個東西,我打一個暴字,出來一系列搜尋結果,這說明什麼....

隨便找一個回車

好了,我們已經看到了很多圖片了,如果我們能把這裡面的圖片都爬下來就好了。我們看見網址裡有關鍵字資訊

我們試著在網址直接換下關鍵字,跳轉了有沒有!

這樣,可以透過這個網址找出特定的關鍵字的圖片,所以理論上,我們可以不用開啟網頁就能搜尋特定的圖片了。下個問題就是如何實現自動下載,其實利用之前的知識,我們知道可以用request,獲取圖片的網址,然後把它爬下來,保存成.jpg就行了。

所以這個專案就應該可以完成了。

分析網頁

好了,我們開始做下一步,分析網頁原始碼。這裡 我先切換回傳統頁面,為什麼要這樣做,因為目前百度圖片採用的是瀑布流模式,動態載入圖片,處理起來很麻煩,傳統的翻頁介面就好很多了。

這裡還一個技巧,就是:能爬手機版就不要爬電腦版,因為手機版的程式碼很清晰,很容易取得需要的內容。

好了,切換回傳統版本了,還是有頁碼的看的舒服。

我們點選右鍵,檢視原始碼

#這都是什麼鬼,怎麼可能看清楚! !

###這時候,就要用F12了,開發者工具!我們回到上一頁面,按F12,出來下面這個工具欄,我們需要用的就是左上角那個東西,一個是滑鼠跟隨,一個是切換手機版本,都對我們很有用。我們這裡用第一個###


然后选择你想看源代码的地方,就可以发现,下面的代码区自动定位到了这个位置,是不是很NB!

我们复制这个地址

然后到刚才的乱七八糟的源代码里搜索一下,发现它的位置了!(小样!我还找不到你!)但是这里我们又疑惑了,这个图片怎么有这么多地址,到底用哪个呢?我们可以看到有thumbURL,middleURL,hoverURL,objURL

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

好了,找到了图片位置,我们就开始分析它的代码。我看看是不是所有的objURL全是图片

貌似都是以.jpg格式结尾的,那应该跑不了了,我们可以看到搜索出61条,说明应该有61个图片

编写正则表达式

通过前面的学习,写出如下的一条正则表达式不难把?

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

编写爬虫代码

好了,正式开始编写爬虫代码了。这里我们就用了2个包,一个是正则,一个是requests包,之前也介绍过了,没看的回去看!

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

然后我们把刚才的网址粘过来,传入requests,然后把正则表达式写好

url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA'



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

理论有很多图片,所以要循环,我们打印出结果来看看,然后用request获取网址,这里由于有些图片可能存在网址打不开的情况,加个5秒超时控制。

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

好了,再就是把网址保存下来,我们在事先在当前目录建立一个picture目录,把图片都放进去,命名的时候,用数字命名把

    string = 'pictures\\'+str(i) + '.jpg'
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()
    i += 1

整个代码就是这样:

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

url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA'html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)i = 0for each in pic_url:
    print each
    try:
        pic= requests.get(each, timeout=10)
    except requests.exceptions.ConnectionError:
        print '【错误】当前图片无法下载'
        continue
    string = 'pictures\\'+str(i) + '.jpg'
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()i += 1

我们运行一下,看效果(什么你说这是什么IDE感觉很炫!?赶紧去装Pycharm,Pycharm的配置和使用看这个文章!)!

好了我们下载了58个图片,咦刚才不是应该是61个吗?


我们看,运行中出现了有一些图片下载不了


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

所以,百度有些图片它缓存到了自己的机器上,所以你还能看见,但是实际连接已经失效

好了,现在自动下载问题解决了,那根据关键词搜索图片呢?只要改url就行了,我这里把代码写下来了

    word = raw_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)

好了,享受你第一个图片下载爬虫吧!!当然不只能下载百度的图片拉,依葫芦画瓢,你现在应该做很多事情了,比如爬取头像,爬淘宝展示图,或是...美女图片,捂脸。一切都凭客官你的想象了,当然,作为爬虫的第一个实例,虽然纯用request已经能解决很多问题了,但是效率还是不够高,如果想要高效爬取大量数据,还是用scrapy吧

以上是利用python5分鐘做個圖片自動下載器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn