1. 程式人生 > 其它 >20202216 2020-2021-2 《Python程式設計》實驗四報告

20202216 2020-2021-2 《Python程式設計》實驗四報告

20202216 2020-2021-2 《Python程式設計》實驗四報告

課程:《Python程式設計》
班級: 2022
姓名: 鄧童丹
學號:20202216
實驗教師:王志強
實驗日期:2021年6月14日
必修/選修: 公選課

  • 實驗內容
    Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。
    課代表和各小組負責人收集作業(原始碼、視訊、綜合實踐報告)

批閱:注意本次實驗不算做實驗總分,前三個實驗每個實驗10分,累計30分。本次實踐算入綜合實踐,打分為25分。
評分標準:
(1)程式能執行,功能豐富。(需求提交原始碼,並建議錄製程式執行的視訊)10分
(2)綜合實踐報告,要體現實驗分析、設計、實現過程、結果等資訊,格式規範,邏輯清晰,結構合理。10分。
(3)在實踐報告中,需要對全課進行總結,並寫課程感想體會、意見和建議等。5分

  • 實驗過程及結果
    平常喜歡上微博,看到一些好看的圖片就想儲存下來,但是一張一張的儲存會很麻煩,所以想到了用python爬蟲直接爬取儲存到本地,非常方便,本次實驗參考了網上教程和課堂內容實現。
    找到自己想要爬取的博主的微博,因為移動端微博爬取的難度較小,所以在Chrome瀏覽器上開啟微博移動端的網頁

    網頁url那裡/u/後面的那串數字就是博主的微博id,在爬蟲中需要用到

右鍵選擇檢查,開啟瀏覽器的除錯功能,選擇 Network 選單,Ctrl+R重新整理獲取資料

注意到Name欄裡的倒數第二行,複製它的link address下來後是這樣的

這是微博移動端api,可以在此進行json資料的獲取和提取


cardlistInfo是列表資訊
cards是當前頁面的編號
使用者的特定containerId等於107603+UID
total是總微博數
card_type正常為9
ok: 1就表明獲取頁面資訊成功

pic是我要找的圖片資訊,這在mblog下,我主要需要獲取圖片的id和url

大概知道要爬取的內容和資訊位置後,開始寫程式碼
構建請求頭,並隨便找個移動端裝置的使用者代理

host = 'm.weibo.cn'
base_url = 'https://%s/api/container/getIndex?' % host
user_agent = 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 wechatdevtools/0.7.0 MicroMessenger/6.3.9 Language/zh_CN webview/0'  # 在網上隨便找個user_agent

user_id = str(5886339293)  # 這裡填寫使用者id
headers = {
    'Host': host,
    'Referer': 'https://m.weibo.cn/u/%s' % user_id,
    'User-Agent': user_agent
}

匯入模組,有些模組沒有安裝,還需要先安裝好

import requests
import urllib.request
import time
import os
from tqdm import tqdm
from urllib.parse import urlencode

編寫一個函式用於對網頁進行請求

def get_single_page(page):
    params = {
        'type': 'uid',
        'value': 1665372775,
        'containerid': int('107603' + user_id), 
        'page': page
    }
    url = base_url + urlencode(params)
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.json()
    except requests.ConnectionError as e:
        print('爬取失敗', e.args)

此函式解析頁面返回的json資料

def analysis_page(json, pic_filebagPath): 
    items = json.get('data').get('cards')
    for item in items:
        item = item.get('mblog')
        if item:
            if pic_choice == 'y': 
                pics = item.get('pics')
                if pics:
                    for pic in pics:
                        picture_url = pic.get('large').get('url')  # 得到原圖地址
                        pid = pic.get('pid')  # 圖片id
                        pic_name = pid[25:]
                        download_pics(picture_url, pic_name, pic_filebagPath) 

此函式用於儲存圖片到本地

