學號姓名 | 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查詢圖片標籤的高效性
- 使用
BeautifulSoup
的find_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後續排查或嘗試其他獲取途徑。