20183122 綜合實驗《Python程序設計》實驗報告


學號 2019-2020-2 《Python程序設計》實驗四報告

課程:《Python程序設計》
班級: 1831
姓名: 陳介
學號:20183122
實驗教師:王志強
實驗日期:2020年6月7日
必修/選修: 公選課

1.實驗內容

1) 爬取豆瓣院線電影信息,編寫GUI用戶圖形界面展示信息

2) 添加文件操作內容以及網絡編程,使結果可寫入文件也可從文件讀出之前的結果,也能上傳至服務器

2. 實驗過程及結果

1) 編寫爬蟲從豆瓣主頁爬取相關信息並使用BeautifulSoup解析,剝離出有用的數據

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/83.0.4103.61 Safari/537.36'
}
re = requests.get(url, headers=headers)
soup = BeautifulSoup(re.text, 'html.parser')
# 信息存儲在li標簽下的list-item類下
movies = soup.findAll('li', {'class': 'list-item'})    
# 數據處理過程較為冗長,請移步碼雲查看 

2) 編寫可視化圖形界面

首先建立GUI框架

def Win_build():
    app = QApplication(sys.argv)
    frame = Frame()
    frame.init_text()
    frame.show()
    sys.exit(app.exec_())

其中Frame是一個自定義的繼承自QMainWindow的類;
接着在自定義類中創建一系列的函數,其中需要初始顯示的控件可以放在__init__函數下自動執行;

class Frame(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_MainWin()
        self.setFixedSize(self.width(), self.height())
        self.init_buttons()

再逐步綁定各種信號和槽,使界面完善。

3) 將信息展示添加到圖形化界面中

我使用的方法是定義全局變量,用列表嵌套字典的方式存儲處理過后的信息,在自定義類中使用的時候就不用考慮參數的傳遞問題;

def init_text(self, string=' '):
    """
    這個函數更新在文本框中顯示的內容,同時限定此文本框為只讀模式,不允許用戶修改查詢到的地方
    :param string: 想在文本框中顯示的內容
    :return: None
    """
    mo_text = QTextEdit(self)
    mo_text.setFont(QFont("fangsong", 12))
    mo_text.clear()
    mo_text.setPlainText(string)
    mo_text.setToolTip("這個文本框顯示了爬蟲爬取的即將上映或正在上映的電影信息")
    mo_text.setGeometry(100, 100, 800, 450)
    mo_text.setReadOnly(True)
    mo_text.show()

其中string為存儲電影信息的字符串,設定默認值是為了防止用戶未爬取就查詢時由於內容為空會報錯。

4) 添加文件操作,可寫入數據,保存海報,讀出之前數據

打開文件並將數據寫入文件

def openfile(self):
    """
    選擇並打開文件,將爬取到的結果寫入文件
    :return: None
    """
    global string
    filename = QFileDialog.getOpenFileName(self, '打開文件', './', "txt(*.txt)")
    if filename[0]:
        with open(filename[0], 'w', encoding="utf-8") as f:
            f.write(string)
    QMessageBox.information(self, "提示", "院線電影信息成功寫入指定文件>_<")

打開.txt類型的文件並將文本提取出來顯示到GUI界面中

def readfile(self):
    """
    讓用戶選擇並打開.txt文件並將其內容顯示到文本欄中
    :return: None
    """
    filename = QFileDialog.getOpenFileName(self, '打開文件', './', "txt(*.txt)")
    if filename[0]:
        with open(filename[0], 'r', encoding='utf-8') as f:
            read_info = f.read()
    detail_text = QTextEdit(self)
    detail_text.setGeometry(950, 200, 600, 500)
    detail_text.setToolTip("這個文本框顯示了讀取到的文件的內容")
    detail_text.setReadOnly(False)
    detail_text.show()
    detail_text.setText(read_info)

查看電影海報時會先將海報緩存到本地文件中,再從本地讀取,設定不同顏色的邊框區分不同類型的電影

