Python爬蟲實戰——免費圖片 - Pixabay

更優體驗:Python爬蟲實戰——免費圖片 - Pixabay

Pixabay,一個挺不錯的高清無碼圖片網站,可以免費下載。

pixabay.com/

一些介紹

超過 900000 高質量照片、 插圖和矢量圖形。可免費用於商業用途。沒有所需的歸屬。

Pixabay是一家高質量圖片分享網站。最初,該網站由Hans Braxmeier和Simon Steinberger在德國發展起來。2013年2月,網站擁有由影師和其社區的插畫家提供的大約7萬張免費的照片和矢量圖形。該公司於2010年12月在德國烏爾姆成立。

2012年3月,Pixabay開始從一個私人圖像搜集網站轉變成一個互動的網上社區,該網站支持20種語言。同年5月,網站推出公共應用程序編程介面,從而使第三方用戶和網站開發人員搜索其圖像資料庫。網站還與Flickr,YouTube和維基共享資源。

Pixabay用戶無需註冊就可以獲得免費版權的高質量圖像。根據知識共享契約CC0相關的肖像權,用戶在該網站通過上傳圖片就默認放棄圖片版權,從而使圖片廣泛流通。網站允許任何人使用,修改圖片 - 即便是在商業應用 - 不要求許可並且未認可。

Pixabay為了確保高品質圖片標準,用戶上傳的所有圖片將由網站工作人員手動審批。大約27%的用戶會說英語,20%的用戶會說西班牙語,11%的用戶會說葡萄牙語,7%的用戶會說德語和5%的用戶會說法語。其用戶主要是博客、圖形設計師、作家、記者和廣告商。

今天的目標就是爬取小編精選的圖片 小編精選 - 照片

一、分析

我們需要寫3個函數

一個Download(url),用來下載圖片

一個用來獲取小編精選一共有的165頁FullUrl()

最後用來調用main()

下面開始一個個寫吧~

小編精選 - 照片

打開網頁,F12,查看圖片鏈接所在的標籤

可以看到圖片鏈接都在<img>標籤下,但是我自己發現前幾張和後幾張的屬性是不一樣的,提取出<img>中「src」就可以了,使用的是xpath

import requestsnfrom lxml import etreennheader = {User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36}nurl = https://pixabay.com/zh/editors_choice/nr = requests.get(url,headers=header).textns = etree.HTML(r)nprint(s.xpath(//img/@src))n

結果是

前面都是正確的圖片鏈接,可是後面出現了/static/img/blank.gif,這個是什麼鬼,查看網頁源代碼,搜索

可以發現確實有這一段字元串,我自己在這一點上花了很多時間。感謝http://www.zhihu.com/people/li-hong-jie-17-58的幫助,Python爬蟲動態頁面抓取問題? - 爬蟲(計算機網路) - 知乎

瀏覽器中的代碼是JavaScript修改過的, 你直接用requests請求然後列印出來看就會發現

<div class="item" data-w="640" data-h="426">n <a href="/zh/%E8%9B%8B%E7%B3%95-%E4%B8%80%E5%9D%97%E8%9B%8B%E7%B3%95-%E9%A3%9F%E8%B0%B1-%E4%B8%80%E7%89%87-%E7%B3%96%E6%9E%9C-%E6%8F%92%E5%9B%BE-%E7%83%98%E7%83%A4-%E7%94%9C%E7%82%B9-%E9%A3%9F%E5%93%81-1971556/">n <img src="/static/img/blank.gif" data-lazy-srcset="https://cdn.pixabay.com/photo/2017/01/11/11/33/cake-1971556__340.jpg 1x, https://cdn.pixabay.com/photo/2017/01/11/11/33/cake-1971556__480.jpg 2x" data-lazy="https://cdn.pixabay.com/photo/2017/01/11/11/33/cake-1971556__340.jpg" alt="">n n </a>n <div>n

requests返回的數據中可以看到,「data-lazy」總含有我們需要的數據,修改代碼

發現現在返回的數據是我們需要的,打開一張圖片查看

下面的圖片要清晰很多,我們只需要把「__340」換成「_960_720」即可

小編精選一共有165頁,我們需要獲取下一頁URL

pixabay.com/zh/editors_

pixabay.com/zh/editors_

。。。

規律很簡單

full_link = []n for i in range(1,165):n #print(i)n full_link.append( https://pixabay.com/zh/editors_choice/?media_type=photo&pagi=+ str(i))n

到現在,準備工作做好了,思路可能不是很清楚,請諒解~

二、代碼

import requestsnfrom lxml import etreenimport timenimport urllibnndef Download(url):n header = {n User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36}n r = s.get(url, headers=header).textn s = etree.HTML(r)n r = s.xpath(//img/@data-lazy)n for i in r:n imglist = i.replace(__340, _960_720)n name = imglist.split(/)[-1]#圖片名稱n urllib.request.urlretrieve(imglist,name)n time.sleep(1)nnndef FullUrl():n full_link = []n for i in range(2,165):n #print(i)n full_link.append( https://pixabay.com/zh/editors_choice/?media_type=photo&pagi=+ str(i))n #print(full)n return full_linknnif __name__ == __main__:n urls = FullUrl()n for url in urls:n Download(url)n

爬取圖片的工作就完成了,粗略的計算6600張,每一張下載需要5秒鐘,一分鐘60秒、一小時60分鐘,天吶,需要9個小時才能爬取全部的圖片。想一想還是算了吧,整站爬取還是要使用Scrapy+mongodb

>>> 165*40n6600n>>> from __future__ import divisionn>>> 6600*5/60/60n9.166666666666666n

下載了700多張,108M,也算是留著看看吧。

一會上傳到Github上

zhangslob/Pixabay

三、結語

昨天學習了崔慶才老師的爬蟲,感覺真的學習到了好多,對Python爬蟲提高很有幫助,還有,原來他就是靜覓,剛開始學習爬蟲就在看他的博客,沒想到他現在又在出爬蟲教程,打算跟著學習。

分享內容:

1. 分析知乎Ajax請求及爬取邏輯

2. 用Scrapy實現遞歸爬取

3. 爬取結果存儲到MongoDB

廢話不多說,自己看看就知道了。

cuiqingcai.com/

微課錄播 | 03月17日 爬取知乎所有用戶詳細信息

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------最後的小廣告-------------------------------------------------------

有朋友竟然叫我去作一期直播,講一講Python。

打算根據自己的經歷分享一些經驗,主要是關於Python入門的,想聽聽可以私信我。

時間是周二晚9點~

Hello World! Try to be a Pythoner!


推薦閱讀:

給妹子講python--17函數的基本特徵
如何零基礎自學入門Python
Python實踐20-閉包簡介
Python培訓是運維還是全棧,有什麼區別嗎?
PyQt5系列教程(16):小車快跑(滑塊的使用)

TAG:Python | 爬虫计算机网络 |