def download_pics(pic_url, pic_name, pic_filebagPath): 
    pic_filePath = pic_filebagPath + '\\'
    try:
        f = open(pic_filePath + str(pic_name) + ".jpg", 'wb')
        response = urllib.request.urlopen(pic_url)
        f.write(response.read())
        f.close()
    except Exception as e:
        print(pic_name + " error", e)
    time.sleep(0.1) 

主函式部分

if __name__ == '__main__':
    base_data = {}
    page = input('輸入要爬取的頁數')  # 輸入爬取頁數,輸入‘all’即爬取所有微博
    pic_choice = input('是否開始儲存圖片?y/n') 
    time_start = time.time()
    try:
        json = get_single_page(1)
        screen_name = json.get('data').get('cards')[0].get('mblog').get('user').get('screen_name') 
        total = json.get('data').get('cardlistInfo').get('total') 
        if pic_choice == 'y': 
            pic_filebagPath = 'D:\\weibopachong\\%s_picture' % screen_name
            os.makedirs(pic_filebagPath)  # 建立資料夾
        else:
            pic_filebagPath = None 
        if page == 'all': 
            page = total // 10
            while get_single_page(page).get('ok') == 1:
                page = page + 1
            print('總頁數為:%s' % page)

        page = int(page) + 1
        for page in tqdm(range(1, page)):  # 抓取資料
            json = get_single_page(page)
            analysis_page(json, pic_filebagPath)
    except Exception as e:
        print('error:', e)
    finally:
        time_end = time.time()
        print('\n total cost', time_end - time_start)

執行結果

圖片儲存到本地後

原始碼放到碼雲

  • 實驗過程中遇到的問題和解決過程
  • 問題1:一開始用了老師上課時給的請求頭,結果爬取失敗。
  • 問題1解決方案:因為用的是移動端網頁,所以要用移動端裝置的請求頭,在網上重新找了一個。
  • 問題2:第一次執行時沒有得到圖片。
  • 問題2解決方案:通過查閱網上的資料和分析Network標籤頁下的資訊,找到了所需圖片內容的正確標識。
  • 課程感悟:
    在這一學期,我結識了python這一神奇的程式設計語言,python一門開源免費、通用型的指令碼程式語言,它上手簡單,功能強大,堅持「極簡主義」。它有非常多的優點,如具有極其豐富類庫,這使得 Python 幾乎無所不能,不管是傳統的 Web 開發、PC 軟體開發、Linux 運維,還是當下火熱的機器學習、大資料分析、網路爬蟲,Python 都能勝任。python還提供了高效的高階資料結構,還能簡單有效地面向物件程式設計。Python語法和動態型別,以及解釋型語言的本質,使它成為多數平臺上寫指令碼和快速開發應用的程式語言,隨著版本的不斷更新和語言新功能的新增,逐漸被用於獨立的、大型專案的開發。
    在課上,我學習到了python的基本輸入輸出,資料型別,基礎語法,有關字串的操作,瞭解了許多字串處理函式,索引和切片,正則表示式,各種序列,函式、面向物件的設計、模組,異常處理,還用python進行資料庫,socket庫的程式設計,檔案操作以及網路爬蟲。同樣的我還認識到python的選擇,迴圈語句與C語言的異同和它更具優勢的地方。總而言之,關於python還有很多可學的方面,尤其是它龐大的第三方庫資源。或許我現在認識的只是其中的冰山一角,在以後我還會繼續探索。感謝王志強老師帶領我走入python的世界,能讓我在課堂上由淺入深的學習python,雖然對於我而言,還是有一些地方並沒有弄明白,但我有信心在未來繼續學習的過程中能夠逐漸理解。
    還有王志強老師讓我們以部落格的形式提交實驗報告的這一點讓我受益匪淺,這培養了我寫部落格的習慣,還讓我看到了許多大佬的文章,還有在gitee上註冊賬號和對git的使用,這對以後的計算機學習是非常有利的。
    最後,感謝王志強老師這一學期的教導,希望以後也有機會於老師探討更多計算機相關的問題。