一款Google抓圖神器,它與Python批量抓取圖片的原理一模一樣

  • 2019 年 11 月 11 日
  • 筆記

——寫在前面的話

相信大家前段時間肯定看到一篇文章名為《只因寫了一段爬蟲,公司200多人被抓!》的公眾號文章(文章的描述已經顯而易見,大家都非常清楚了)

https://mp.weixin.qq.com/s/bvSnLrgqaW57vISHEajqqQ

可以說,因為這事鬧的人心惶惶,沸沸揚揚,為此,致使一些三線二線的個別爬蟲工程師迫切轉行,其次,還有一些朋友對自己所學的爬蟲技術感到擔憂和恐慌。

其實,每個人都會有這種警惕心理。不過大可不必弄出轉行這樣的大陣仗,我們更多的還是要從業務本身出發,既要增強自己的業務能力,也有熟知互聯網法律法規。雖然我個人學的不是爬蟲這個技術,但是我平時也酷愛學習爬蟲的一些小項目和小玩意兒,雖然比起我花在演算法上學習的時間比例會少很多,不過我個人喜歡嘗試一些新鮮的技術以充實自己的業務水平,從這一點來看,大多數工程師都會有這種業務傾向。當然,與那些站在互聯網一線的爬蟲工程師和大佬來說,我只不過是大海里的一滴水,水滴的數量還不夠罷了。

說到上面這件事,其實歸根結底還是有些公司和公司職員他們對法律缺乏足夠的認識,公司對於員工的法律宣傳以及業務操守沒能達到潛移默化的作用,尤其是互聯網的法律法規的相關條例的傳達和思想工作沒能及時到位,當然,這些不能總依靠公司,主要還是看個人的悟性,既然自己已經幹了這一行就應該對這個行業的法律常識有所了解和學習。為此,我們作為這個時代科技創新和技術研發中的一員,要時刻遵守互聯網法律法規,做好自己的本職工作,多多為社會做出力所能及的貢獻。

文章目錄:

——寫在前面的話

1——抓圖神器

2——使用Python批量抓取圖片

(1)抓取對象:sogou圖庫http://pic.sogou.com/

(2)抓取類別:進入sogou壁紙

(3)用requests提取圖片組件

(4)找到圖片的真正的url

(5)批量抓取圖片成功

下面開始學習我們今天的內容~~

1——抓圖神器

我一直喜歡的一個Google圖片抓取插件名叫ImageAssistant

目前用戶量為114567,可以說已經是很不錯了

它的工作原理與Python批量抓取圖片一模一樣

我並非是為Google打廣告,我只是覺得好用就分享給大家,以提升大家的辦公效率,當然本節最重要的還是要學Python批量抓取圖片的原理和方法。

下面簡單介紹一下該插件的使用方法,安裝插件之後記得選擇你存放文件的地方,並在Google設置下的下載詢問訪問關閉

(不然每次都要按保存,非常麻煩,如果有100張圖片你肯定會按100次)

安裝好插件之後,下面簡單用影片演示一下抓取過程

例如:去微博抓鞠婧禕小姐姐的圖片,

進去之後,滑鼠右鍵單擊IA工具就可以

2——使用Python批量抓取圖片

註:文中的抓意為「爬」

(1)抓取對象:sogou圖庫http://pic.sogou.com/

(2)抓取類別:進入sogou壁紙,打開網頁源程式碼(快捷鍵為F12)

由於我使用的是Google chrome瀏覽器,所以要找到img標籤

(3)用requests提取圖片組件

抓取思路與庫文件requests的使用

可以發現圖片src存在於img標籤下,於是用 Python 的 requests提取該組件,從而獲取img的src,然後使用庫 urllib.request.urlretrieve逐個下載圖片,進而達到批量獲取資料的目的。

開始抓取第一步:

(註:Network–>headers,然後用滑鼠點擊左邊菜單欄(地址欄)里的圖片鏈接,然後再headers里找到圖片url)

下面根據上述思路爬取我們想要的結果:經過查找網頁程式碼下獲得搜狗圖片的url為

