python入門 實例之爬取圖片

@從爬取圖片 開始講起

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章