def show_picture_up(self):
    """
    展示即將上映的電影的海報
    :return: None
    """
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/83.0.4103.97 Safari/537.36 Edg/83.0.478.45 '
    }
    try:
        res = requests.get(list_show_up[up_index]['img'], headers=headers)
        root = "F://python全棧//python程序設計大實驗//"
        path = root + '1.jpg'
        if not os.path.exists(root):
            os.mkdir(root)
        with open(path, 'wb') as f:
            f.write(res.content)
            f.close()
    except:
        QMessageBox.information(self, "提示", "海報資源請求錯誤")
    pix = QPixmap('1.jpg')
    picture_lab = QLabel(self)
    picture_lab.setGeometry(950, 400, 600, 300)
    picture_lab.setPixmap(pix)
    picture_lab.setStyleSheet("border: 2px solid red")
    picture_lab.setScaledContents(True)
    picture_lab.show()

5) 網絡編程,可將數據上傳到運行服務器端的主機上

調用自定義函數上傳數據,反饋上傳結果到GUI界面中

def ftp_push(self):
    """
    調用自定義模塊上傳文件
    :return:布爾值,上傳成功為True,上傳失敗為False
    """
    bool1 = ftp.push(sys.argv)
    if bool1:
        QMessageBox.information(self, "提示", "文件上傳成功")
    else:
        QMessageBox.information(self, "提示", "文件上傳失敗")

6) 臨時起意,添加了文本文件的編輯和保存功能,在程序中實現了記事本的功能,不僅局限於電影信息,可處理任何.txt文件

實驗結果:

3. 實驗過程中遇到的問題和解決過程

  • 問題1:豆瓣反爬
  • 問題1解決方案:添加頭部偽裝為瀏覽器,豆瓣的電影搜索信息在網頁源碼中是可以看到的,但是爬取下來之后是沒有的,需要一系列的解密過程,較為復雜,涉及加密css和js,於是我選擇了加密較為簡單的院線電影信息作為爬取對象。
  • 問題2:讀文件的時候編碼不正確
  • 問題2解決方案:打開文件的時候獲取其編碼方式,寫入文件的時候指定編碼方式
  • 問題3:自定義模塊不能正常使用
  • 問題3解決方案:將自定義模塊所在的文件夾改為sources root

4. 實驗代碼碼雲鏈接

碼雲鏈接:https://gitee.com/konelee/python_programming/blob/master/實驗四:綜合設計.py

其他(感悟、思考等)

本次實驗總結

1) 此次實驗涉及的知識點較多,就我的程序來說,涉及序列、文件操作、網絡編程、GUI、模塊、爬蟲以及其它基礎知識點,是對一學期以來對《Python程序設計》這門課程學習成果的檢驗,也用以查漏補缺;在實驗過程中發現了一些問題,在解決這些問題的過程中收獲頗豐;

2) 由於此次實驗代碼量較大,達到了500行,在代碼的可讀性更加需要注意,於是我清楚地標明了每個函數的功能以及接口方便查看,同時ctrl + f也是相當好用的。但養成良好的代碼編寫習慣有助於在函數相互調用時理清邏輯;

課程感想體會

1) 這學期都是網絡授課,對於本課程,課下視頻自學+課堂直播教學的效果顯著,兩種方式相互補充,學會了許多有用的技巧和知識,我自己也寫了許多有用的小工具,處理excl表格、word文檔,爬取圖片等,非常實用,提高了工作和學習的效率;

2) 經過這學期的學習,我愈發地認識到Python的強大,相比於C語言對底層的重視,python幫助我們實現了許多底層的細節,比如字符串查找、拷貝、拼接,排序等,使得我們有更多的精力來關注功能的實現,Python也提供了豐富的第三方模塊,用以實現豐富的擴展功,python簡潔,實現同樣的功能,代碼量少。但python也有缺點,就是代碼的執行效率較低,之前寫文件加密程序的時候就體現了出來;對於一個10M的MP3文件,python采用DES加密需要三分鍾左右,而用我上學期密碼學課程上寫的程序加密只需要不到一分鍾。

建議

1) 老師在講課的時候可以多運行程序展示結果,這樣課堂會更生動,也能激發同學們的興趣;

2) 感覺老師可以在網絡編程之后講講多線程,可以有多樣的組合方式;

最后,祝賀《Python程序設計》課完結撒花


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM