資料採集實踐第一次作業

acedia7發表於2024-10-17

目錄
  • 作業①:定向爬取大學排名資訊
    • 實驗要求及結果
    • 心得體會
  • 作業②:商城商品比價定向爬蟲
    • 實驗要求及結果
    • 心得體會
  • 作業③:爬取網頁中的JPEG和JPG格式圖片
    • 實驗要求及結果
    • 心得體會

  • 碼雲連線

作業①:定向爬取大學排名資訊

實驗要求及結果

  • 要求
    用requests和BeautifulSoup庫方法定向爬取給定網址(http://www.shanghairanking.cn/rankings/bcur/2020)的資料,螢幕列印爬取的大學排名資訊。
  • 程式碼
點選檢視程式碼
import requests
from bs4 import BeautifulSoup

# 目標網址
url = 'http://www.shanghairanking.cn/rankings/bcur/2020'

# 使用 requests 傳送請求
response = requests.get(url)
response.encoding = 'utf-8'  # 設定編碼,確保中文字元顯示正確

# 使用 BeautifulSoup 解析網頁
soup = BeautifulSoup(response.text, 'html.parser')

# 找到包含大學排名的表格
table = soup.find('table', {'class': 'rk-table'})

# 輸出標題
print(f"{'排名':<6} {'學校名稱':<20} {'省市':<10} {'學校型別':<15} {'總分':<10}")

# 遍歷表格中的每一行
for row in table.find('tbody').find_all('tr'):
    cols = row.find_all('td')
    # 提取每列資料
    rank = cols[0].get_text().strip()         # 排名
    name = cols[1].get_text().split('\n')[0]  # 學校名稱,提取中文部分
    province = cols[2].get_text().strip()     # 省市
    category = cols[3].get_text().strip()     # 學校型別
    score = cols[4].get_text().strip()        # 總分
    # 列印每一行資料
    print(f"{rank:<6} {name:<20} {province:<10} {category:<15} {score:<10}")
  • 執行結果

心得體會

  • HTML結構:
    透過觀察HTML結構,可以確定排名、學校名稱、省份/城市等資訊分別位於哪個標籤內,準確地定位和提取所需的資料。

  • 正規表示式:
    在本例中,正規表示式用於匹配中文字元,但如果網頁結構發生變化,可能需要調整正規表示式

  • 輸出對齊:
    我麼需要去除多餘的空格以及將換行符替換掉,或者如上述程式碼,根據換行符分詞僅保留中文部分。

作業②:商城商品比價定向爬蟲

實驗要求及結果

  • 要求:
    使用 requests 和 re 庫方法設計某個商城(自選)商品比價定向爬蟲,爬取該商城以關鍵詞“書包”搜尋頁面的資料,包括商品名稱和價格。
  • 程式碼:
點選檢視程式碼
# 用requests和re庫方法設計某個商城(自已選擇)商品比價定向爬蟲,爬取該商城,以關鍵詞“書包”搜尋頁面的資料,爬取商品名稱和價格。

import urllib.parse
import random
import requests
import time
import re
# 設定請求頭,偽裝成瀏覽器請求
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0',
    'cookie' : '__jdu=17182719663141198906466; shshshfpa=937e652f-a425-de5a-c233-6df524418ad2-1718271970; shshshfpx=937e652f-a425-de5a-c233-6df524418ad2-1718271970; TrackID=1YNbU9FIZd00BWHMDtajlJDz4quPpa1lrPhRvcSiVgltmvXLoAIyPaOb8zXS3RQnjdU2jxdQLGi2-UWCHqdyW0fiLoKP_NXdJtYIm1qvAa0qcquV3fsvHQTEAfQYapPHW; thor=FC0DA1BB1CB59DA1B77A0DF3C3FA4632065CAC1BDA37A6C8D73ADD6607C01200908EAF9AD5A06D6065A64185A5CDB9FEC4A2F7A21D2533BB3DB822DEDDD01B6880B6830B4831088884FFFD1893245574E49EDB536C13A74F76E645224DA275C42453B4225496F2B1F428F61C6FA0767B3CAFB8781E4E009736A1BC05D3945645DB66F3D6BA8037DFADBC787B03BCCF2C24EAEA453E41FB8D0E004DDD8316D751; light_key=AASBKE7rOxgWQziEhC_QY6ya6gDvFukmW0NqWdW4cfuCVgpBy7NJVLYpr8DgG10YJc9-oZDb; pinId=c__mwLI5rc1OFi8nFqZWvw; pin=jd_PFdPlGuLMlzn; unick=jd_48giwwpv953xn4; _tp=UzQYIRktqRpEFW1%2BilHcTw%3D%3D; _pst=jd_PFdPlGuLMlzn; unpl=JF8EALNnNSttUExUUR4EG0USTQ5SWwgASx8AZzMEBFkITF0EHFUbQRl7XlVdWBRKHx9sZBRUVVNJUg4eAysSEXteU11bD00VB2xXVgQFDQ8WUUtBSUt-S1tXV1QOSh4AbGYDZG1bS2QFGjIbFBBCXlJeVQ9MFQNqZwVcVFBKUwAcBSsTIExtZG5bC0MRC19mNVVtGh8IDBIBGxcWBl1SXlQLTRcLaGAHVFhYS1wMEwMcFxdMbVVuXg; cn=0; jsavif=1; __jda=143920055.17182719663141198906466.1718271966.1727856159.1728974438.6; __jdc=143920055; __jdv=143920055|direct|-|none|-|1728974438017; 3AB9D23F7A4B3CSS=jdd032K7FJM4XCTA2C44ZZ753Y6AA5EDECIJU522H6UVHKKPWGHA5R4MXY27Z6AUWAQKUM57FZQBNIGN2T3I2NRVGIZ6PNUAAAAMSR3UEAGAAAAAADEJW5LRWMNY52MX; _gia_d=1; flash=3_ZlDdVjQe6D225JYOtB9b0pzG_EB3m2kmv2YDaca6mmIIgKGJk_rZcZCIl7nLLYhUtOe1exVlTzAP47tlC9tpGO3nWPJJ6bphrVcGm0yZ0A7Mag5WZsOqCg2Yog-f_rIfXJduGE-odM6jNYJkj0egbHbV1m0IX9vSUJSgBJZUZ_wwg4pQ_3cA; areaId=16; ipLoc-djd=16-1317-0-0; __jdb=143920055.2.17182719663141198906466|6.1728974438; shshshfpb=BApXSCsjgjfdAiMs_VmIw7nD6BIKfhzsIBlpmHl9q9xJ1MjnM8oC2; 3AB9D23F7A4B3C9B=2K7FJM4XCTA2C44ZZ753Y6AA5EDECIJU522H6UVHKKPWGHA5R4MXY27Z6AUWAQKUM57FZQBNIGN2T3I2NRVGIZ6PNU'

}

