## 爬取成大網站上的資訊 首先我先用成大網站上的小標題來做嘗試,可以看到成大網站的小標題可能不只一個,我想把它們全部印出來。 ![成大網站標題](https://hackmd.io/_uploads/r1rZdOhQp.jpg) 較便捷的方法是直接匡列想要的元素,再按下「檢查」,這樣就可以快速地找到該元素的那段程式碼的位置。 ![成大網站標題html](https://hackmd.io/_uploads/rkpxFd2X6.jpg) ``` import requests from bs4 import BeautifulSoup # 目標網站的URL url = "https://www.ncku.edu.tw/" #成大網站的網址 # 發送HTTP GET請求並取得頁面內容 response = requests.get(url) # 檢查請求是否成功 if response.status_code == 200: # 將網頁內容解析為Beautiful Soup物件 soup = BeautifulSoup(response.text, 'html.parser') # 尋找指定標記 target_tag = soup.find_all('h2', class_='mt-title') #找到所有前綴為<h2 class="mt-title">的元素,記得class要多一個引線!! if target_tag: for tag in target_tag: # 提取每個標記的內容 content = tag.text print(content) else: print("找不到指定的標記。") else: print("無法取得網頁內容。") ``` 執行結果為 ``` 故事.觀點 成大快訊 近期活動 ``` 接著可以試試看再爬其他更細更深入的東西:每個標題內包含的文字內容 ![成大網站mmtitle](https://hackmd.io/_uploads/ryY7suh7p.jpg) 可以透過一層層往裡面找的方式,準確地提取出想要的資料。 ![成大網站mmtitle html](https://hackmd.io/_uploads/H13Upun7p.jpg) import requests from bs4 import BeautifulSoup # 目標網站的URL url = "https://www.ncku.edu.tw/" # 發送HTTP GET請求並取得頁面內容 response = requests.get(url) # 檢查請求是否成功 if response.status_code == 200: # 將網頁內容解析為Beautiful Soup物件 soup = BeautifulSoup(response.text, 'html.parser') element1 = soup.find_all('div', class_='mouter') #先找大部分:都包在mouter裡面 此時"mouter"(有兩個)裡面各自包含了"故事觀點"、"成大快訊",而我只要"成大快訊"的部分,因此可以再提取一個子元素,用if比對是不是我要的。 for element in element1: t = element.find('h2', class_='mt-title') if t and t.text == '成大快訊': #再細找成大快訊的部份 elements_2 = element.find_all('div', class_='d-item v-it col-sm-3') for e in elements_2: print(e.text.strip()) else: print("無法取得網頁內容。") 執行結果 ``` 成大 92 校慶校園定向越野賽 競速中增添輕鬆及藝文氣息 【92 校慶】2023 成材產業論壇 關心人類生存大環境 聚焦綠能科技與新經濟 【92 校慶】第三屆成電論壇 重量級校友、系友探討生成式 AI 發展趨勢 成大創新圓夢計畫Demo Day 展現校園新創潛能無限 成大醫學院喜迎 40 週年 發表《蔚然成風:成大醫學院 40 週年誌》專書 「臺南 400」演唱會 感受府城 400 年文化底蘊的活力與魅力 快來成大玩科學! 一年一度的「成大理學大道科學博覽會」又來囉 台日半導體人才合作三贏方案 成大半導體學院與日本熊本高專締約合作意向書 ``` 那如果我要打包的不是文字,而是其他元素該怎麼辦? ![成大網站image](https://hackmd.io/_uploads/Byb7Ll67a.jpg) 試著抓看看圖片 import requests from bs4 import BeautifulSoup ncku_url = 'https://www.ncku.edu.tw/' #目標網址 response = requests.get(ncku_url) #發送HTTP請求,獲取網頁內容 if response.status_code == 200: # 檢查是否成功獲取網頁內容 # 使用Beautiful Soup解析網頁內容 soup = BeautifulSoup(response.text, 'html.parser') 前半部跟之前基本上都一樣。 ![image](https://hackmd.io/_uploads/HyyOOlpXT.png) 不過要注意的是,存圖片的網址是由字典的形式被包起來的!! ![image](https://hackmd.io/_uploads/rkN9YlamT.png) 若要提取該圖片的連結,就要用從字典裡提出該index value的方法: elements_1 = soup.find_all('div', class_='mouter') #找到一個最外層容器 for element in elements_1: t = element.find('h2', class_='mt-title') if t and t.text == '故事.觀點': elements_2 = element.find_all('div', class_='d-item v-it col-sm-3') for e in elements_2: dimg = e.find('div', class_='d-img') img = dimg.find('img') imgurl =img['src'] else: print('無法獲取網頁內容') 得到結果為: ![image](https://hackmd.io/_uploads/H1i7cg6mp.png) 但這不是一個完整的網址,只是網址的後半部分,前面要再加上成大的主網址 imgurl=ncku_url+img["src"] 最終結果為: https://www.ncku.edu.tw//var/file/0/1000/pictures/146/m/mczh-tw1920x800_small260476_841382501212.jpg https://www.ncku.edu.tw//var/file/0/1000/pictures/706/m/mczh-tw1920x800_small260230_176050744046.jpg https://www.ncku.edu.tw//var/file/0/1000/pictures/706/m/mczh-tw1920x800_small260230_176050744046.jpg https://www.ncku.edu.tw//var/file/0/1000/pictures/706/m/mczh-tw1920x800_small260230_176050744046.jpg 完整code: ``` import requests from bs4 import BeautifulSoup ncku_url = 'https://www.ncku.edu.tw/' #目標網址 response = requests.get(ncku_url) #發送HTTP請求,獲取網頁內容 if response.status_code == 200: # 檢查是否成功獲取網頁內容 soup = BeautifulSoup(response.text, 'html.parser')# 使用Beautiful Soup解析網頁內容 elements_1 = soup.find_all('div', class_='mouter') #找到一個最外層容器 for element in elements_1: t = element.find('h2', class_='mt-title') if t and t.text == '故事.觀點': elements_2 = element.find_all('div', class_='d-item v-it col-sm-3') for e in elements_2: dimg = e.find('div', class_='d-img') img = dimg.find('img') imgurl =ncku_url+img['src'] print(imgurl) else: print('無法獲取網頁內容') ```