資料採集與融合技術第一次作業

郑冰智發表於2024-10-18
學號姓名 102202132 鄭冰智
這個作業要求在哪裡 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13286
這個作業的目標 用requests和BeautifulSoup庫方法定向爬取各網頁內容
實驗一倉庫地址 https://gitee.com/zheng-bingzhi/2022-level-data-collection/tree/master/實驗一

1.作業①

要求:用requests和BeautifulSoup庫方法定向爬取給定網址( http://www.shanghairanking.cn/rankings/bcur/2020 )的資料,螢幕列印爬取的大學排名資訊。
輸出資訊:

排名 學校名稱 省市 學校型別 總分
1 清華大學 北京 綜合 852.5

1.1核心程式碼:

1.1.1 獲取網頁內容與解析

透過 requests.get(url) 獲取目標網頁的 HTML 內容,並用 BeautifulSoup 進行解析,提取網頁資料結構。

import requests
from bs4 import BeautifulSoup

# 目標URL
url = "http://www.shanghairanking.cn/rankings/bcur/2020"

# 傳送請求並獲取網頁HTML內容
response = requests.get(url)
html = response.text

# 解析HTML內容
soup = BeautifulSoup(html, 'html.parser')

1.1.2. 定位並提取表格

找到包含排名的表格,透過類名 'rk-table' 進行選擇,並提取表格中的所有行 (<tr> 標籤)。

# 查詢表格
table = soup.find("table", {'class': 'rk-table'})
rows = table.find_all('tr')

1.1.3. 提取並清理資料

遍歷表格的每一行,從每一列中提取排名、學校名稱、所在省市、學校型別及總分,並使用 .text.strip() 方法清理資料格式。

# 輸出表頭
print("排名\t學校名稱\t省市\t學校型別\t總分")

# 遍歷表格行並提取資料
for row in rows[1:]:
    cols = row.find_all('td')
    rank = cols[0].text.strip()  # 排名
    school_name = cols[1].text.strip()  # 學校名稱
    province = cols[2].text.strip()  # 省市
    school_type = cols[3].text.strip()  # 學校型別
    score = cols[4].text.strip()  # 總分
    print(f"{rank}\t{school_name}\t{province}\t{school_type}\t{score}")

整體功能

  • 網頁請求: 獲取並讀取網頁內容。
  • HTML解析: 使用 BeautifulSoup 定位表格元素,提取表格資料。
  • 資料輸出: 格式化排名資訊,按行輸出清理後的資料。

1.2.實現結果:

在終端輸出:

1.3.實驗心得:

1.3.1. 網頁抓取與解析
透過使用requests抓取網頁內容,並結合BeautifulSoup解析HTML結構,提升了我對網頁資料提取的理解。

1.3.2. 實踐與應用
實踐了從網頁到本地提取並格式化資料的完整流程,進一步鞏固了Python網路爬蟲技術的應用能力。

2作業②: 淘寶價格定向爬蟲

2.1核心程式碼思路

2.1.1資料爬取

功能

  • 從淘寶的相關推薦介面獲取商品資料。
    實現思路
  • 使用requests庫傳送HTTP GET請求來獲取網頁內容,並設定headers模擬瀏覽器請求頭。
  • 核心程式碼:
response = requests.get(url, headers=headers)

2.1.2資料提取與儲存

功能

  • 從返回內容中提取JSON資料並儲存到taobao_data.txt檔案。
    實現思路
  • 利用正規表示式去掉JSONP的回撥包裝獲取純JSON資料,再用with語句寫入檔案。
  • 核心程式碼:
json_data = re.search(r'mtopjsonp\d+\((.*)\)', response.text).group(1)
with open('taobao_data.txt', 'w', encoding='utf-8') as f:
    f.write(json_data)

2.1.3二次提取與列印

功能

  • taobao_data.txt檔案讀取內容,用正規表示式提取商品標題和價格並列印。
    實現思路
  • 先讀取檔案內容,再定義兩個正規表示式分別匹配標題和價格,透過re.findall找到匹配項並用zip組合列印。
  • 核心程式碼:
with open('taobao_data.txt', 'r', encoding='utf-8') as f:
    content = f.read()
title_pattern = r'"TITLE":"(.*?)"
price_pattern = r'"GOODSPRICE":"(.*?)"
titles = re.findall(title_pattern, content)
prices = re.findall(price_pattern, content)
for title, price in zip(titles, prices):
    print(f'TITLE: {title}, GOODSPRICE: {price}')

2.1.4資料匯出為CSV

功能

  • 將提取的商品標題和價格資料儲存為CSV檔案。
    實現思路
  • with語句開啟CSV檔案建立csv.writer物件,先寫入表頭再逐行寫入資料,最後列印儲存成功資訊。
  • 核心程式碼:
csv_filename = 'extracted_data.csv'
with open(csv_filename, 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['TITLE', 'GOODSPRICE'])
    writer.writerows(zip(titles, prices))
print(f'Data saved to {csv_filename}')

2.2.實現結果

2.2.1.終端輸出

2.2.2.本地輸出(csv)

2.3.心得體會

2.3.1.淘寶過時的Cookie分析

時效性問題

  • 淘寶Cookie時效性強,幾小時內就可能失效,無法長期依賴,會阻礙後續資料獲取。
    失效影響
  • Cookie失效會使爬蟲無法獲取正確資料,導致程式中斷,可能返回空資料或錯誤提示頁面。

2.3.2.淘寶翻頁難以實現

操作複雜性

  • 淘寶翻頁不直觀,目前靠存URL解決,該方式不靈活,頁面多易出錯且URL規則變化時需重新調整。
    資料獲取問題
  • 存URL可能導致資料獲取不完整,效率低,存在重複或不必要請求。

2.3.3.爬取方法的新得

正規表示式運用

  • 正規表示式能有效處理淘寶資料,從複雜文字準確提取資訊,但編寫需技巧,如提取標題和價格的正規表示式。
    多步驟處理流程
  • 爬取過程採用多步驟處理,可分解複雜任務,便於測試和最佳化,提高程式可維護性和穩定性。

3.作業③:爬取給定頁面影像

3.1核心程式碼思路

3.1.1請求,處理頁面響應

思路

  • 傳送請求後,檢查響應狀態碼。若為200則請求成功,可繼續操作;否則表示請求失敗並列印錯誤資訊。
    核心程式碼
if response.status_code == 200:
    print(f"Successfully fetched page {page_num}.")
    # 後續操作(解析頁面、下載圖片)
else:
    print(f"Failed to retrieve page {page_num}. Status code: {response.status_code}")

3.1.2解析頁面並查詢圖片

思路

  • 成功獲取頁面內容後,使用BeautifulSoup解析HTML,透過find_all方法查詢src屬性以.jpg結尾的img標籤來定點陣圖片。
    核心程式碼
soup = BeautifulSoup(response.text, "html.parser")
img_tags = soup.find_all("img", src=lambda src: src and src.endswith(".jpg"))

3.1.3下載並儲存圖片

思路

  • 對找到的每個圖片標籤,獲取其URL,若不完整則用urljoin轉換為完整路徑,再用requests.get獲取圖片二進位制資料並儲存到本地,檔名依頁面編號和圖片順序確定。
    核心程式碼
for idx, img_tag in enumerate(img_tags):
    img_url = img_tag["src"]
    full_url = urljoin("https://news.fzu.edu.cn/", img_url)
    img_data = requests.get(full_url).content
    img_filename = os.path.join(download_folder, f"page{page_num}_image{idx + 1}.jpg")
    with open(img_filename, "wb") as img_file:
        img_file.write(img_data)
        print(f"Downloaded {img_filename} from {full_url}")

3.2實驗結果

3.2.1翻頁下載

3.2.2本地儲存

3.3實驗心得

3.3.1翻頁處理

迴圈構建URL的便利性

  • 透過迴圈和字串格式化構建不同頁面URL(如base_url = "https://news.fzu.edu.cn/yxfd/{}.htm"for page_num in range(1, 6): url = base_url.format(page_num)),這種方法對已知頁碼範圍的情況簡單有效,無需手動逐個輸入URL。
    侷限性與可能的改進方向
  • 當頁面URL結構更復雜(如頁碼位置不固定或分頁邏輯不規則)時,這種迴圈構建URL的方式不適用。可考慮分析頁面分頁連結元素提取連結來翻頁,或研究網站分頁介面獲取分頁資料。

3.3.2圖片爬取

利用BeautifulSoup查詢圖片標籤的高效性

  • 使用BeautifulSoupfind_all("img", src=lambda src: src and src.endswith(".jpg"))可高效篩選出以.jpg結尾的圖片連結,基於標籤屬性和條件篩選能準確定位目標圖片元素,提高爬取準確性和效率。
    圖片下載與儲存的關鍵要點
  • 下載圖片時,需用urljoin確保圖片URL完整(如full_url = urljoin("https://news.fzu.edu.cn/", img_url)),防止因URL不完整無法正確下載。儲存圖片時,以二進位制模式("wb")開啟檔案寫入圖片資料(with open(img_filename, "wb") as img_file: img_file.write(img_data))可確保圖片正確儲存到本地。
    可能遇到的問題與解決方法
  • 圖片爬取可能遇圖片載入慢或部分無法訪問的問題,可能由網路或網站訪問限制導致。可在requests.get中新增timeout引數設定合理超時時間避免程式停滯,對無法訪問的圖片可記錄URL後續排查或嘗試其他獲取途徑。

相關文章