給Python3爬蟲做一個介面 妹子圖網實戰 3
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
給Python爬蟲做一個介面.成品
一、實驗簡介
1.1 實驗內容
通過 PyQt 給妹子圖網的Python爬蟲做一個互動介面,從而對 PyQt 有初步的理解,並學會如何使用 Qt Creater 做介面以及實現基礎功能。課程分為三個部分:
- 瞭解如何將 Qt Creator 生成的介面匯入的 Python 的環境中,並完成一個計算器Demo;
- 學會再實現 PyQt 中,完成圖片預覽以及元素列表兩個Demo;
- 完成妹子圖網爬蟲的互動介面。
這是本課程的第一次實驗。在這裡先給大家看看,學完這三節課之後,最後我們要完成的效果:
1.2 實驗知識點
- PyQt 相關知識
- Python Qt 程式設計
1.3 實驗環境
- Xfce終端
- Python 3.x.x
1.4 適合人群
本課程難度屬於一般,屬於初級級別課程,適合具有 Python 基礎的使用者,熟悉 Python 基礎知識加深鞏固。
二、實驗目的
通過本次實驗,學會如何在如何結合 PyQt 以及 Python, 完成圖片預覽以及元素列表兩個Demo。
三、開始實驗
3.1 環境配置
本實驗環境採用帶桌面的 Ubuntu Linux 環境,實驗中會用到的程式:
- Qt Creator: 一個輕量級介面開發環境,其設計目標是設計目標是使開發人員能夠利用 Qt 這個應用程式框架更加快速及輕易的完成開發任務。
- requests:是用Python語言編寫,基於 urllib,採用 Apache2 Licensed 開源協議的 HTTP 庫
- beautifulsoup: 是一個可以從 HTML 或 XML 檔案中提取資料的 Python 庫,它能夠通過你喜歡的轉換器實現慣用的文件導航,查詢,修改文件的方式。(在本節課需要用到
進入系統後,如果 Linux 中預設的 python3 為 3.5 版本,可以通過以下指令切換到 3.4:
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.4 70 --slave /usr/bin/python3m python3m /usr/bin/python3.4m
更新 apt-get 的連結:
$ sudo apt-get update
安裝 Qt Creater 以及 PyQt5 相關元件:
$ sudo apt-get install qtcreator pyqt5-dev-tools
安裝 beautifulsoup(bs4):
$ sudo apt-get install python3-bs4
3.2 配置爬蟲
在寫爬蟲之前,我們先來看看妹子圖網的首頁。頁面的主要內容是由24個圖框組成,檢視頁面的原始碼(View page source),我們可以輕易知道其網頁的構造,每一個li
節點裡麵包含每一個連結裡面包含:標題、原圖連結、跳轉連結、釋出時間以及瀏覽次數。如果要翻下一頁,只需要更改網址字尾,即在連結後面加入/page/(page_number)就可以了,page_number是相應的頁數,妹子圖的詳細爬蟲教程可以參考這個大大的文章。
class Mzitu(): def __init__(self, url): self.url = url headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36', 'Host': 'www.mzitu.com'} response = requests.get(self.url, headers = headers) content = BeautifulSoup(response.text, 'lxml') linkblock = content.find('div', class_="postlist") self.linklist = linkblock.find_all('li') def printli(self): linklist = self.linklist linksum = list() for link in linklist: url = link.a.get('href') picurl = link.img.get('data-original') linkid = re.search(r'(\d+)', url).group() firstspan = link.span titleword = firstspan.get_text() secondspan = firstspan.find_next_sibling('span') uploadtime = secondspan.get_text() thirdspan = secondspan.find_next_sibling('span') viewcount = thirdspan.get_text() linksum.append((linkid, titleword, uploadtime, viewcount, picurl)) return linksum
3.3 配置PyQt介面
首先是製作ui介面,拖曳3個Push Button 分別作為翻頁的上頁(pushButton_uppage)和下頁(pushButton_nextpage)以及獲得連結的開關(pushButton),拖曳Table Widget作為我們放置頁面內容(tableWidget),拖曳2個Label分別作為頁數顯示(label_pagenum)以及圖片輸出(label),拖曳Text Browser作為我們連結輸出(textBrowser)。
儲存後好,對ui檔案的進行載入:
import re, requestsfrom bs4 import BeautifulSoupfrom PyQt5.QtWidgets import QApplication, QCheckBox, QPushButton, QHeaderViewfrom PyQt5.QtGui import QPixmapimport PyQt5.uicui_file = 'Demo5.ui'(class_ui, class_basic_class) = PyQt5.uic.loadUiType(ui_file)
主類先繼承 form class 以及 qt base class ,然後呼叫爬蟲的 class 來生成首頁內容的列表,根據首頁的內容數量來確定 Table Widget 的行數,並設定相應列寬以及行高,最後是將 Check Box 以及 Push Button 放置在 Table Widget 中,並且對其中的 Push Button 與相應的功能函式進行關聯:
class Window(class_basic_class, class_ui): def __init__(self): super(Window, self).__init__() self.url = "http://www.mzitu.com/" self.setupUi(self) totlist = Mzitu(self.url).printli() self.tableWidget.setRowCount(len(totlist)) self.tableWidget.setColumnCount(2) self.tableWidget.setColumnWidth(0, 435) verticalHeader = self.tableWidget.verticalHeader() verticalHeader.setSectionResizeMode(QHeaderView.Fixed) verticalHeader.setDefaultSectionSize(30) self.textBrowser.setOpenExternalLinks(True) ##隱藏列表頭 self.page = 1 ##設定初始的頁面數,為後面做翻頁器做準備 self.label_pagenum.setNum(self.page) self.checkBoxs = [self._addCheckbox(index, item[0], item[1]) for index, item in enumerate(totlist)] self.pushButtons = [self._addpushButtonpic(index, item[0], item[4]) for index, item in enumerate(totlist)] self.pushButton.clicked.connect(self.getSelList) self.pushButton_nextpage.clicked.connect(lambda: self._nextPage(1)) self.pushButton_uppage.clicked.connect(lambda: self._nextPage(-1))
_addCheckbox 用於生成 Check Box 單元,並將單元通過 setCellWidget 關聯到 Table Widget 對應位置中。每一個 Check Box 最終都用 isChecked() 函式來判斷是否有被勾選上,getSelList 是用來在 textBrowser 中輸出對應內容的名稱以及連結,注意連結這裡我為了可以直接點開,而不需要複製到瀏覽器裡面才能開啟,所以採用 html 文字書寫,以達到超級連結的效果:
def _addCheckbox(self, index, idd, boxtitle): checkBox = QCheckBox() checkBox.setObjectName(idd) checkBox.setText(boxtitle) self.tableWidget.setCellWidget(index, 0, checkBox) ##setCellWidget前面兩個數字分別代表行和列,最後是需要關聯的元素 return checkBox def getSelList(self): selList = [(item.objectName(), item.text()) for item in self.checkBoxs if item.isChecked() == True] for item in selList: url = 'http://www.mzitu.com/'+item[0] self.textBrowser.append(item[1]) self.textBrowser.append('<a href = %s>%s</a>' % (url, url)) ##此處輸出超級連結 return selList
_addpushButton 是用於在 Table Widget 中關聯 Push Button,方法和上述 Check Box 類似。注意 Push Button 關聯函式那裡,我使用了 Lambda 表示式。_showpic 就是一個在 Label 中輸出圖片的功能,具體在之前 Demo 那裡已經做過敘述:
def _addpushButtonpic(self, index, idd, href): pushButton = QPushButton() pushButton.setObjectName(idd) pushButton.setText(idd) self.tableWidget.setCellWidget(index, 1, pushButton) pushButton.clicked.connect(lambda: self._showpic(idd, href)) return pushButton def _showpic(self, idd, href): pic = requests.get(href).content pixmap = QPixmap() pixmap.loadFromData(pic) self.label.setPixmap(pixmap)
_nextPage 是實現翻頁器功能,一開始是考慮只做下一頁的,但使用中發現不方便。所以需要增加向上翻的功能,這是通過將翻頁數分別設定為+1改成-1來實現的。更換了頁碼之後,需要重新通過爬蟲 class 獲得新頁面的內容,並重新用 _addCheckbox 以及 _addpushButto n函式來更新 Check Box 以及 Push Button 的內容,最後輸出新的 self.checkboxs 以及 self.pushButtons:
def _nextPage(self, page): self.page += page self.label_pagenum.setNum(self.page) url = self.url + '/page/' + str(self.page) totlist = Mzitu(url).printli() newcheckBoxs = [] newpushButtons = [] for index, item in enumerate(totlist): newcheckbox = self._addCheckbox(index, item[0], item[1]) newpushbutton = self._addpushButtonpic(index, item[0], item[4]) newcheckBoxs.append(newcheckbox) newpushButtons.append(newpushbutton) self.checkBoxs = newcheckBoxs self.pushButtons = newpushButtons
最後我們來看看最終效果圖。
三、實驗總結
最後,我們完整的程式就完成了,後面可以通過py2exe轉化是window實際可以操作的執行程式,限於篇幅這裡沒有寫道,整個 Table Widget 還可以加入瀏覽數、新增時間以及全選等功能,來完善整個體驗。最後相信精明的老司機已經發現,既然獲得連結,通過爬蟲可以進一步獲得連結後面的圖片,然後通過篩選就可以將喜歡的圖片下載到自己的硬盤裡面了。