萬物皆可爬——亮數據代理IP+Python爬蟲批量下載百度圖片助力AI訓練

  • 💂 個人網站:【 摸魚游戲】【神級代碼資源網站】【導航大全】
  • 🤟 一站式輕松構建小程序、Web網站、移動應用:👉注冊地址
  • 🤟 基于Web端打造的:👉輕量化工具創作平臺
  • 💅 想尋找共同學習交流,摸魚劃水的小伙伴,請點擊【全棧技術交流群】

項目背景

本文檔詳細介紹了一個網絡爬蟲項目的準備和實現過程。該項目的目標是從百度圖片搜索中獲取圖片鏈接并下載圖片。此類爬蟲項目通常用于收集大量的圖片數據,以便用于訓練各種人工智能模型,特別是計算機視覺模型。計算機視覺領域的研究需要大量的圖像數據來訓練和測試模型,以便實現圖像分類、對象檢測、圖像生成等功能。

一、項目準備

環境配置

在開始編寫爬蟲之前,確保已經完成以下環境配置:

Python安裝: 確保已安裝Python 3.x版本。Python是一種功能強大且易于學習的編程語言,適合于各種編程任務,包括網絡爬蟲開發。

需要的庫: Python有一個龐大的第三方庫生態系統,我們將使用幾個核心庫來開發我們的爬蟲:

  • requests: 用于發送HTTP請求和處理響應。
  • json: 用于處理JSON格式的數據。
  • urllib: 提供了在網絡上獲取數據的一些功能,我們主要用來進行URL編碼。
  • os: 提供了與操作系統交互的功能,用于創建文件夾等文件操作。
  • time: 提供了時間相關的功能,例如休眠程序以及計時等。

可以使用以下命令通過pip安裝這些庫:

pip install requests

如果你使用的是Anaconda等集成環境,可以使用conda命令:

conda install requests

這些庫將幫助我們處理HTTP請求、解析和存儲數據,以及進行一些基本的系統操作。

二、爬蟲設計與實現

爬蟲設計思路

目標網站分析

本爬蟲目標是從百度圖片搜索獲取圖片鏈接并下載。百度圖片搜索返回的結果是JSON格式的數據,其中包含了圖片的縮略圖鏈接。

數據獲取流程
  1. 構建百度圖片搜索的URL,通過GET請求獲取JSON數據。
  2. 解析JSON數據,提取縮略圖鏈接。
  3. 下載圖片到本地存儲。

代碼實現

初始化爬蟲類(BaiduImageSpider)
import requests
import json
from urllib import parse
import os
import timeclass BaiduImageSpider(object):def __init__(self):self.json_count = 0  # 請求到的json文件數量(一個json文件包含30個圖像文件)self.url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=5179920884740494226&ipn=rj&ct' \'=201326592&is=&fp=result&queryWord={' \'}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word={' \'}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn={' \'}&rn=30&gsm=1e&1635054081427= 'self.directory = r"C:\價值一個億\python-mini-projects\projects\baidutupian\{}"  # 存儲目錄  這里需要修改為自己希望保存的目錄  {}不要丟self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Accept-Language': 'en-US,en;q=0.9','Referer': 'https://image.baidu.com'}
創建存儲文件夾
# 創建存儲文件夾def create_directory(self, name):self.directory = self.directory.format(name)# 如果目錄不存在則創建if not os.path.exists(self.directory):os.makedirs(self.directory)self.directory += r'\{}'
獲取圖像鏈接
# 獲取圖像鏈接
def get_image_link(self, url):list_image_link = []strhtml = requests.get(url, headers=self.header)  # Get方式獲取網頁數據print(f"Response content for URL {url}:\n{strhtml.text}\n")try:jsonInfo = json.loads(strhtml.text)except json.JSONDecodeError:print("Error decoding JSON")return list_image_linkif 'data' in jsonInfo:for index in range(len(jsonInfo['data'])):if 'thumbURL' in jsonInfo['data'][index]:list_image_link.append(jsonInfo['data'][index]['thumbURL'])else:print("No 'data' key in the response JSON")return list_image_link
下載圖片
# 下載圖片
def save_image(self, img_link, filename):try:res = requests.get(img_link, headers=self.header)if res.status_code == 404:print(f"圖片 {img_link} 下載出錯")else:with open(filename, "wb") as f:f.write(res.content)print("存儲路徑:" + filename)except requests.RequestException as e:print(f"Error downloading image: {e}")
主運行函數
# 入口函數
def run(self):searchName = input("查詢內容:")searchName_parse = parse.quote(searchName)  # 編碼self.create_directory(searchName)pic_number = 0  # 圖像數量for index in range(self.json_count):pn = index * 30request_url = self.url.format(searchName_parse, searchName_parse, str(pn))list_image_link = self.get_image_link(request_url)for link in list_image_link:pic_number += 1self.save_image(link, self.directory.format(str(pic_number) + '.jpg'))time.sleep(1)  # 休眠1秒,防止封ipprint(searchName + "----圖像下載完成--------->")

