@從爬取圖片 開始講起
python入門實例之爬取圖片
程序結構總覽
從上圖可以大致看出,爲了讓操作更加方面,我用pyqt5做了一個界面(關於python gui工具的選型後面介紹),代碼方面的話,其實主要就是爬取圖片的代碼和界面實現的代碼,整體來說很簡單,但是因爲入門實例,一開始還是踩了不少坑的,這篇文章主要內容其實就是記錄新手入門時一些需要注意的點
search.py裏的主代碼,相當於c/c++的main 程序入口,主要操作就是實例化主窗口,綁定相關響應函數(按鈕和菜單項)
if __name__ == '__main__': # 1
app = QApplication(sys.argv) # 2
main_window = QMainWindow() # 3
ui = search_main_window.Ui_MainWindow() # 4創建窗口
ui.setupUi(main_window) # 將生成的mainwindow去初始化窗口數據
main_window.show() # 調用顯示函數
ui.start.clicked.connect(partial(click_button_start, ui)) # 綁定開啓線程函數
ui.action_Preferences.triggered.connect(partial(openDialog, ui)) #綁定一個菜單項來打開對話框
sys.exit(app.exec_()) # 開始循環
ui.start.clicked.connect(partial(click_button_start, ui))
ui.action_Preferences.triggered.connect(partial(openDialog, ui))
這兩行可以簡單講一下,ui是窗口資源名稱,start是裏面的一個按鈕(也就是最上面圖中的“開始下載”),按鈕的可以通過調用connect函數來綁定響應函數,不要參數的話直接 .connect(響應函數名稱) 就行了,要傳參數的話就 用partial 如上。 而action_Preferences是一個菜單
項,它是沒有connect函數的,所以綁定方法爲 .triggered.connect() ,具體原因的話可以從下面的初始化函數可以看出
self.start = QtWidgets.QPushButton(self.centralwidget)
self.action_saveDir = QtWidgets.QAction(MainWindow)
它們是繼承自不同的父類,詳細原因請自查
爬取圖片代碼
從最基本的說起,網頁請求用的是requests模塊,
def geturlDeatil(url):
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)''Chrome/51.0.2704.63 Safari/537.36'}
r = requests.get(url, timeout=30, headers=headers, verify=False)
r.raise_for_status() # 如果狀態不是200,引發異常
r.encoding = 'utf-8' # 無論原來用什麼編碼,都改成utf-8
return r.text
except Exception as e:
return "訪問網站異常"
這裏要注意的是requests.get()這個函數要記得加上headers,主要是用來模擬瀏覽器訪問,很多網站現在都做了反爬蟲設置,不加的話,不加header的話,基本上是訪問不了的,另外有些網站會做反盜鏈設計,需要額外增加信息,具體做法是:增加(‘Referer’, str1)字段,如下
def getPicture(listUrl, savePath):
countDown = 0
countDele = 0
# 獲取當前圖片網址
str1 = listUrl[0]
str2 = str1.rsplit('/', 1)
str1 = str2[0]
opener = urllib.request.build_opener() #
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'), ('Referer', str1)]
urllib.request.install_opener(opener)
for i in range(len(listUrl)):
try:
path = savePath + str(i) + ".jpg"
urllib.request.urlretrieve(listUrl[i], path)
fp = open(path, 'rb')
im = Image.open(fp)
fp.close()
x, y = im.size
if x < 1920 or y < 1080:
os.remove(path)
countDele += 1
else:
countDown += 1
except Exception:
continue
return "下載圖片成功", countDown, countDele
界面實現代碼
本來是不打算做界面的,後來一想,反正都是初學python,就當時練習一下了,因爲之前有用qt寫過c++,所以在網上看到qt有支撐python的庫,名爲pyqt5,所以就直接拿來用了,具體的話需要安裝pyqt5的庫,和pyqt5designer ,需要的可以去網上找教程安裝
我這裏一共做了兩個界面,一個主界面search_main_window.py,一個對話框界面preferences.py ,都是通過qt designer 生成的ui文件轉換過來的,轉換的命令是
pyqt5 ui文件生成py命令
pyuic5 -o name.py name.ui
總結
爬取圖片這個實例算是很多人入門python的必經之路了,網上的例子也是非常的多,技術方面我就不再說了,關於網址選擇方面有一些建議
常用網址有:
這次算是檢驗python學習效果的一次練習,學了python之後確實印證了那句老話:“人生苦短,我用python” ,用來寫一些小工具確實非常的方便。
代碼在github上:https://github.com/Blakeyi/DownloadPic
csdn資源也有:https://download.csdn.net/download/blake321/12391015
就這麼多了,今年五一哪裏都沒去,在家學python