python下载图片的命令_网上的图片不知道怎么批量下载?python教你怎么把网站上面的图片都爬下来...
妹子圖網站----前言
從今天開始就要擼起袖子,直接寫Python爬蟲了,學習語言最好的辦法就是有目的的進行,所以,接下來我將用10+篇的博客,寫爬圖片這一件事情。希望可以做好。
為了寫好爬蟲,我們需要準備一個火狐瀏覽器,還需要準備抓包工具,抓包工具,我使用的是CentOS自帶的tcpdump,加上wireshark ,這兩款軟件的安裝和使用,建議你還是學習一下,后面我們應該會用到。
妹子圖網站---- 網絡請求模塊requests
Python中的大量開源的模塊使得編碼變的特別簡單,我們寫爬蟲第一個要了解的模塊就是requests。
妹子圖網站---- 安裝requests
打開終端:使用命令
pip3 install requests
等待安裝完畢即可使用
接下來在終端中鍵入如下命令
# mkdir demo
上面的linux命令是 創建一個名稱為demo的文件夾,之后創建一個
為了提高在linux上的開發效率,我們需要安裝一個visual studio code 的開發工具
對于怎么安裝vscode,參考官方的https://code.visualstudio.com... 有詳細的說明。
對于centos則如下:
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
然后用yum命令安裝
yum check-update
安裝成功之后,在你的CentOS中會出現如下畫面
image.png
接著說我們上面的操作 ,因為我們這邊是用gnome圖形界面,所以后面的有些操作,我直接用windows的操作風格講解了
打開軟件>文件>打開文件>找到我們剛剛創建的down.py文件
之后,在VSCODE里面輸入
import requests #導入模塊
tips:本教程不是Python3的基礎入門課,所以有些編碼基礎,默認你懂,比如Python沒有分號結尾,需要對齊格式。我會盡量把注釋寫的完整
按鍵盤上的ctrl+s保存文件,如果提示權限不足,那么按照提示輸入密碼即可
通過終端進入demo目錄,然后輸入
python3 down.py
顯示如下結果,代表編譯沒有問題
[root@bogon demo]# python3 down.py
接下來,我們開始測試requests模塊是否可以使用
修改上述代碼中的
import requests
運行結果(出現下圖代表你運行成功了):
image.png
接下來,我們實際下載一張圖片試試,比如下面這張圖片
image.png
修改代碼,在這之前,我們修改一些內容
由于每次修改文件,都提示必須管理員權限,所以你可以使用linux命令修改權限。
[root@bogon linuxboy]# chmod -R 777 demo/
import requests
運行代碼之后,發現在文件夾內部生成了一個文件
image.png
但是打開文件之后發現,這個文件并不能查閱,這代表這個文件壓根沒有下載下來
image.png
我們繼續修改代碼,因為有的服務器圖片,都做了一些限制,我們可以用瀏覽器打開,但是使用Python代碼并不能完整的下載下來。
修改代碼
import requests
好了,這次在終端編譯一下python文件
python3 down.py
發現圖片下載下來了
image.png
我們重點查看上述代碼中 requests.get部分,添加了一個headers的實參。這樣我們程序就下載下來了完整的圖片。
妹子圖網站---- Python爬蟲頁面分析
有了上面這個簡單的案例,我們接下來的操作就變的簡單多了。爬蟲是如何進行的呢?
輸入域名->下載源代碼->分析圖片路徑->下載圖片
上面就是他的步驟
輸入域名
為啥爬取這個網站,因為好爬。
好了,接下來分析這個頁面
image.png
做爬蟲很重要的一點,就是你要找到分頁的地方,因為有分頁代表著有規律,有規律,我們就好爬了(可以做的更智能一些,輸入首頁網址,爬蟲自己就能分析到這個網站中的所有地址)
上面圖片中,我們發現了分頁,那么找規律吧
image.png
使用火狐瀏覽器的開發者工具,發現分頁規律
http://www.meizitu.com/a/pure_1.html
好了,接下來用Python實現這部分(以下寫法有部分面向對象的寫法,沒有基礎的同學,請百度找些基礎來看,不過對于想學習的你來說,這些簡單極了)import requests
上面的代碼,可能需要有一定的Python基礎可以看懂,不過你其實仔細看一下,就幾個要點第一個是 class Spider(): 我們聲明了一個類,然后我們使用 def __init__去聲明一個構造函數,這些我覺得你找個教程30分鐘也就學會了。
拼接URL,我們可以用很多辦法,我這里用的是最直接的,字符串拼接。
注意上述代碼中有一個全局的變量 all_urls 我用它來存儲我們的所有分頁的URL
接下來,是爬蟲最核心的部分代碼了
我們需要分析頁面中的邏輯。首先打開 http://www.meizitu.com/a/pure... ,右鍵審查元素。
image.png
image.png
發現上圖紅色框框里面的鏈接
點擊圖片之后,發現進入一個圖片詳情頁面,發現竟然是一組圖片,那么現在的問題是
這里我們采用多線程的方式爬取(這里還用了一種設計模式,叫觀察者模式)
import threading #多線程模塊
首先引入三個模塊,分別是多線程,正則表達式,時間模塊
新增加一個全局的變量,并且由于是多線程操作,我們需要引入線程鎖
all_img_urls = [] #圖片列表頁面的數組
聲明一個生產者的類,用來不斷的獲取圖片詳情頁地址,然后添加到 all_img_urls 這個全局變量中
#生產者,負責從每個頁面提取圖片列表鏈接
線程鎖,在上面的代碼中,當我們操作all_urls.pop()的時候,我們是不希望其他線程對他進行同時操作的,否則會出現意外,所以我們使用g_lock.acquire()鎖定資源,然后使用完成之后,記住一定要立馬釋放g_lock.release(),否則這個資源就一直被占用著,程序無法進行下去了。
匹配網頁中的URL,我使用的是正則表達式,后面我們會使用其他的辦法,進行匹配。
re.findall()方法是獲取所有匹配到的內容,正則表達式,你可以找一個30分鐘入門的教程,看看就行。
代碼容易出錯的地方,我放到了
try: except: 里面,當然,你也可以自定義錯誤。
如果上面的代碼,都沒有問題,那么我們就可以在程序入口的地方編寫
for x in range(2):
執行程序,因為我們的Producer繼承自threading.Thread類,所以,你必須要實現的一個方法是 def run 這個我相信在上面的代碼中,你已經看到了。然后我們可以執行啦~~~
運行結果:
image.png
這樣,圖片詳情頁面的列表就已經被我們存儲起來了。
接下來,我們需要執行這樣一步操作,我想要等待圖片詳情頁面全部獲取完畢,在進行接下來的分析操作。
這里增加代碼
#threads= []
注釋關鍵代碼,運行如下
[linuxboy@bogon demo]$ python3 down.py
把上面的tt.join等代碼注釋打開
[linuxboy@bogon demo]$ python3 down.py
發現一個本質的區別,就是,我們由于是多線程的程序,所以,當程序跑起來之后,print("進行到我這里了")不會等到其他線程結束,就會運行到,但是當我們改造成上面的代碼之后,也就是加入了關鍵的代碼 tt.join() 那么主線程的代碼會等到所以子線程運行完畢之后,在接著向下運行。這就滿足了,我剛才說的,先獲取到所有的圖片詳情頁面的集合,這一條件了。
join所完成的工作就是線程同步,即主線程遇到join之后進入阻塞狀態,一直等待其他的子線程執行結束之后,主線程在繼續執行。這個大家在以后可能經常會碰到。
下面編寫一個消費者/觀察者,也就是不斷關注剛才我們獲取的那些圖片詳情頁面的數組。
添加一個全局變量,用來存儲獲取到的圖片鏈接
pic_links = [] #圖片地址列表
#消費者
看到沒有,上面的代碼其實和我們剛才寫的極其相似,后面,我會在github上面把這部分代碼修改的更加簡潔一些,不過這才是第二課,后面我們的路長著呢。
代碼中比較重要的一些部分,我已經使用注釋寫好了,大家可以直接參考。大家一定要注意我上面使用了兩個正則表達式,分別用來匹配title和圖片的url這個title是為了后面創建不同的文件夾使用的,所以大家注意吧。
#開啟10個線程去獲取鏈接
運行結果:
[linuxboy@bogon demo]$ python3 down.py
是不是感覺距離成功有進了一大步
接下來就是,我們開篇提到的那個存儲圖片的操作了,還是同樣的步驟,寫一個自定義的類
class DownPic(threading.Thread) :
我們獲取圖片鏈接之后,就需要下載了,我上面的代碼是首先創建了一個之前獲取到title的文件目錄,然后在目錄里面通過下面的代碼,去創建一個文件。
涉及到文件操作,引入一個新的模塊
import os #目錄操作模塊
# 遍歷字典列表
因為我們的圖片鏈接數組,里面存放是的字典格式,也就是下面這種格式
[{"妹子圖1":["http://mm.chinasareview.com/wp-content/uploads/2016a/08/24/01.jpg","http://mm.chinasareview.com/wp-content/uploads/2016a/08/24/02.jpg"."http://mm.chinasareview.com/wp-content/uploads/2016a/08/24/03.jpg"]},{"妹子圖2":["http://mm.chinasareview.com/wp-content/uploads/2016a/08/24/01.jpg","http://mm.chinasareview.com/wp-content/uploads/2016a/08/24/02.jpg"."http://mm.chinasareview.com/wp-content/uploads/2016a/08/24/03.jpg"]},{"妹子圖3":["http://mm.chinasareview.com/wp-content/uploads/2016a/08/24/01.jpg","http://mm.chinasareview.com/wp-content/uploads/2016a/08/24/02.jpg"."http://mm.chinasareview.com/wp-content/uploads/2016a/08/24/03.jpg"]}]
需要先循環第一層,獲取title,創建目錄之后,在循環第二層去下載圖片,代碼中,我們在修改一下,把異常處理添加上。
try:
然后在主程序中編寫代碼
#開啟10個線程保存圖片
運行結果:
[linuxboy@bogon demo]$ python3 down.py
文件目錄下面同時出現
image.png
點開一個目錄
image.png
好了,今天的一個簡單的爬蟲成了
最后我們在代碼的頭部寫上
# -*- coding: UTF-8 -*-
推薦一下我建的python學習交流qun:850973621,群里有項目源碼分享,開發工具、
電子書籍、免費的視頻教程分享??梢约尤胍黄鸾涣鲗W習,一起進步!
學習資料
總結
以上是生活随笔為你收集整理的python下载图片的命令_网上的图片不知道怎么批量下载?python教你怎么把网站上面的图片都爬下来...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10易升是什么?如何彻底关闭Win
- 下一篇: python神奇的小海龟_Python笔