爬蟲高玩教你用Python每秒鐘下載一張高清大圖,快不快?

來源:互聯網
上載者:User

標籤:cio   自己   get   pen   下載   網址   nts   日常   其他   

如果爬蟲需要展現速度,我覺得就是去下載圖片吧,原本是想選擇去煎蛋那裡下載圖片的,那裡的美女圖片都是高品質的,我稿子都是差不多寫好了的,無奈今天重新看下,妹子圖的入口給關了。

至於為什麼關呢,大家可以去看看XXX日報的關停原因吧或者百度下,這裡就不多說了,這次我選擇了去下載無著作權高清圖片,因為做自媒體的人很怕侵權,找無著作權的圖片彷彿成了日常工作,所以這次我選擇了這個網站

https://unsplash.com/

 

那下面來看看使用非同步以及不使用非同步差別?

 

(右邊是使用非同步,左邊是沒有使用非同步,由於用於測試,所以選擇下載12張圖片即可)

可以看到,在使用非同步之後啟動並執行時間比不使用非同步程式少了差不多6倍的時間,是不是感覺到high了起來?那我們分析下怎樣爬取吧。

1. 找目標網頁

這個網站首頁就有一堆圖片,而且往下拉時還會自動重新整理,很明顯是個ajax載入,但不怕,動態載入這東西我們之前講過了,所以開啟開發人員工具看下是怎樣的請求吧。

 

 

往下拉的時候很容易看到這個請求,這個是一個get請求,狀態代碼為200,網址為https://unsplash.com/napi/photos?page=3&per_page=12&order_by=latest,有三個參數,很容易知道page參數就是頁,這個參數是變化的,其他的參數都是不變的。

 

返回來的內容是個json類型,裡面的links下的download就是我們圖片下載的連結,現在所有東西都清楚了,那下面就是代碼了。

2. 代碼部分

async def __get_content(self, link):

async with aiohttp.ClientSession() as session:

response = await session.get(link)

content = await response.read()

return content

這個是擷取圖片的內容的方法,aiohttpClientSession和requests.session的用法是差不多,只不過擷取unicode編碼的方法變成了read()。

下面是完整代碼

import requests, os, time

import aiohttp, asyncio

class Spider(object):

def __init__(self):

self.headers = {

‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36‘}

self.num = 1

if ‘圖片‘ not in os.listdir(‘.‘):

os.mkdir(‘圖片‘)

self.path = os.path.join(os.path.abspath(‘.‘), ‘圖片‘)

os.chdir(self.path) # 進入檔案下載路徑

async def __get_content(self, link):

async with aiohttp.ClientSession() as session:

response = await session.get(link)

content = await response.read()

return content

def __get_img_links(self, page):

url = ‘https://unsplash.com/napi/photos‘

data = {

‘page‘: page,

‘per_page‘: 12,

‘order_by‘: ‘latest‘

}

response = requests.get(url, params=data)

if response.status_code == 200:

return response.json()

else:

print(‘請求失敗,狀態代碼為%s‘ % response.status_code)

async def __download_img(self, img):

content = await self.__get_content(img[1])

with open(img[0]+‘.jpg‘, ‘wb‘) as f:

f.write(content)

print(‘下載第%s張圖片成功‘ % self.num)

self.num += 1

def run(self):

start = time.time()

for x in range(1, 101): # 下載一百頁的圖片就可以了,或者自己更改頁數

links = self.__get_img_links(x)

tasks = [asyncio.ensure_future(self.__download_img((link[‘id‘], link[‘links‘][‘download‘]))) for link in links]

loop = asyncio.get_event_loop()

loop.run_until_complete(asyncio.wait(tasks))

if self.num >= 10: # 測試速度使用,如需要下載多張圖片可以注釋這段代碼

break

end = time.time()

print(‘共運行了%s秒‘ % (end-start))

def main():

spider = Spider()

spider.run()

if __name__ == ‘__main__‘:

main()

可以看到不到50行的代碼就可以把整個網網站的圖片下載下來了,不得不吹一下python的強大~~~

 

福利時間:

 

進群:125240963 即可擷取數十套PDF哦!

 

爬蟲高玩教你用Python每秒鐘下載一張高清大圖,快不快?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.