Python簡單爬取圖片實例

都知道Python的語法很簡單易上手,也很適合拿來做爬蟲等等,這里就簡單講解一下爬蟲入門——簡單地爬取下載網站圖片。

效果

就像這樣自動爬取下載圖片到本地:

image.png

代碼:

其實很簡單,我們直接看下整體的代碼:

#coding = utf-8
import urllib
import re

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

def getImg(html):
    reg = 'src="(.+?\.jpg)" alt='
    imgre = re.compile(reg)
    imglist = re.findall(imgre, html)
    x = 0
    for imgurl in imglist:
        urllib.urlretrieve(imgurl, '%s.jpg' % x)
        x+=1
    return imglist

html = getHtml("http://pic.yxdown.com/list/0_0_1.html")

print getImg(html)

導入庫:

第一行的utf-8是為了支持中文。

這里我們導入了兩個庫,分別是 urllib 和 re。urllib 是用來進行 url 網絡請求的,而 re 是一個正則表達式匹配的庫。這里我們要先對網站進行模擬請求,然后找到網站中的圖片進行下載。

請求網站:

第一個方法:getHtml。

這就是用來模擬瀏覽器訪問網站的,參數 url 是要訪問的網站鏈接,這里我們在下面的變量 html 處調用了這個方法,其訪問的 url 是一個圖片網站,關于選擇訪問網站還有一點等下要說一下。

在這個方法中,我們先用了 urllib 庫的 urlopen 方法來打開網站,然后通過 read 方法來獲取網站的源代碼,其實就跟在網頁中“右鍵-->檢查“是一個意思。最后返回了讀取到的網站源代碼。

上面說了要注意的一點是,由于很多網站會禁止人們隨意爬取數據,有反爬蟲的技術,所以在選擇要爬取的網站的時候,最好先通過這個方法獲取網站源代碼,然后 print 輸出 html 變量看一下獲取到的內容是否是正常的網頁源代碼,而不是403之類的禁止訪問,如果被禁止了,那么自然也不可能爬取到數據了。

找到圖片:

接下來是一個 getImg 方法。

在這個方法中,我們設置了一個正則表達式,用來在網頁源代碼中找到圖片的資源路徑,這個正則表達式要根據不同的網站去具體設置,比如我爬取的這個網站,圖片對應的源代碼是這樣的:

image.png

因此我們設置的正則表達式就是 reg = 'src="(.+?.jpg)" alt=' ,其實就是根據圖片資源路徑前后的內容來限制的。

這里也要注意一點,有的網站做了動靜分離,圖片有其單獨的完整資源路徑,而有的是直接是相對位置,這時候要么對其路徑進行處理,但大多時候你并不知道怎么處理才能拼出完整路徑,因此還是找有完整資源路徑的圖片來試驗比較好。

緊接著用 re 庫的 compile 函數將正則表達式轉換成正則表達式對象,然后使用 findall 函數尋找 html 網頁源代碼中包含的匹配 imgre 的所有內容,返回一個序列。我們可以輸出這個序列,可以看到大量圖片資源路徑組成的一個序列,如果沒爬取到,就是個空序列了。

下載圖片

最后一步就是下載圖片,這里我們用 for 循環,將圖片資源路徑中的每個圖片,使用 urllib 庫的 urlretrieve 函數來下載圖片,這個函數其實可以接受很多參數,這里我們設置了要下載的圖片資源路徑和要命名的名字(我們使用一個變量x來對每個圖片依次命名為0,1,2...),還可以設置下載路徑、用來顯示下載進度的回調函數等等。如果不設置下載路徑默認會下載到代碼文件當前所在的文件夾。

執行

現在,去執行一次代碼就可以啦,mac本身是支持python的,不用配置環境,直接將代碼放入一個 .py 文件中,使用終端進入其文件位置,敲入 python xxx.py 命令就可以啦。


查看作者首頁

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,381評論 25 708
  • 1 前言 作為一名合格的數據分析師,其完整的技術知識體系必須貫穿數據獲取、數據存儲、數據提取、數據分析、數據挖掘、...
    whenif閱讀 18,106評論 45 523
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,951評論 19 139
  • 你是我溫暖的手套,冰冷的啤酒,帶有陽光味道的白襯衫,日復日的夢想 馬路瘋狂的愛上了明明,明明對馬路不屑一顧。即使是...
    公治伊閱讀 475評論 0 0
  • 前言 這也是本人第一次琢磨關于即時通訊方面的內容,結合網上查看的相關資料搭建出來的仿微信小demo,如有意見請多多...
    音符上的碼字員閱讀 1,461評論 5 2