python爬蟲實戰——5分鐘做個圖片自動下載器

来源:http://www.cnblogs.com/jiaoyu121/archive/2017/06/13/7004046.html
-Advertisement-
Play Games

python爬蟲實戰——圖片自動下載器 製作爬蟲的基本步驟 順便通過這個小例子,可以掌握一些有關製作爬蟲的基本的步驟。 一般來說,製作一個爬蟲需要分以下幾個步驟: 效果 運行: 恩,讓我輸入關鍵詞,讓我想想,輸入什麼好呢?好像有點暴露愛好了。 回車 好像開始下載了!好贊!,我看看下載的圖片,哇瞬間我 ...



 

python爬蟲實戰——圖片自動下載器

 

製作爬蟲的基本步驟

順便通過這個小例子,可以掌握一些有關製作爬蟲的基本的步驟。

一般來說,製作一個爬蟲需要分以下幾個步驟:

  1. 分析需求(對,需求分析非常重要,不要告訴我你老師沒教你)
  2. 分析網頁源代碼,配合F12(沒有F12那麼亂的網頁源代碼,你想看死我?)
  3. 編寫正則表達式或者XPath表達式(就是前面說的那個神器)
  4. 正式編寫python爬蟲代碼

效果

運行:

恩,讓我輸入關鍵詞,讓我想想,輸入什麼好呢?好像有點暴露愛好了。

回車

好像開始下載了!好贊!,我看看下載的圖片,哇瞬間我感覺我又補充了好多表情包....

好了,差不多就是這麼個東西。

需求分析

"我想要圖片,我又不想上網搜“
"最好還能自動下載"
……

這就是需求,好了,我們開始分析需求,至少要實現兩個功能,一是搜索圖片,二是自動下載。

首先,搜索圖片,最容易想到的就是爬百度圖片的結果,好,那我們就上百度圖片看看

基本就是這樣,還挺漂亮的。

我們試著搜一個東西,我打一個暴字,出來一系列搜索結果,這說明什麼....

隨便找一個回車

好了,我們已經看到了很多圖片了,如果我們能把這裡面的圖片都爬下來就好了。我們看見網址里有關鍵詞信息

我們試著在網址直接換下關鍵詞,跳轉了有沒有!

這樣,可以通過這個網址查找特定的關鍵詞的圖片,所以理論上,我們可以不用打開網頁就能搜索特定的圖片了。下個問題就是如何實現自動下載,其實利用之前的知識,我們知道可以用request,獲取圖片的網址,然後把它爬下來,保存成.jpg就行了。

所以這個項目就應該可以完成了。

分析網頁

好了,我們開始做下一步,分析網頁源代碼。這裡 我先切換回傳統頁面,為什麼這樣做,因為目前百度圖片採用的是瀑布流模式,動態載入圖片,處理起來很麻煩,傳統的翻頁界面就好很多了。

這裡還一個技巧,就是:能爬手機版就不要爬電腦版,因為手機版的代碼很清晰,很容易獲取需要的內容。

好了,切換回傳統版本了,還是有頁碼的看的舒服。

我們點擊右鍵,查看源代碼

這都是什麼鬼,怎麼可能看清!!

這個時候,就要用F12了,開發者工具!我們回到上一頁面,按F12,出來下麵這個工具欄,我們需要用的就是左上角那個東西,一個是滑鼠跟隨,一個是切換手機版本,都對我們很有用。我們這裡用第一個


然後選擇你想看源代碼的地方,就可以發現,下麵的代碼區自動定位到了這個位置,是不是很NB!

我們複製這個地址

然後到剛纔的亂七八糟的源代碼里搜索一下,發現它的位置了!(小樣!我還找不到你!)但是這裡我們又疑惑了,這個圖片怎麼有這麼多地址,到底用哪個呢?我們可以看到有thumbURL,middleURL,hoverURL,objURL

通過分析可以知道,前面兩個是縮小的版本,hover是滑鼠移動過後顯示的版本,objURL應該是我們需要的,不信可以打開這幾個網址看看,發現obj那個最大最清晰。

好了,找到了圖片位置,我們就開始分析它的代碼。我看看是不是所有的objURL全是圖片

貌似都是以.jpg格式結尾的,那應該跑不了了,我們可以看到搜索出61條,說明應該有61個圖片

編寫正則表達式

通過前面的學習,寫出如下的一條正則表達式不難把?

pic_url = re.findall('"objURL":"(.*?)",',html,re.S)

編寫爬蟲代碼

好了,正式開始編寫爬蟲代碼了。這裡我們就用了2個包,一個是正則,一個是requests包,之前也介紹過了,沒看的回去看!

#-*- coding:utf-8 -*-
import re
import requests

然後我們把剛纔的網址粘過來,傳入requests,然後把正則表達式寫好

url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA'



html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)

理論有很多圖片,所以要迴圈,我們列印出結果來看看,然後用request獲取網址,這裡由於有些圖片可能存在網址打不開的情況,加個5秒超時控制。

pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
i = 0
for each in pic_url:
    print each
    try:
        pic= requests.get(each, timeout=10)
    except requests.exceptions.ConnectionError:
        print '【錯誤】當前圖片無法下載'
        continue

好了,再就是把網址保存下來,我們在事先在當前目錄建立一個picture目錄,把圖片都放進去,命名的時候,用數字命名把

    string = 'pictures\\'+str(i) + '.jpg'
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()
    i += 1

整個代碼就是這樣:

#-*- coding:utf-8 -*-
import re
import requests

url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA'


html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
i = 0
for each in pic_url:
    print each
    try:
        pic= requests.get(each, timeout=10)
    except requests.exceptions.ConnectionError:
        print '【錯誤】當前圖片無法下載'
        continue
    string = 'pictures\\'+str(i) + '.jpg'
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()
    i += 1

我們運行一下,看效果(什麼你說這是什麼IDE感覺很炫!?趕緊去裝Pycharm,Pycharm的配置和使用看這個文章!)!

好了我們下載了58個圖片,咦剛纔不是應該是61個嗎?


我們看,運行中出現了有一些圖片下載不了


我們還看到有圖片沒顯示出來,打開網址看,發現確實沒了。

所以,百度有些圖片它緩存到了自己的機器上,所以你還能看見,但是實際連接已經失效

好了,現在自動下載問題解決了,那根據關鍵詞搜索圖片呢?只要改url就行了,我這裡把代碼寫下來了

    word = raw_input("Input key word: ")
    url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='+word+'&ct=201326592&v=flip'
    result = requests.get(url)

好了,享受你第一個圖片下載爬蟲吧!!當然不只能下載百度的圖片拉,依葫蘆畫瓢,你現在應該做很多事情了,比如爬取頭像,爬淘寶展示圖,或是...美女圖片,捂臉。一切都憑客官你的想象了,當然,作為爬蟲的第一個實例,雖然純用request已經能解決很多問題了,但是效率還是不夠高,如果想要高效爬取大量數據,還是用scrapy吧

這個小工程的代碼都在github上,感興趣的加群下載哦

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入學習交流群
626062078,我們一起學Python!


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

-Advertisement-
Play Games
更多相關文章
  • 1、先說結論:使用xml-rpc的機制可以很方便的實現伺服器間的RPC調用。 2、試驗結果如下: 3、源碼如下: 伺服器端的源代碼如下: 客戶端的代碼如下: ...
  • 下載Python對應版本的py2exe,使用這個工具可以將自己的程式打包成exe文件。使用這個工具需要寫一個用於打包的setup.py文件(名稱可以自己定,不一定是setup.py),寫好後在命令提示符界面cd到這個文件的目錄,執行命令“python setup.py py2exe”即可打包完成。下... ...
  • 操作系統: CentOS 6.9_x64 go語言版本: 1.8.3 問題描述 golang的log模塊提供的有寫日誌功能,示例代碼如下: 運行效果: go語言的log模塊沒有提供log rotate介面,但實際開發中我們需要該功能: 我們不希望單個日誌過大,否則文本編輯器無法打開,查看比較困難; ...
  • Java程式為了提高程式的效率,就對數據進行了不同的空間分配: 具體的劃分是如下的5個記憶體分配方式: 1.棧:存放的是局部變數 2.堆:存放的是所有new出來的東西 3.方法區: 4.本地方法區:(和系統相關) 5.寄存器:(CPU使用) 局部變數:在方法定義中或者方法聲明上的變數都稱為局部變數 堆 ...
  • 本篇是介紹C++的構造函數的第二篇(共二篇),屬於讀書筆記,對C++進行一個系統的複習。 複製構造函數 複製構造函數是構造函數的一種,也被稱為拷貝構造函數,他只有一個參數,參數類型是本類的引用。預設構造函數(即無參構造函數)不一定存在,但是複製構造函數總會存在。因為只要沒有自己寫的複製構造函數,就會 ...
  • 1.re.search():search返回的是查找結果的對象,可以使用group()或groups()方法得到匹配成功的字元串。 ①group()預設返回匹配成功的整個字元串(忽略pattern中的括弧),也可以指定返回匹配成功的括弧中第幾個字元串(從1開始計數); ②groups()以元組的形式 ...
  • 編碼(python版) 最近在學習python的過程中,被不同的編碼搞得有點暈,於是看了前人的留下的文檔,加上自己的理解,準備寫下來,分享給正在為編碼苦苦了掙扎的你。 編碼的概念 編碼就是將信息從一種格式轉換成另一種格式,電腦只認識二進位,簡單的理解,將我們眼睛看到的文字轉換為電腦能夠識別的二進 ...
  • 在上文《10.併發包阻塞隊列之ArrayBlockingQueue》中簡要解析了ArrayBlockingQueue部分源碼,在本文中同樣要介紹的是Java併發包中的阻塞隊列LinkedBlockingQueue。ArrayBlockingQueue隊列是由數組實現,而LinkedBlockingQ ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...