三、代碼詳解

__init__ 方法

init 方法用于初始化爬蟲類的屬性。在這個方法中,我們定義了以下幾個重要的屬性:

  • json_count: 用于指定要請求的JSON文件數量,每個JSON文件包含多個圖像條目。
  • url: 百度圖片搜索的API URL,包含了多個參數用于構造請求。
  • directory: 存儲下載圖片的目錄路徑。這個路徑在 create_directory 方法中被初始化和修改。
  • header: 請求頭信息,包括用戶代理、接受語言和引用頁,用于模擬瀏覽器發送請求。

create_directory 方法

create_directory 方法根據提供的名稱創建存儲圖片的文件夾。具體步驟如下:

  1. 將 directory 屬性格式化為指定的存儲目錄路徑。
  2. 使用 os.makedirs() 方法創建多層目錄,如果目錄不存在的話。
  3. 將 directory 屬性更新為包含圖片文件名格式的路徑,以便后續保存圖片時直接在該路徑下生成文件。

get_image_link 方法

get_image_link 方法負責發送GET請求獲取百度圖片搜索返回的JSON數據,并解析數據提取圖片的縮略圖鏈接。具體步驟如下:

  1. 使用 requests.get() 方法發送GET請求,獲取包含圖片信息的JSON數據。
  2. 嘗試解析返回的JSON數據,如果解析失敗則捕獲 json.JSONDecodeError 異常并打印錯誤信息。
  3. 如果JSON數據中包含 data 鍵,遍歷數據條目并提取每個條目中的 thumbURL(縮略圖鏈接),將其添加到 list_image_link 列表中。
  4. 如果JSON數據中不存在 data 鍵,則打印相應的錯誤信息并返回空列表。

save_image 方法

save_image 方法用于下載圖片到本地存儲。具體步驟如下:

  1. 使用 requests.get() 方法發送GET請求,獲取包含圖片數據的響應。
  2. 檢查響應狀態碼,如果返回的狀態碼是404,則打印錯誤信息表示圖片下載失敗。
  3. 如果響應正常,將圖片數據寫入以指定文件名 filename 打開的二進制文件中(使用 “wb” 模式)。
  4. 打印存儲圖片的路徑信息,表示圖片已成功保存到本地。

run 方法

run 方法是爬蟲的主運行函數,負責處理用戶輸入的查詢內容,循環獲取圖片鏈接并下載到本地存儲。具體步驟如下:

  1. 提示用戶輸入要查詢的內容,并對用戶輸入的內容進行URL編碼,以便構造百度圖片搜索的查詢URL。
  2. 調用 create_directory 方法創建存儲圖片的目錄,目錄名與用戶輸入的查詢內容相關聯。
  3. 初始化 pic_number 變量,用于記錄已下載的圖片數量。
  4. 使用循環從0到 json_count (設定的請求的JSON文件數量)遍歷,構造不同頁數的百度圖片搜索URL,發送請求并獲取圖片鏈接。
  5. 遍歷獲取的圖片鏈接列表,逐個下載圖片到本地存儲,并在每次下載后休眠1秒以防止IP被封禁。
  6. 下載完成后打印提示信息,指示所有圖片已成功下載并存儲到指定目錄中。

