操方法詳解)
很多人在做電商選品、競品分析或者店鋪裝修的時(shí)候都會(huì)遇到同一個(gè)需求想把某個(gè)商品詳情頁里的所有圖片、視頻一次性保存到本地。一個(gè)個(gè)右鍵另存為不僅效率低而且經(jīng)常漏掉隱藏的細(xì)節(jié)圖和場景圖。這篇文章把我在阿里巴巴、淘寶這類電商平臺(tái)上批量下載商品圖片和視頻的實(shí)際操作經(jīng)驗(yàn)整理出來分三條路線講清楚從瀏覽器插件到抓包分析再到腳本化采集你可以按自己的技術(shù)基礎(chǔ)直接選一條用。批量下載這個(gè)詞聽起來好像有點(diǎn)灰色其實(shí)只要用途正當(dāng)比如備份自有店鋪素材、做設(shè)計(jì)參考、整理產(chǎn)品資料完全合理。文章不會(huì)鼓勵(lì)任何違反平臺(tái)規(guī)則或者侵犯版權(quán)的高頻爬取行為所有方法都建立在低頻、合法、克制的原則上。1. 批量下載這件事到底難在哪1.1 電商平臺(tái)不希望你批量下載的三個(gè)原因淘寶、阿里巴巴以及1688這類平臺(tái)商品詳情頁本質(zhì)上是由大量圖片和視頻組成的富媒體內(nèi)容。從頁面結(jié)構(gòu)上看一張商品主圖、五張?jiān)斍檩啿D、視頻展示區(qū)、SKU圖、詳情描述圖這些資源分散在不同接口和存儲(chǔ)域名下。你直接保存網(wǎng)頁根本沒法定向拿到高清原圖因?yàn)闉g覽器保存下來的只是HTML結(jié)構(gòu)。平臺(tái)不希望你輕松批量下載無非三個(gè)原因。第一是帶寬和服務(wù)器成本詳情頁的圖片都是動(dòng)態(tài)加載的大量高頻請(qǐng)求會(huì)占用CDN資源第二是防盜鏈機(jī)制很多圖片地址帶有簽名參數(shù)或者Referer校驗(yàn)直接復(fù)制鏈接打開經(jīng)常報(bào)錯(cuò)第三是版權(quán)保護(hù)意識(shí)商家上傳的圖片視頻屬于商業(yè)資產(chǎn)隨意批量復(fù)制確實(shí)涉及侵權(quán)風(fēng)險(xiǎn)。這三點(diǎn)決定了批量下載不能靠蠻力必須講究策略和節(jié)奏。1.2 三條路線對(duì)比每個(gè)人都能找到適合自己的方式我先后用過三種方式各自適用不同人群。瀏覽器插件方案適合完全不懂代碼的人選中頁面一鍵抓取五分鐘上手瀏覽器開發(fā)者工具方案適合愿意動(dòng)腦子的運(yùn)營人員不需要寫代碼但從Network面板里分析出資源地址后可以用簡單命令或者在線工具下載Python腳本方案適合真正有批量生產(chǎn)需求的人可以做到翻頁、去重、斷點(diǎn)續(xù)傳、自動(dòng)命名一次跑完上千個(gè)商品。三條路線本質(zhì)上解決的是同一個(gè)問題如何從復(fù)雜的網(wǎng)頁結(jié)構(gòu)里精準(zhǔn)鎖定圖片和視頻的真實(shí)資源地址然后把它們落到本地硬盤。后面你會(huì)發(fā)現(xiàn)不管選哪條路線核心邏輯都是找資源地址、構(gòu)造下載請(qǐng)求、保存文件區(qū)別只是自動(dòng)化程度不一樣。我建議第一次搞的人先走一遍路線A理解整個(gè)流程之后再?zèng)Q定要不要往深度走。2. 準(zhǔn)備工作先從一張主圖看起2.1 一張商品圖片是怎么被加載出來的搞清楚批量下載的原理前得先明白一個(gè)網(wǎng)頁里圖片和視頻是怎么出現(xiàn)在你面前的。當(dāng)你在瀏覽器輸入商品鏈接頁面先加載HTML骨架然后JavaScript腳本運(yùn)行去請(qǐng)求一個(gè)商品詳情接口拿到結(jié)構(gòu)化數(shù)據(jù)。這個(gè)數(shù)據(jù)里包含圖片URL列表、視頻URL、SKU信息等。瀏覽器再把URL指向的圖片渲染到頁面。關(guān)鍵點(diǎn)在這里你看到的圖片地址和真實(shí)原圖地址往往不是同一個(gè)。詳情頁里經(jīng)常展示的是壓縮后的縮略圖URL中間帶著比如 “_250x250.jpg” 這樣的尺寸標(biāo)記。批量下載想要高清就得多一步處理把尺寸標(biāo)記替換成原圖參數(shù)。有些平臺(tái)的原圖地址規(guī)律非常明顯刪掉中間那段就是高清原圖。這個(gè)規(guī)律我在后面會(huì)詳細(xì)講。2.2 把目標(biāo)范圍說清楚再動(dòng)手開始下載之前先花一分鐘想清楚你到底要什么。是要一個(gè)商品的全部SKU圖還是要一整個(gè)列表頁里所有商品的主圖是只要視頻還是圖片視頻都要是只要當(dāng)頁商品還是需要翻5頁、10頁。范圍不同工作量天差地別。以我自己的經(jīng)驗(yàn)最耗時(shí)的不是下載而是整理。如果你批量下載了300張圖但文件名全是時(shí)間戳或者無意義字符串找起來等于白干。所以下載前就要規(guī)劃命名規(guī)則比如用“商品ID_序號(hào)_用途”這樣的格式。這一步很多人忽略等到下載完才后悔這是批量下載里最隱蔽的坑。2.3 工具選型與瀏覽器環(huán)境準(zhǔn)備環(huán)境準(zhǔn)備不復(fù)雜。瀏覽器我建議用Chrome或者Edge只要它足夠現(xiàn)代能打開開發(fā)者工具就行。如果你走插件路線先確認(rèn)瀏覽器應(yīng)用商店能正常訪問。另外準(zhǔn)備一個(gè)專門的文件夾放下載內(nèi)容并且確保磁盤空間充足我遇到過用戶下載到一半磁盤滿了前面的圖全部白下。如果你想用腳本路線電腦上需要裝Python環(huán)境建議3.8以上版本。還需要三個(gè)常用庫requests用來發(fā)送HTTP請(qǐng)求BeautifulSoup4或者lxml用來解析HTML正則表達(dá)式庫用來從文本里抽URL。這些庫通過pip命令一鍵安裝不復(fù)雜。還有一點(diǎn)要說清楚就是下載請(qǐng)求里必須帶上正常的User-Agent和Referer字段否則很多平臺(tái)會(huì)直接拒絕連接。3. 實(shí)操路線A瀏覽器插件快速下載3.1 插件選擇要點(diǎn)別只看下載量市面上圖片批量下載類插件很多但電商平臺(tái)場景下真正好用的不多。選擇時(shí)重點(diǎn)看三個(gè)能力第一能不能識(shí)別懶加載圖片?,F(xiàn)在詳情頁圖片很多是滾動(dòng)到可見區(qū)域才加載普通插件只能抓到首屏那幾張等于半殘。第二能不能過濾視頻和圖片或者至少清晰分類。第三能不能自定義文件名前綴和目錄規(guī)則。我實(shí)測(cè)下來功能關(guān)鍵詞可以搜“圖片批量下載”“image downloader”裝那種支持正則過濾、圖片尺寸過濾的。這類插件會(huì)把當(dāng)前頁面里所有圖片資源列出來你直接勾選需要的就行。如果你對(duì)某個(gè)插件不熟先拿一個(gè)商品詳情頁做測(cè)試看看抓到的是不是原始清晰度圖片再做決定。3.2 五步抓取流程實(shí)錄第一步打開目標(biāo)商品詳情頁等頁面所有內(nèi)容加載完畢。第二步點(diǎn)擊插件圖標(biāo)插件會(huì)自動(dòng)掃描當(dāng)前頁面的IMG標(biāo)簽和背景圖。第三步在插件面板里按圖片尺寸排序優(yōu)先找寬高超過800像素的那些這通常是詳情大圖。第四步勾選需要的圖片設(shè)置文件名前綴比如“鞋類A款”。第五步點(diǎn)擊下載插件會(huì)觸發(fā)瀏覽器的多文件下載能力。這里面有個(gè)細(xì)節(jié)容易被坑插件默認(rèn)抓到的圖片可能包含圖標(biāo)、頭像、功能按鈕等無關(guān)資源。所以你需要在插件面板里篩選URL只保留域名指向圖片存儲(chǔ)域名的鏈接。圖片存儲(chǔ)域名通常和頁面域名不同它可能是一串類似 “ae01.alicdn.com” 或 “img.alicdn.com” 的地址。遇到這類域名放心勾選。注意插件方式下載視頻支持不太好。如果你需要視頻建議直接跳到后面的開發(fā)者工具路線。3.3 商品視頻下載與封面提取視頻在HTML里通常不是直接的MP4標(biāo)簽而是一個(gè)嵌套的播放器容器。插件要抓到視頻鏈接得先識(shí)別video標(biāo)簽得source子標(biāo)簽或者播放器初始化時(shí)加載的配置文件。如果你用的插件能列出所有媒體資源你會(huì)在面板里看到類似“blob:https://...”的地址這種地址是瀏覽器內(nèi)存流不能直接下載。我常用的替代方案是在詳情頁右鍵點(diǎn)擊視頻區(qū)域選擇“檢查然后在開發(fā)者工具的Network面板里刷新頁面按media過濾請(qǐng)求。這樣你能看到真正的視頻文件請(qǐng)求通常以.mp4結(jié)尾。右鍵這個(gè)請(qǐng)求選擇open in new tab就能直接另存為。這個(gè)操作不依賴插件一次只能下一條視頻但勝在簡單可靠。4. 實(shí)操路線B開發(fā)者工具手把手完成一次抓包4.1 Network面板怎么用瀏覽器開發(fā)者工具是批量下載的照妖鏡所有資源請(qǐng)求都在這里現(xiàn)出原形。按F12打開開發(fā)者工具切到Network選項(xiàng)卡然后刷新商品詳情頁。你會(huì)看到頁面發(fā)起幾十甚至上百個(gè)請(qǐng)求類型包括document、script、xhr、img、media等。要讓列表更清晰可以在篩選框里輸入關(guān)鍵字。比如圖片資源的域名里通常帶著“img”視頻資源帶著“mp4”或“video”。點(diǎn)擊每一行請(qǐng)求右側(cè)能查看響應(yīng)頭、預(yù)覽和實(shí)際內(nèi)容。通過響應(yīng)內(nèi)容的格式你能快速判斷這個(gè)請(qǐng)求是頁面數(shù)據(jù)接口還是圖片文件本身。這個(gè)界面就是你解剖整個(gè)商品頁資源結(jié)構(gòu)的手術(shù)臺(tái)。4.2 從Response里過濾出真實(shí)圖片地址當(dāng)你找到一個(gè)XHR請(qǐng)求它的響應(yīng)內(nèi)容是JSON格式時(shí)多半就是商品詳情接口。在Preview標(biāo)簽頁里展開數(shù)據(jù)結(jié)構(gòu)你會(huì)看到類似 imageList、videoList這樣的字段。有些接口的字段名是代碼風(fēng)格比如 “itemPropMainImgMap”不要害怕逐個(gè)展開發(fā)現(xiàn)URL字符串基本就是資源地址。電商平臺(tái)經(jīng)常做地址加密比如給URL加點(diǎn)簽名參數(shù)t162xxx。這個(gè)參數(shù)是防止外部直接引用的。你在瀏覽器開發(fā)者工具里看到的是完整可訪問地址但直接拿去用有時(shí)會(huì)超時(shí)。處理辦法很簡單把下載請(qǐng)求的Referer頭設(shè)置為商品詳情頁地址多半能解決。4.3 從列表頁批量提取全套地址單個(gè)詳情頁解決了還談不上批量。真正的批量在列表頁翻頁階段。比如你想采集某店鋪的所有商品主圖先在列表頁打開開發(fā)者工具分析列表頁接口規(guī)律。通常翻頁就是切換查詢參數(shù)里的頁碼字段比如 “page2”。你只需要在Network面板找到列表頁接口觀察頁碼參數(shù)的變化然后把參數(shù)替換成1到N逐個(gè)請(qǐng)求這些接口就能拿到所有商品的ID和主圖地址。這個(gè)階段的整理工作很關(guān)鍵。建議在Excel里建兩列一列商品ID一列主圖URL。后面下載時(shí)用ID做文件名前綴一眼就知道圖屬于哪個(gè)商品。我用這個(gè)辦法做過一個(gè)店鋪近千款商品的圖片梳理四十分鐘內(nèi)全部搞定比人工操作快了幾十倍。5. 實(shí)操路線C腳本化批量采集的完整思路5.1 三層結(jié)構(gòu)請(qǐng)求、解析、下載如果你有信心用Python可以考慮把整個(gè)流程腳本化。腳本建議拆成三層請(qǐng)求層負(fù)責(zé)構(gòu)造請(qǐng)求、處理反爬解析層負(fù)責(zé)從響應(yīng)里提取URL列表和文件名下載層負(fù)責(zé)多線程或隊(duì)列下載、斷點(diǎn)續(xù)傳、重試。請(qǐng)求層最核心的是會(huì)話對(duì)象。用requests.Session()保持登錄態(tài)把瀏覽器里復(fù)制的Cookie、User-Agent、Referer配置進(jìn)去。很多電商接口要求登錄后才有完整詳情數(shù)據(jù)所以先用瀏覽器登錄再把Cookie復(fù)制到腳本里是最快的方案。解析層不需要太復(fù)雜。商品詳情接口如果是JSON直接用json庫解析如果是HTML用BeautifulSoup解析IMG標(biāo)簽和video標(biāo)簽。提取到的URL建議先存成文本文件每行一個(gè)最后統(tǒng)一由下載層處理。把提取和下載解耦的好處是你可以在下載前檢查一遍URL清單把不相關(guān)資源剔除避免下一堆垃圾。5.2 命名規(guī)則與去重設(shè)計(jì)腳本化之后最大的工作量反而在文件管理。我強(qiáng)烈建議在代碼里就對(duì)文件名做規(guī)則化處理。規(guī)則可以這樣商品ID用正則從URL里抽取圖片序號(hào)按出現(xiàn)順序遞增再加一個(gè)用途標(biāo)簽。最終名字類似“A12345_01_main.jpg”“A12345_02_detail.jpg”。這樣的文件整理進(jìn)文件夾后不需要打開預(yù)覽就能秒懂內(nèi)容歸屬。去重同樣重要。同一個(gè)商品圖片可能在不同頁面重復(fù)出現(xiàn)如果不做去重下載完會(huì)多出一大堆沒用的副本。推薦對(duì)URL做MD5哈希把哈希值存進(jìn)一個(gè)集合下載前先檢查集合里是否已存在。這個(gè)做法實(shí)現(xiàn)成本極低但對(duì)磁盤空間和后續(xù)整理效率的提升立竿見影。5.3 限速、重試與斷點(diǎn)續(xù)傳腳本采集最怕的是一腔熱情跑起來結(jié)果賬號(hào)被封或者IP被限制。應(yīng)對(duì)策略是限速。最簡單粗暴的辦法是在循環(huán)里加上time.sleep(2)每次請(qǐng)求間隔兩秒以上。更成熟的做法是使用隨機(jī)間隔比如每次等1到3秒模擬人的操作節(jié)奏。有經(jīng)驗(yàn)的采集者還會(huì)在代碼里檢測(cè)響應(yīng)狀態(tài)碼一旦遇到頻繁的429或者403狀態(tài)就自動(dòng)停止等待一段時(shí)間再繼續(xù)。下載層建議用downloader庫或者requests的stream模式。streamTrue時(shí)可以先查Content-Length然后按chunk寫文件這樣即使網(wǎng)絡(luò)斷了也能從斷點(diǎn)繼續(xù)。重試機(jī)制建議做三次第一次失敗等待5秒重試第二次失敗等待30秒第三次失敗就跳過并把URL記錄到error.log文件里。跑完腳本后檢查這個(gè)日志文件單獨(dú)處理異常項(xiàng)。注意批量腳本只適用于個(gè)人合法場景比如備份自有店鋪素材或者獲取已獲得授權(quán)的資料。未經(jīng)授權(quán)的高頻抓取別人店鋪內(nèi)容是不合適的平臺(tái)方有權(quán)根據(jù)服務(wù)協(xié)議采取限制措施。6. 常見問題與排查技巧實(shí)錄6.1 圖片抓不全只有首屏幾張這幾乎是懶加載導(dǎo)致的最典型問題。詳情頁圖片在頁面未滾動(dòng)到對(duì)應(yīng)區(qū)域時(shí)不會(huì)發(fā)起請(qǐng)求所以插件和腳本只能看到前幾張。解決辦法有三個(gè)頁面打開后模擬滾動(dòng)把滾動(dòng)條從頂部逐步拉到底部觸發(fā)全部圖片加載直接找頁面的數(shù)據(jù)接口繞過懶加載邏輯在Network面板里找圖片域名下的所有XHR請(qǐng)求從中提取URL。我處理這個(gè)問題時(shí)最常用的是第二種方法。頁面數(shù)據(jù)接口一次返回所有圖片地址與頁面是否滾動(dòng)無關(guān)。所以遇到抓不全時(shí)先別急著改代碼回到Network面板找找有沒有一個(gè)JSON返回了完整列表。這個(gè)JSON通常名稱里包含“detail”或者“item”關(guān)鍵字。6.2 視頻下載后打不開或只有聲音商品詳情頁的視頻有兩種常見格式。一種是完整MP4文件另一種是HLS流媒體格式。HLS格式用M3U8索引文件引用多個(gè)TS分片如果你用常規(guī)下載手段只保存了一個(gè)TS分片播放器就會(huì)報(bào)錯(cuò)或者畫面卡住。遇到m3u8結(jié)尾的地址需要用專門的下載工具把分片合并成完整MP4。判斷方法很簡單看URL后綴是.mp4還是.m3u8。m3u8需要用支持HLS協(xié)議的下載器很多視頻下載工具都內(nèi)置了這個(gè)能力。另外有些平臺(tái)視頻分標(biāo)清和高清兩個(gè)地址接口返回的是一個(gè)視頻列表需要根據(jù)清晰度參數(shù)挑選。默認(rèn)取第一個(gè)往往不是清晰度最高的得多看一眼。6.3 頻繁請(qǐng)求導(dǎo)致驗(yàn)證碼和IP限制做過采集的人對(duì)驗(yàn)證碼都不陌生。出現(xiàn)驗(yàn)證碼說明行為頻率已經(jīng)引起風(fēng)控。我個(gè)人的經(jīng)驗(yàn)是遇到驗(yàn)證碼不要想著繞過而是停下來調(diào)整策略。先停一小時(shí)把請(qǐng)求間隔從2秒提高到10秒再測(cè)試是否恢復(fù)。如果仍然觸發(fā)說明對(duì)方的限制條件更嚴(yán)格建議降低到每天固定數(shù)量分批次完成。還有一個(gè)容易忽略的點(diǎn)同一個(gè)網(wǎng)絡(luò)出口下多臺(tái)設(shè)備同時(shí)采集風(fēng)險(xiǎn)會(huì)疊加。如果你在一個(gè)辦公網(wǎng)里操作注意協(xié)調(diào)其他人避免大家一起觸發(fā)反爬。被限制后也不要嘗試用多個(gè)賬號(hào)輪換躲避檢測(cè)這種操作明顯違反平臺(tái)規(guī)則不在討論范圍內(nèi)。7. 一些值得記住的個(gè)人心得整個(gè)批量下載過程說到底是一場關(guān)于資源定位的博弈。你不需要成為黑客只需要理解網(wǎng)頁資源加載的基本邏輯知道圖片和視頻最終一定來自某個(gè)可請(qǐng)求的地址然后用合適的工具把它拿下來。插件適合應(yīng)急抓包適合理解原理腳本適合真正高頻復(fù)用的場景。我在實(shí)操中最深的體會(huì)是永遠(yuǎn)先手工完成一個(gè)商品的全流程再談批量。手工走一遍你能發(fā)現(xiàn)圖片是不是高清、視頻能不能播放、命名規(guī)則合不合理、目錄結(jié)構(gòu)好不好用。這些細(xì)節(jié)一旦在批量階段暴露返工成本非常高。我見過好幾個(gè)人滿懷信心跑完腳本最后面對(duì)5000個(gè)亂碼文件名欲哭無淚。最后一個(gè)小技巧批量下載前先下載一張圖觀察它的字節(jié)大小。如果只有幾KB到十幾KB說明拿到的是縮略圖趕緊回去研究原圖地址規(guī)則。高清原圖通常在100KB以上這個(gè)簡單的判斷能幫你省下大量時(shí)間。先保證質(zhì)量再追求數(shù)量批量下載才能真正為你創(chuàng)造價(jià)值。