http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD

這裡的url來自進入分類後的地址欄(如上圖)。


剖析源碼 剖析上述的url指向的網頁

import requests #導入庫requests  import urllib   #導入庫requests下面的urllib  from bs4 import BeautifulSoup  #使用BeautifulSoup,關於這個的用法請查看本公眾號往期文章  #下面填入url  res = requests.get('http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD')  soup = BeautifulSoup(res.text,'html.parser')  print(soup.select('img')) #圖片列印格式

執行結果

從上述的執行結果來看,列印的輸出內容並沒有包含我們要的圖片元素,而是只剖析到tupian130x34_@1x(或指網頁中的logo)的img,顯然不是我們想要的。也就是說需要的圖片資料不在url下,也就是不在下面的url裡面

http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD。

因此,下面需要找到圖片不在url裡面的原因並改進。

開始抓取第二步:

考慮可能該圖片元素是動態的,細心的人可能會發現,當在網頁內,向下滑動滑鼠滾輪,圖片是動態刷新出來的,也就是說,該網頁並不是一次載入出全部資源,而是動態載入資源。這也避免了因為網頁過於臃腫,而影響載入速度。

(4)找到圖片的真正的url

要找到所有圖片真正的url ,這個好像有點難度,不過在本項目中小試牛刀也不是不可以。在後面的學習中經過不斷的鑽研,對與這類業務能力我想都會逐漸提高得。

類似開始抓取第一步中的「注」我們找到位置:

F12——>>Network——>>XHR——>>(點擊XHR下的文件)——>>Preview

(註:如果沒有發現Preview里的內容可滾動左邊地址欄或點擊圖片鏈接)

從上圖發現,似乎圖片中的資訊就是我們需要的元素了,點開all_items 發現下面是0 1 2 3…一個一個的貌似是圖片元素的數據。

試著打開一個url。發現真的是圖片的地址

我們可以任意在裡面選取一個圖片的地址以驗證是否為圖片的所在地:

https://img02.sogoucdn.com/app/a/100520076/60d0bc82efd7bd55a716f28a04822f76

將該地址粘貼到瀏覽器搜索就獲得如下結果,說明這個地址的url就是我們找的

上面找到圖片的目標之後,我們點擊XHR下的Headers,也就是第二行

Request URL:

https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA%B8&tag=%E5%85%A8%E9%83%A8&start=180&len=15&width=1366&height=768

試著去掉一些不必要的部分,刪掉上面的部分之後,訪問不受影響。

(刪除的位置是類似相同的地方,切記後面長寬高不用刪)

例如:刪除「=%E5%A3%81%E7%BA%B8&tag」得到

https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%85%A8%E9%83%A8&start=180&len=15&width=1366&height=768

複製該網站到瀏覽者訪問獲得如下的結果:

其中url里的category為分類,start為開始下標,len為長度,也即圖片的數量。

此外,在imges下的時候要注意url內容的填寫(並不是直接把url直接複製過來)

換成「+」的情況

(5)批量抓取圖片成功

如果你的電腦沒有庫文件requests就要記得cmd命令安裝一下:

pip install requests

最後,經不斷整理後源碼如下:

import requests  import json      #使用json碼  import urllib    def getSogouImag(category,length,path):      n = length      cate = category      #分類      imgs = requests.get('http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category='+cate+'&tag=%E5%85%A8%E9%83%A8&start=0&len='+str(n))      jd = json.loads(imgs.text)      jd = jd['all_items']      imgs_url = []          #在url獲取圖片imgs      for j in jd:          imgs_url.append(j['bthumbUrl'])      m = 0      for img_url in imgs_url:              print('***** '+str(m)+'.jpg *****'+'   Downloading...')              urllib.request.urlretrieve(img_url,path+str(m)+'.jpg')              m = m + 1      print('Download complete!')    getSogouImag('壁紙',2000,'F:/Py666/抓圖/') #抓取後圖片存取的本地位置  

執行程式:去指定的位置就找到了圖片存在的位置,這樣就大功告成了。