以上詳細解釋了每個方法在爬蟲實現中的作用和具體實現步驟,確保了爬蟲能夠有效地從百度圖片搜索中獲取指定數量的圖片并保存到本地。

四、亮數據代理IP的使用

為什么需要代理IP

在爬取網站數據時,頻繁的請求會被網站識別為異常流量,可能導致IP被封禁。使用代理IP可以隱藏真實IP,降低被封禁的風險。

如何在爬蟲中配置代理IP

可以使用第三方代理IP服務商提供的代理IP池,例如requests庫中的proxies參數。這里我采用的是亮數據IP代理服務。
在這里插入圖片描述

修改代碼以支持代理IP

在請求中添加代理IP,例如:

proxies = {'http': 'http://user:password@proxy_ip:port','https': 'https://user:password@proxy_ip:port',
}
requests.get(url, headers=self.header, proxies=proxies)

五、完整代碼及運行結果

以下是完整的Python代碼實現:

# -*- coding:utf8 -*-
import requests
import json
from urllib import parse
import os
import timeclass BaiduImageSpider(object):def __init__(self):self.json_count = 0  # 請求到的json文件數量(一個json文件包含30個圖像文件)self.url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=5179920884740494226&ipn=rj&ct' \'=201326592&is=&fp=result&queryWord={' \'}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word={' \'}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn={' \'}&rn=30&gsm=1e&1635054081427= 'self.directory = r"C:\價值一個億\python-mini-projects\projects\baidutupian\{}"  # 存儲目錄  這里需要修改為自己希望保存的目錄  {}不要丟self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Accept-Language': 'en-US,en;q=0.9','Referer': 'https://image.baidu.com'}# 創建存儲文件夾def create_directory(self, name):self.directory = self.directory.format(name)# 如果目錄不存在則創建if not os.path.exists(self.directory):os.makedirs(self.directory)self.directory += r'\{}'# 獲取圖像鏈接def get_image_link(self, url):list_image_link =[]strhtml = requests.get(url, headers=self.header)  # Get方式獲取網頁數據print(f"Response content for URL {url}:\n{strhtml.text}\n")try:jsonInfo = json.loads(strhtml.text)except json.JSONDecodeError:print("Error decoding JSON")return list_image_linkif 'data' in jsonInfo:for index in range(len(jsonInfo['data'])):if 'thumbURL' in jsonInfo['data'][index]:list_image_link.append(jsonInfo['data'][index]['thumbURL'])else:print("No 'data' key in the response JSON")return list_image_link# 下載圖片def save_image(self, img_link, filename):try:res = requests.get(img_link, headers=self.header)if res.status_code == 404:print(f"圖片 {img_link} 下載出錯")else:with open(filename, "wb") as f:f.write(res.content)print("存儲路徑:" + filename)except requests.RequestException as e:print(f"Error downloading image: {e}")# 入口函數def run(self):searchName = input("查詢內容:")searchName_parse = parse.quote(searchName)  # 編碼self.create_directory(searchName)pic_number = 0  # 圖像數量for index in range(self.json_count):pn = index * 30request_url = self.url.format(searchName_parse, searchName_parse, str(pn))list_image_link = self.get_image_link(request_url)for link in list_image_link:pic_number += 1self.save_image(link, self.directory.format(str(pic_number) + '.jpg'))time.sleep(1)  # 休眠1秒,防止封ipprint(searchName + "----圖像下載完成--------->")if __name__ == '__main__':spider = BaiduImageSpider()spider.json_count = 10  # 定義下載10組圖像,也就是三百張spider.run()

演示爬蟲的運行

運行以上代碼,按照提示輸入查詢內容,爬蟲將開始從百度圖片搜索下載相關圖片。

在這里插入圖片描述

下載的圖片展示

在這里插入圖片描述

六、總結

