資料採集與融合技術實踐作業一

旺旺cc冰發表於2024-10-19

作業1:大學排名資料爬取

作業程式碼和圖片

  • 主要程式碼
import urllib.request
from bs4 import BeautifulSoup
import re  # 匯入正規表示式模組

# 指定要爬取的URL
url = 'http://www.shanghairanking.cn/rankings/bcur/2020'

# 傳送請求獲取網頁內容
response = urllib.request.urlopen(url)
html_content = response.read().decode('utf-8')

# 使用BeautifulSoup解析網頁內容
soup = BeautifulSoup(html_content, 'html.parser')

# 找到存放排名資訊的表格(假設表格在頁面中唯一或具有特定的class屬性)
table = soup.find('table')

# 提取表格中的所有行
rows = table.find_all('tr')

# 列印表頭
print(f"{'排名':<5}{'學校名稱':<10}{'省市':<10}{'學校型別':<10}{'總分':<10}")

# 遍歷每一行,提取並列印所需資訊
for row in rows[1:]:  # 跳過表頭行
    cols = row.find_all('td')
    if len(cols) >= 5:  # 確保每行至少有5列資料
        rank = cols[0].get_text(strip=True)

        # 使用正規表示式只保留中文字元,去掉英文部分
        university_name = re.findall(r'[\u4e00-\u9fa5]+', cols[1].get_text(strip=True))[0]
        province_city = cols[2].get_text(strip=True)
        university_type = cols[3].get_text(strip=True)
        total_score = cols[4].get_text(strip=True)

        # 格式化輸出
        print(f"{rank:<5}{university_name:<10}{province_city:<10}{university_type:<10}{total_score:<10}")
  • 執行結果

作業心得

透過此次作業,我深入理解了如何使用requests庫傳送HTTP請求,並使用BeautifulSoup解析HTML文件。資料提取的過程讓我體會到了網路爬蟲的強大與靈活性。同時,我也認識到在爬取資料時要遵循網站的規則,以避免對網站造成負擔。

作業2:商城爬蟲

作業程式碼和圖片

  • 主要程式碼
import urllib.request
from bs4 import BeautifulSoup
import re

BASE_URL = "http://search.dangdang.com/?key=%E4%B9%A6%E5%8C%85&act=input"

def get_html(url):
    #獲取指定url的HTML內容
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/123"
    }
    request = urllib.request.Request(url, headers=head)
    try:
        response = urllib.request.urlopen(request)
        return response.read().decode('gbk')
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return None

def get_data_from_html(html):
    #從HTML內容中提取商品名稱和價格
    soup = BeautifulSoup(html, "html.parser")
    names = []
    prices = []
    for items in soup.find_all('p', attrs={"class": "name", "name": "title"}):
        for name in items.find_all('a'):
            title = name['title']
            names.append(title)
    for item in soup.find_all('span', attrs={"class": "price_n"}):
        price = item.string
        prices.append(price)
    return names, prices

def print_goods_info(names, prices):
    #列印商品名稱和價格資訊
    print("序號\t\t\t", "價格\t\t\t", "商品名\t\t")
    for i, (name, price) in enumerate(zip(names, prices)):
        # 去除多餘的空白字元
        name = re.sub(r'\s+', ' ', name)
        # 提取數字和小數點
        price = re.findall(r'[\d.]+', price)
        if price:
            print(f"{i + 1}\t\t\t {price[0]}\t\t\t{name}")

def main():
    names = []
    prices = []
    for i in range(1, 3):  # 爬取1-2頁的內容
        url = BASE_URL + "&page_index=" + str(i)
        html = get_html(url)
        if html:
            page_names, page_prices = get_data_from_html(html)
            names.extend(page_names)
            prices.extend(page_prices)

    print_goods_info(names, prices)


if __name__ == "__main__":
    main()
  • 執行結果

作業心得

在這次作業中,我學習瞭如何使用re庫進行正規表示式匹配,從網頁中提取特定的資料。同時,我也意識到需要根據具體網頁結構進行調整,靈活性是編寫爬蟲的關鍵。

作業3:爬取網頁JPEG和JPG格式檔案

作業程式碼和圖片

  • 主要程式碼
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

# 要爬取的URL
url = 'https://news.fzu.edu.cn/yxfd.htm'

# 傳送請求獲取網頁內容
response = requests.get(url)
html_content = response.content

# 使用BeautifulSoup解析網頁內容
soup = BeautifulSoup(html_content, 'html.parser')

# 建立儲存圖片的資料夾
folder_name = 'downloaded_images'
if not os.path.exists(folder_name):
    os.makedirs(folder_name)

# 查詢所有的圖片連結(JPEG 和 JPG)
img_tags = soup.find_all('img')

# 遍歷所有圖片標籤,下載JPEG和JPG格式的圖片
for img in img_tags:
    img_url = img.get('src')

    # 確保img_url不為空
    if img_url:
        # 將相對連結轉換為絕對連結
        img_url = urljoin(url, img_url)

        # 只下載JPEG和JPG格式的圖片
        if img_url.lower().endswith(('.jpg', '.jpeg')):
            # 獲取圖片的名稱
            img_name = os.path.basename(img_url)

            # 下載圖片並儲存到本地
            img_data = requests.get(img_url).content
            img_path = os.path.join(folder_name, img_name)

            with open(img_path, 'wb') as handler:
                handler.write(img_data)

            print(f"已下載圖片: {img_name}")

print("所有圖片下載完成!")
  • 執行結果

作業心得

在這次作業中,我學會了使用Python爬取網頁上的圖片。透過BeautifulSoup解析網頁,快速提取所有<img>標籤的連結。使用urljoin將相對連結轉換為絕對連結,確保下載的圖片有效。

相關文章