iT邦幫忙

2023 iThome 鐵人賽

DAY 4
1
自我挑戰組

待業不頹廢系列 第 4

Day 4 . 欸 今天要幹嘛 - 接續昨天!( python 靜態爬蟲)

  • 分享至 

  • xImage
  •  

接續昨天,繼續努力
下面是昨天在使用 requests、 BeautifulSoup 的起手式處理

import requests
from bs4 import BeautifulSoup

url = "爬的網址"
response = requests.get(url)

soup = BeautifulSoup(response.text, "html.parser")

從這裡繼續走下去
已把原來題目的動態網頁,改了一個靜態頁面
"https://astro.5xruby.tw/testimony/"
題目為:查看裏頭分享文的作者有哪些

是說要如何去分辨動態靜態勒?
首先爬蟲需要搭配的人類行為(麻瓜學習中)
通常會需要查看網頁的原始代碼(HTML)來決定如何編寫爬蟲代碼。
以下是一些步驟:
1.在想要爬取的網頁右鍵 ⇒ 檢視網頁原始碼
2.點選後便會開啟瀏覽器,即可查看網頁的原始代碼( HTML )。

接下來操作:

  • 查找需要數據的 HTML 元素:瀏覽源代碼,以查找感興趣數據的 HTML 元素,例如文章內容、鏈接、標題等。
  • 確定標識元素的屬性:有時,HTML 元素具有特定的屬性,如 class 或 id,可以更容易地找到它們。
    目前我也只會這樣操作,就是在網頁點右鍵去 檢視原始碼

https://ithelp.ithome.com.tw/upload/images/20230918/20150181LChymcg0dN.png

在這圖的左上角有個自動換行,勾選起來方便閱讀
https://ithelp.ithome.com.tw/upload/images/20230918/20150181xR8LbdbKqD.png

就可以從這裡跟網頁上看到資訊幾乎是一樣的,沒有東西藏起來
但也只是我需要的資訊比較單純,這不是一個妥妥的判別方式
https://ithelp.ithome.com.tw/upload/images/20230918/20150181tmOkdZfEw0.png

接下來就是要,提取數據並創建數據結構
這邊意思就是說,我們已經把網址內的東西抓一大包出來,
現在就依照我們的需球把資訊整理出來

如何編寫內容呢
先來個簡易範本好了,請 GPT 寫個範本

# 設一個空間來存儲數據
data = {}
# 找到所有文章區域
article_sections = soup.find_all("div", class_="article")
for article_section in article_sections:
author = article_section.find("span", class_="author").text.strip()

# 在這個示例中,我們將文章分享者的名字作為鍵,將相關數據(例如文章內容等)作為值
data[author] = {
    "content": article_section.find("p", class_="content").text.strip(),
    # 還可以提取其他相關數據
}

就從上面範本來做異動改成符合我們需求的

# 設一個空間來存儲數據
data = {}
# 找到所有作者資訊
author_infos = soup.find_all("h4", class_="is-author")

這裡要提一下 soup.find_all()

Beautiful Soup 屬性和方法

  • .find_all('tag_name'):查找標籤內的所有子標籤,返回一個包含所有匹配子標籤的列表。
  • .find('tag_name'):查找標籤內的子標籤,返回第一個匹配的子標籤對象。
  • .find_parent('tag_name'):獲取第一個匹配的父標籤對象。
  • .find_parents('tag_name'):獲取所有匹配的父標籤對象列表。
  • .find_next_sibling('tag_name'):獲取下一個同級標籤對象。
  • .find_previous_sibling('tag_name'):獲取上一個同級標籤對象。

  • .text:獲取標籤內的文本內容。
  • .string:與 .text 類似,用於獲取標籤內的文本內容。
  • .name:獲取標籤的名稱,例如獲取 標籤的名稱為 "h4"。

  • .parent:獲取父標籤對象。
  • .attrs:獲取標籤的屬性,返回一個字典,包含標籤的所有屬性。
  • .get('attribute_name'):獲取指定屬性的值,例如 tag.get('class') 用於獲取標籤的 class 屬性值。

所以說soup.find_all() 並不是自己創立的寫法,而是 Beautiful Soup 提供了很多屬性和方法

至於從哪邊去抓到標籤位置,
初步觀察網頁,我要的作者 前面都有"By"做開頭,當我搜尋"By"可以看到下圖,
我撈到我要的標籤了,這就是上面程式碼的由來
https://ithelp.ithome.com.tw/upload/images/20230919/20150181ZsZ1SnmhRp.png

整理一下現階段完成度

import requests
from bs4 import BeautifulSoup
​
url = "https://astro.5xruby.tw/testimony/"
response = requests.get(url)
​
soup = BeautifulSoup(response.text, "html.parser")
# 設一個空間來存儲數據
data = {}
# 找到所有作者資訊
author_infos = soup.find_all("h4", class_="is-author")

緊接著我們需要去跑迴圈
網頁上有多個作者資訊需要提取,那麼使用迴圈可以有效地處理它們。
通過 for 循環遍歷 author_infos 列表,將每個"作者"提取出並印出。
Python 中的 for 迴圈採用的是 for ... in ... 的語法,來個範例吧

# 使用 for 迴圈遍歷列表中的元素
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)

接下來套用我們要的東西實作

for author in (author_infos):
    print(author.text)

看看完整組合在一起以及效果如何

import requests
from bs4 import BeautifulSoup

url = "https://astro.5xruby.tw/testimony/"
response = requests.get(url)


soup = BeautifulSoup(response.text, "html.parser")
data = {}

author_infos = soup.find_all("h4", class_="is-author")

for author in (author_infos):
    print(author.text)

咦奇怪
沒想要印出的是一堆亂碼
By 許å±æ´
By Dolly
By è­è¡ç
By Emily
By é
­å±é³´é¸ç¾¤
By å¼µè²æ¨
By é³ç»ç¾©
By 謿庭
By æå å¦%
因為從網頁獲取的文本可能會顯示為亂碼或錯誤的字符。
通過將 response.encoding = "utf-8" 設置為正確的字符編碼,可以確保文本數據正確地解釋和顯示。

最終來檢視一下程式碼,這個 data = {}目前看起來沒用到,我就先把它移除
整理完畢如下!

import requests
from bs4 import BeautifulSoup

url = "https://astro.5xruby.tw/testimony/"
response = requests.get(url)
response.encoding = "utf-8"

soup = BeautifulSoup(response.text, "html.parser")
data = {}

author_infos = soup.find_all("h4", class_="is-author")

for author in (author_infos):
    print(author.text)

終於成功顯示中文啦~~~~~
https://ithelp.ithome.com.tw/upload/images/20230919/2015018173W5a9vp9Q.png

小結

這次使用到 py 迴圈基礎寫法
response.encoding = "utf-8 的矯正亂碼還原中文
以及初步認識 Beautiful Soup 屬性和方法
看起來好像結束但其實尚未...
因為上面只出現十筆資料,但這網頁有七頁的樣子 :)
明天繼續處理有分頁這部分


上一篇
Day 3 . 欸 今天要幹嘛 - 實作解題( python 靜態爬蟲)
下一篇
Day 5 . 欸 今天要幹嘛 - 我那個爬蟲有分頁欸!( python 靜態爬蟲)
系列文
待業不頹廢30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言