資料採集和融合技術作業1

xhbyq發表於2024-10-19

作業①

1)用requests和BeautifulSoup庫方法定向爬取給定網址的資料,螢幕列印爬取的大學排名資訊。

a、主要程式碼解析

該函式從獲取的JSON資料中提取前 num 名大學的資訊,並將這些資訊儲存到 ulist 列表中,同時格式化輸出這些大學的排名資訊
def printUnivList(ulist, html, num):
    '''提取 html 網頁內容中 前 num 名大學資訊到 ulist列表中 '''   
    data = json.loads(html)  # 對資料進行解碼    
    # 提取 資料 rankings 包含的內容
    content = data['data']['rankings']    
    
    # 把 學校的相關資訊放到  ulist 裡面
    for i in range(num):
        index = content[i]['rankOverall']
        name  = content[i]['univNameCn']
        score = content[i]['score']
        category  = content[i]['univCategory']
        province = content[i]['province']  # 提取省份資訊
        ulist.append([index, name, score, category, province])        

    # 列印前 num 名的大學      
    tplt = "{0:^10}\t{1:^10}\t{2:^10}\t{3:^10}\t{4:^10}"  # 更新格式,而不使用{3}
    print(tplt.format("排名 ", "學校名稱", "總分", "型別", "省份"))  # 更新這裡,保持一致
    for i in range(num):
        u = ulist[i]        
        print(tplt.format(u[0], u[1], u[2], u[3], u[4]))  # 直接傳入值
  • 使用了 json.loads 對網頁的返回內容進行JSON解碼,這意味著該網頁返回的資料是一個JSON格式的結構。
  • 從 data['data']['rankings'] 提取大學的具體排名資訊,包含排名、學校名稱、得分、類別(如綜合類、理工類等)以及所在省份。
  • 使用 tplt 定義了表格的輸出格式,確保列印的大學資訊整齊對齊。使用了 center(^) 方式格式化輸出。

b、輸出資訊

c、git資料夾連結

2)心得體會

  • 使用格式化字串列印大學資訊,增強了輸出的可讀性,便於使用者快速理解
  • 透過 json.loads 解析 JSON 資料,將網路請求獲得的響應直接轉化為 Python 物件,簡化了資料處理過程

作業②:

1)用requests和re庫方法設計爬取噹噹網以關鍵詞“書包”搜尋頁面的資料,爬取商品名稱和價格。

a、主要程式碼解析

傳送HTTP請求:

request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
html = response.read()
  • 建立一個請求物件併傳送請求,獲取網頁的HTML內容。

處理HTML編碼:

dammit = UnicodeDammit(html)
data = dammit.unicode_markup
  • 使用UnicodeDammit處理返回的HTML,確保其編碼為Unicode,以便後續處理。
pattern = re.compile(r'<a[^>]*title="([^"]*)"[^>]*>.*?<span class="price_n">([^<]+)</span>', re.S)
matches = pattern.findall(data)
#### 正規表示式提取商品名稱和價格
  • 編寫正規表示式,提取商品名稱(title)和價格(price)。
  • re.S 使.匹配包括換行符在內的所有字元。

b、輸出資訊

c、git資料夾連結

2)心得體會

  • 使用正規表示式提取特定模式的內容是資料爬取中的一個重要技能。透過精確的模式匹配,可以有效地從複雜的HTML中提取所需的資訊
  • 不同網頁可能會使用不同的編碼格式,使用UnicodeDammit確保獲取到的資料在後續處理中不會因為編碼問題而出現錯誤是非常必要的。

作業③:

1)爬取一個噹噹網以糖果為關鍵詞搜尋的網頁的所有JPEG和JPG格式檔案

a、主要程式碼解析

解析網頁內容以獲取圖片連結,這個函式使用BeautifulSoup解析HTML並提取所有圖片的連結

def parsePageForImages(data):
    img_urls = []
    soup = BeautifulSoup(data, 'html.parser')
    images = soup.find_all('img')
    for img in images:
        src = img.get('src') or img.get('data-src')
        if src and not src.startswith('http'):
            src = 'http:' + src
        if src:
            img_urls.append(src)
    return img_urls
  • 它會檢查src和data-src屬性,確保每個URL都是完整的。

這個函式用於併發下載多張圖片

def downloadImages(img_urls, path='./candyimages/', limit=38):
    if not os.path.exists(path):
        os.makedirs(path)

    with ThreadPoolExecutor(max_workers=10) as executor:
        future_to_url = {executor.submit(downloadImage, url, path): url for url in img_urls[:limit]}
        for future in as_completed(future_to_url):
            url = future_to_url[future]
            try:
                future.result()  # 獲取執行結果
            except Exception as e:
                print(f"{url} generated an exception: {e}")
  • 使用ThreadPoolExecutor來管理執行緒池,max_workers=10表示最多同時執行10個執行緒。

b、輸出資訊

c、git資料夾連結

2)心得體會

  • BeautifulSoup作為HTML解析庫,非常直觀易用。其選擇器功能可以輕鬆找到需要的HTML元素,使得網頁資料抓取變得簡單。
  • 使用ThreadPoolExecutor能夠顯著提高下載速度,尤其是當網路延遲較高時,多個執行緒同時下載可以充分利用頻寬資源。
  • 使用多層次的異常處理,這對於網路請求和檔案操作尤其重要。確保程式在遇到錯誤時不會崩潰,並能提供有效的錯誤資訊。

相關文章