本文詳細介紹了如何使用Python編寫一個簡單的爬蟲,用于從百度圖片搜索下載圖片。通過分析目標網站、設計爬蟲流程、實現代碼以及配置代理IP,使得爬蟲能夠有效地獲取圖片數據。通過本項目,讀者可以學習到基本的爬蟲原理和實現方法,同時也了解到了如何處理異常情況和優化爬蟲效率的方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36886.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36886.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36886.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

注意!!2024下《網絡規劃設計師》易混淆知識點來了,趕緊碼住

寶子們,在復習軟考網絡規劃設計師中,是不是覺得有很多知識點含義比較相近,很多友友剛看的時候,估計會像我一樣把它們弄混,作為一個軟考老鳥,在這里給大家整理了網規學習過程中易混淆的知識點,大…

新版彩虹云商城卡密商城/自動發卡可分站多套模板可選

完整免授權彩虹源碼(多模板+小儲云商城模板)版本 6.7.5,部分代碼加密,使用起來一點問題都沒有,加密部分是授權那一塊,可以二開更改一下,就完事 無差錯,免授權,功能齊全,模板齊全。 后臺可設置的模板有 20 套,喜歡的就購買研究學習 支持多個接口,支持到賬到個人錢…

Detailed Steps for Troubleshooting ORA-00600 [kdsgrp1] (文檔 ID 1492150.1)

Detailed Steps for Troubleshooting ORA-00600 [kdsgrp1] (文檔 ID 1492150.1)?編輯轉到底部 In this Document Purpose Troubleshooting Steps References APPLIES TO: Oracle Database - Enterprise Edition Oracle Database Cloud Schema Service - Version N/A and lat…

Android 生成 AAR 包

當我們需要在 Android 項目中引用第三方庫或模塊時,常常會使用 AAR(Android Archive)包。AAR 包是一種包含了編譯后代碼、資源文件和清單文件等的二進制文件。 步驟 1:創建一個 Android Library 項目 在 Android Studio 中&#…

Ngnix內存池——高并發實現高效內存管理

目錄 一、高并發下傳統方式的弊端 1、常用的內存操作函數 2、弊端一 3、弊端二 4、弊端三 5、弊端四 二、弊端解決之道 1、內存管理維度分析 2、內存管理組件選型 三、高并發內存管理最佳實踐 1、內存池技術 2、內存池如何解決弊端 3、高并發內存池如何實現 四、…

FC-Planner: 一個基于骨架引導的快速覆蓋復雜3D場景的規劃框架方案實現與難點講解

FC-Planner方案實現細節與難點講解 1. 骨架提取 骨架提取是FC-Planner的核心模塊之一,其目的是從輸入的點云數據中提取出場景的骨架結構。這一步的關鍵是如何準確高效地計算每個點的ROSA點。 1.1 ROSA點計算 ROSA點的計算涉及到兩個優化問題: ROSA點方向 v p v_p vp?的優化…

《數字圖像處理與機器視覺》案例二(基于邊緣檢測和數學形態學焊縫圖像處理)

一、前言 焊縫是評價焊接質量的重要標志,人工檢測方法存在檢測標準不統一,檢測精度低,焊縫視覺檢測技術作為一種重要的質量檢測方法,正逐漸在各行各業中嶄露頭角。把焊縫準確的從焊接工件中準確分割出來是焊縫評價的關鍵一步&…

linux上git的使用

目錄 1.測試是否安裝有git 2.下載項目到本地 3.三板斧 1.將代碼放在創建的目錄中 2.提交改動到本地 3.提交代碼到遠端 4.注意點 以及補充內容 1.測試是否安裝有git 如果輸入git --help 會顯示下面一大串那么就是已經安裝,否則需要自行手動安裝 yum install g…

