PYTHON爬取圖片

来源:https://www.cnblogs.com/mingdeng3000/archive/2022/12/10/16972305.html
-Advertisement-
Play Games

from threading import Threadfrom concurrent.futures import ThreadPoolExecutorfrom multiprocessing import Process, Queueimport requestsfrom lxml import ...


from threading import Thread
from concurrent.futures import ThreadPoolExecutor
from multiprocessing import Process, Queue
import requests
from lxml import etree
from urllib import parse

# 異常處理還未優化,後續補上
# 未解決問題1:這是爬取多個頁面的當前所有圖片,圖片內部的還未處理
# 未解決問題2:當爬取頁面過多時,會報錯,原因還未找到,後續補上

headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Mobile Safari/537.36",
# 防盜鏈 : 朔源,當前本次請求的上一級是誰
"Referer": "https://xxx"
}


def get_img_src(q):
urls = []
for i in range(1, 5):
if i == 1:
a = f"https://xxx/index.html"
else:
a = f"https://xxx/{i}.html"
urls.append(a)
href_list_all = []
for i in urls:
resp = requests.get(i, headers=headers)
resp.encoding = 'utf-8'
tree = etree.HTML(resp.text)
href_list = tree.xpath("//div[@class='list-box-p']/ul/li/a/@href")
href_list_all.append(href_list)

for all_list in href_list_all:
for href in all_list:
child_resp = requests.get(href, headers=headers)
child_resp.encoding = 'utf-8'
child_tree = etree.HTML(child_resp.text)
src = child_tree.xpath("//div[@class='img_box']/a/img/@src")[0] # 註意這裡獲取的是列表,需要取裡面的下標為0的第一個元素值
q.put(src) # 迴圈向隊列里裝東西,後面好給下載用
print(f"---------------------------------------------------被塞進隊列--------------------->{src}")
q.put("完事了")


def download(src):
print('開始下載------------>', src)
name = src.split('/')[-1]
with open("./image/" + name, mode='wb') as f:
resp = requests.get(src, headers=headers)
f.write(resp.content)
print('下載完畢------------>', src)


def download_img(q):
with ThreadPoolExecutor(5) as t:
while 1:
src = q.get() # 從隊列里拿東西,如果沒數據就阻塞,一直等著有數據來
if src == "完事了":
break
t.submit(download, src)


if __name__ == '__main__':
q = Queue()
p1 = Process(target=get_img_src, args=(q,))
p2 = Process(target=download_img, args=(q,))
p1.start()
p2.start()

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

-Advertisement-
Play Games
更多相關文章
  • 《對話工程師》是「貿澤電子」贊助、「與非網」製作的一檔網路節目,自2022年11月起,邀請不同技術領域的資深工程師,聊聊開發過程中的經驗感悟,欄目共 10 期,痞子衡有幸被邀請做了第 4 期節目的嘉賓(12月5日在 「B站 - 與非網官方賬號」里剛播出第 1 期)。 說起與《對話工程師》節目的結緣, ...
  • 1.5.6 NN與2NN 1.5.6.1 HDFS元數據管理機制 問題1:NameNode如何管理和存儲元數據? 電腦中存儲數據兩種:記憶體或者是磁碟 元數據存儲磁碟:存儲磁碟無法面對客戶端對元數據信息的任意的快速低延遲的響應,但是安全性高 元數據存儲記憶體:元數據存放記憶體,可以高效的查詢以及快速響應 ...
  • Redis項目總結--緩存更新策略 1.更新策略 | | 記憶體淘汰 | 超時剔除 | 主動更新 | | : : | : : | : : | : : | | 說明 | 不用自己維護,利用Redis記憶體淘汰機制,記憶體不足時自動淘汰部分數據,下次查詢時更新緩存 | 給緩存數據添加過期時間,到期刪除,下次查 ...
  • this指針,存儲的是一個記憶體地址,如同變數一樣,指向一塊記憶體區域; 而這個記憶體區域,保存的就是一個對象的數據,那麼這個對象是什麼呢? 通常來說,this指針,主要是用在方法(函數)中,用來指向調用方法(函數)的對象; 比如說,有個方法eat(),這個方法裡面有個this指針; 當Tom調用eat時 ...
  • "Simplicity is prerequisite for reliability." - Edsger Dijkstra “簡單是可靠的前提條件。” —— 艾茲格·迪傑斯特拉 0x00 大綱 0x01 前言 最近在重溫設計模式(in Java)的相關知識,然後在工廠模式的實現上面進行了一些較深 ...
  • 一、6-8作業總結 (1)第六次作業:第一次作業分了兩個題,一個電信1題目非常長,給出了類圖,類很多工作量很大。還一個題以容器類為例展現了介面,多態的用處和效果,題目給出的提示非常多,按照題目來,再加上一些測試代碼,可以運用equals類實現。 (2)第七次作業:第二次作業分了三個小題,第一個還是電 ...
  • 本文記錄博主線上項目一次用戶重覆註冊問題的分析過程與解決方案 博主github地址: github.com/wayn111 一 復現過程 線上客戶端用戶使用微信掃碼登陸時需要再綁定一個手機號,在綁定手機後,用戶購買客戶端商品下線再登錄,發現用戶賬號ID被變更,已經不是用戶剛綁定手機號時自動登錄的用戶 ...
  • 一、什麼是深度優先遍歷(DFS) 以“深度”為第一關鍵詞,每次都沿路徑到不能再前進時,才退回到最近的岔路口,然後繼續按同樣的邏輯搜索。 二、題目與解答 題目: Leetcode 695. 島嶼的最大面積 解答思路: 首先要遍曆數組,當發現(i,j)對應為陸地時,進行如下步驟: (1)遞歸解法 遞歸解 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...