keyword = '書包'
encoded_keyword = urllib.parse.quote(keyword)

# 建立空的列表以儲存商品資訊
product_list = []
time.sleep(random.uniform(3, 5))
page = 1
# 設定搜尋頁面的URL
url = f'https://search.jd.com/Search?keyword={encoded_keyword}&page={page}'
print(url)
# 傳送GET請求獲取頁面資料
response = requests.get(url, headers=headers)
time.sleep(random.uniform(1, 3))
# 檢查響應狀態
if response.status_code == 200:
    # 將網頁原始碼解碼為utf-8格式
    html_content = response.text
    # 列印部分HTML內容以檢視頁面結構
    # print(html_content)
    # 進行正則匹配等後續處理
    product_name_pattern = r'<div class="p-name.*?">.*?<a.*?>\s*<em>(.*?)</em>'
    price_pattern = r'<div class="p-price">.*?<i.*?>([\d\.]+)</i>'
    # 提取商品名稱列表
    product_names = re.findall(product_name_pattern, html_content, re.S)
    # 提取商品價格列表
    prices = re.findall(price_pattern, html_content, re.S)
    # print(prices)
    # 清洗資料,去掉HTML標籤
    clean_product_names = [re.sub(r'<.*?>', '', name).strip() for name in product_names]
    # 輸出資訊,按照要求格式化輸出
    print(f"{'序號':<5} {'價格':<10} {'商品名'}")
    for index, (name, price) in enumerate(zip(clean_product_names, prices), 1):
        print(f"{index:<5} {price:<10} {name}")
else:
    print(f"請求失敗,狀態碼: {response.status_code}")

  • 截圖

心得體會

  • 正規表示式的靈活性:透過練習,我加深了對正規表示式的掌握,特別是在從複雜網頁中提取關鍵資料時。
  • 資料抓取的合規性:開發爬蟲時,我認識到應遵守網站的爬取規則,尊重網站的版權及使用者隱私,保持資料抓取的合法性。

作業③:爬取網頁中的JPEG和JPG格式圖片

實驗要求及結果

  • 要求:
    爬取一個給定網頁( https://news.fzu.edu.cn/yxfd.htm)或者自選網頁的所有JPEG和JPG格式檔案
  • 程式碼:
點選檢視程式碼
import os
import requests
from bs4 import BeautifulSoup

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

# 傳送GET請求
response = requests.get(url)
# 檢查請求是否成功
if response.status_code == 200:
    # 解析網頁內容
    soup = BeautifulSoup(response.text, 'html.parser')

    # 建立儲存圖片的資料夾
    folder_name = 'images'  # 可以更改為你想要的資料夾名
    os.makedirs(folder_name, exist_ok=True)

    # 找到所有的<img>標籤
    img_tags = soup.find_all('img')

    # 遍歷所有的<img>標籤
    for img in img_tags:
        img_url = img.get('src')  # 獲取圖片的src屬性
        # 檢查圖片連結是否為JPEG或JPG格式
        if img_url.endswith(('.jpg', '.jpeg')):
            # 如果是相對路徑,則轉換為絕對路徑
            if img_url.startswith('/'):
                img_url = f'https://news.fzu.edu.cn/{img_url}'

            # 下載圖片
            img_data = requests.get(img_url).content
            img_name = os.path.join(folder_name, os.path.basename(img_url))

            # 儲存圖片
            with open(img_name, 'wb') as f:
                f.write(img_data)
                print(f'已儲存圖片: {img_name}')
else:
    print(f'請求失敗,狀態碼: {response.status_code}')

  • 執行結果:

心得體會

  • 請求與解析的結合:透過此次實驗,我學會了如何結合 HTTP 請求和 HTML 解析,使爬蟲程式的爬取能力和資料處理能力有機結合。
  • 圖片下載的實踐:圖片下載不僅涉及 URL 提取,還需要處理本地檔案儲存問題,這讓我加深了對檔案操作的理解。

相關文章