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

来源:https://www.cnblogs.com/PY1780/archive/2018/07/18/9332478.html
-Advertisement-
Play Games

如果爬蟲需要展現速度,我覺得就是去下載圖片吧,原本是想選擇去煎蛋那裡下載圖片的,那裡的美女圖片都是高質量的,我稿子都是差不多寫好了的,無奈今天重新看下,妹子圖的入口給關了。 至於為什麼關呢,大家可以去看看XXX日報的關停原因吧或者百度下,這裡就不多說了,這次我選擇了去下載無版權高清圖片,因為做自媒體 ...


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

至於為什麼關呢,大家可以去看看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哦!

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • gets()函數 因為用gets函數輸入數組時,只知道數組開始處,不知道數組有多少個元素,輸入字元過長,會導致緩衝區溢出,多餘字元可能占用未使用的記憶體,也可能擦掉程式中的其他數據,後續用fgets函數代替。 fgets函數 一小段代碼舉例: (1) fgets函數一次讀入10 - 1個字元,如果少於 ...
  •   傳送文件描述符是高併發網路服務編程的一種常見實現方式。 "Nebula" 高性能通用網路框架即採用了UNIX域套接字傳遞文件描述符設計和實現。本文詳細說明一下傳送文件描述符的應用。 1. TCP伺服器程式設計範式   開發一個伺服器程式,有較多的的程式設計 ...
  • 在學習Celery之前,我先簡單的去瞭解了一下什麼是生產者消費者模式。 生產者消費者模式 在實際的軟體開發過程中,經常會碰到如下場景:某個模塊負責產生數據,這些數據由另一個模塊來負責處理(此處的模塊是廣義的,可以是類、函數、線程、進程等)。產生數據的模塊,就形象地稱為生產者;而處理數據的模塊,就稱為 ...
  • 並查集 並查集,在一些有N個元素的集合應用問題中,我們通常是在開始時讓每個元素構成一個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查找一個元素在哪個集合中。這一類問題近幾年來反覆出現在信息學的國際國內賽題中,其特點是看似並不複雜,但數據量極大,若用正常的數據結構來描述的話 ...
  • Description 給定n個正整數a1,a2,…,an,求 的值(答案模10^9+7)。 給定n個正整數a1,a2,…,an,求 的值(答案模10^9+7)。 Input 第一行一個正整數n。 接下來n行,每行一個正整數,分別為a1,a2,…,an。 第一行一個正整數n。 接下來n行,每行一個正 ...
  • 最近爬蟲,爬個貓眼都被封了IP。。 分享幾個常見的User-Agent吧,複製粘貼過來的,謝謝原創。 明天後天,就這周吧,把貓眼,巨潮資訊,陽光網爬一下,然後再爬幾個有漂亮mm的網站,後面再做一個自己的翻譯器。 時間是擠出來的。。 ...
  • 今天碰到一個場景,就是一個JavaBean,有些屬性的值需要去資料庫其他表中獲取,這樣就需要調用其他dao方法得到這個值,然後再set進去。 可是問題來了,如果需要用這種方式賦值的屬性特別多的話,一個一個set進去就需要寫很多set方法,代碼不僅冗餘,而且很麻煩。 於是就想通過反射機制去自動set值 ...
  • 一、Redis API支持 Python連接redis redis-py安裝方式 Python連接Redis redis連接分片集群 python連接redis sentinel Python String類型使用簡介 Python hash類型使用簡介 Python list類型使用簡介 Pyth ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...