聚焦從業人員疏散逃生避險意識能力提升,推動生產經營單位每年至少組織開展(疏散逃生演練,讓全體從業人員熟知逃生通道、安全出口及應急處置要求,形成常態化機制。

聚焦從業人員疏散逃生避險意識能力提升,推動生產經營單位每年至少組織開展(疏散逃生演練,讓全體從業人員熟知逃生通道、安全出口及應急處置要求,形成常態化機制。完整試題答案查看 A.三次B.兩次C.一次 綜合運用“四不兩直”、明察暗訪、 ()、…

潔盟超聲波清洗機怎么樣?橫向測評希亦、潔盟、蘇泊爾超聲波清洗機誰是實力派

生活中大多數人戴眼鏡,但是很多人都不注意眼鏡的保養,導致鏡片越來越模糊,從而引發多邊的狀況發生,比如長久戴模糊不清的眼鏡,視力會受到影響隨之下降。甚至是眼鏡長期不清洗,上面的灰塵、細菌會影響眼部健…

彩虹PLM系統在航空航天業的應用與實踐

彩虹PLM系統在航空航天業的應用與實踐 彩虹PLM系統作為航空航天業的卓越解決方案,已經在眾多企業中得到了廣泛的應用和實踐。該系統通過其獨特的功能和優勢,為航空航天企業帶來了顯著的管理效益和市場競爭力提升。 彩虹PLM系統 在應用方面,彩…

這樣解釋 TCP_IP 真的很好理解

想象一下,你住在一個大城市里,這個城市就是你的計算機網絡世界。在這個城市中,有許多房子(代表不同的計算機),這些房子之間由各種道路和交通設施連接起來(代表網絡的物理連接)。 現在…

1.2 離散LTI系統的時域分析

目錄 離散系統的定義 離散LTI系統的時域描述h[k] 離散系統的分類 線性與非線性系統 時變與非時變系統 因果與非因果系統 穩定與不穩定系統 滑動平均系統 LTI——Linear and Time-invariant System 線性時不變系統 離散系統的定義 離散LTI系統的時域描述h[k] 離…

【java12】java12新特性之File的mismatch方法

Java12引入了一個新的方法 mismatch,它屬于java.nio.file.Files類。此方法用于比較兩個文件的內容,并返回第一個不匹配字節的位置。如果兩個文件完全相同,則返回-1。 Files.mismatch 方法聲明 public static long mismatch(Path path1, Pat…

【并發編程】2-Synchronized

基本概念 線程安全問題三個要素:多線程、共享資源、非原子性操作;產生的根本原因:多條線程同時對一個共享資源進行非原子性操作;Synchronized解決線程安全問題的方式:通過互斥鎖將多線程的并行執行變為單線程串行執行…

昇思25天學習打卡營第4天|數據集Dataset

數據集 Dataset 介紹 之前說過,MindSpore是基于Pipeline,通過Dataset和Transformer進行數據處理。Dataset在其中是用來加載原始數據的。mindSpore提供了數據集加載接口,可以加載文本、圖像、音頻等,同時也可以自定義加載接口。此…

【UE開發】游戲庫存UI系統Demo

1.項目介紹 1.描述:一種用于存儲記錄玩家物品的游戲內可視化操作系統。 2.演示:https://www.bilibili.com/video/BV1f53neVEfW/?vd_source50dea901fd12253f417c48b937975b0d 3.大綱: 4.樣式: 2.W_Inventory_Main_01(…

CORE Mobility Errorr的調試

在運行CORE tutorial 3中的mobility示例時,出現如下錯誤: 當看到這個問題的時候,并沒有仔細去分析日志和現象,在core-daemon的進程打印界面只看了一下最后的出錯堆棧: 2024-06-27 10:43:48,614 - ERROR - _server:_ca…

MySQL8 新特性——公用表表達式用法 with t1 as (select * from user)

MySQL8 新特性——公用表表達式用法_mysql ctes-CSDN博客 1.普通公用表表達式 MySQL8 新特性——公用表表達式用法 在MySQL 8.0及更高版本中,引入了公用表表達式(Common Table Expressions,CTEs),它是一種方便且可重…

docker部署vue項目

1.下載docker desktop軟件 Docker Desktop啟動的時候,有可能彈框提示"WSL2 installations is incomplete",這是您的系統中沒有安裝WSL2內核的原因,打開【https://aka.ms/wsl2kernel ,在打開的頁面中有一個Linux內核更新包"鏈…