iT邦幫忙

0

Python 爬蟲系列:定位 find , select

  • 分享至 

  • xImage
  •  

爬蟲的 SOP(標準作業流程)

爬蟲開發涉及多個階段,從需求分析到最終獲取數據並保存。以下是常見的爬蟲 SOP:

  1. 需求分析&目標明確:確定需要抓取的數據種類(例如商品價格、新聞標題、用戶評論等)。
    目標網站:確定要抓取的網站或平台,並檢查是否允許爬取(查看 robots.txt 文件)。

  2. 預備工作

  • 檢查網站架構:使用瀏覽器開發者工具(如 F12)查看目標數據的結構。
  • 確定是否需要動態加載(判斷是靜態頁面還是 JavaScript 動態渲染)。
    工具選擇:
  • 靜態頁面:適合使用 requests + BeautifulSoup。
  • 動態頁面:適合使用 selenium 或 playwright。
  1. 環境設置
  2. 開發爬蟲
    Python 爬蟲環境準備+基礎爬蟲教學

爬蟲定位

find 和 find_all 和 使用 CSS Selector/selenium

  1. 使用 find 和 find_all
    find:
    用於抓取符合條件的第一個元素。
    適合用於抓取單一資料點。
    find_all:
    用於抓取符合條件的所有元素。
    適合用於抓取多筆資料,例如文章列表、商品清單。
from bs4 import BeautifulSoup

html = """
<div>
    <p class="title">Title 1</p>
    <p class="title">Title 2</p>
</div>
"""

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

# 找第一個符合條件的 <p> 元素
first_title = soup.find("p", class_="title")
print(first_title.text)  # Output: Title 1

# 找所有符合條件的 <p> 元素
all_titles = soup.find_all("p", class_="title")
for title in all_titles:
    print(title.text)
# Output: 
# Title 1
# Title 2
  1. 使用 CSS Selector
    CSS Selector 是一種基於層級關係的選擇器,靈活性更高,CSS Selector 是一種用來選擇 HTML 元素的語法,它基於 HTML 文件中元素的結構來選擇元素。
    在網頁開發中,CSS Selector 用來應用樣式(CSS)到特定的元素,並且在爬蟲中用來定位並選取需要的資料。且能直接應用於 Selenium 等工具中,是更通用的方法

在爬蟲中,CSS Selector 是一種常用的工具,尤其是搭配像 BeautifulSoup 這樣的解析庫,來選擇網頁中的某些元素,並提取所需的資料。
主要方法

  • select_one:抓取第一個符合條件的元素。
  • select:抓取所有符合條件的元素。
    範例
from bs4 import BeautifulSoup

html = """
<div>
    <p class="title">Title 1</p>
    <p class="title">Title 2</p>
</div>
"""

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

# 使用 CSS Selector 選擇第一個 <p.title>
first_title = soup.select_one("p.title")
print(first_title.text)  # Output: Title 1

# 使用 CSS Selector 選擇所有 <p.title>
all_titles = soup.select("p.title")
for title in all_titles:
    print(title.text)
# Output: 
# Title 1
# Title 2

CSS Selector 基本語法速查表

選擇器 描述 示例
* 匹配所有元素 soup.select("*") # 所有元素
element 匹配指定的元素 soup.select("div") # 所有 標籤
#id 匹配具有指定 ID 的元素 soup.select("#header") # id="header" 元素
.class 匹配具有指定類別的元素 soup.select(".intro") # class="intro" 元素
element.class 匹配指定類別的指定元素 soup.select("p.intro") # 元素,class="intro"
element#id 匹配具有指定 ID 的指定元素 soup.select("div#content") # 元素,id="content"
element, element 匹配多個指定元素 soup.select("p, div") # 所有 和 標籤
element > element 匹配指定元素的直接子元素 soup.select("div > p") # 內的所有 直系子元素
element + element 匹配緊接在指定元素後的相鄰元素 soup.select("h2 + p") # 緊接在 後面的
element ~ element 匹配指定元素後的所有兄弟元素 soup.select("h2 ~ p") # 之後所有 兄弟元素中的
[attribute] 匹配具有指定屬性的元素 soup.select("[href]") # 具有 href 屬性的元素
[attribute=value] 匹配具有指定屬性和值的元素 soup.select("[type='text']") # type="text" 的元素
[attribute^=value] 匹配屬性值以指定值開頭的元素 soup.select("[href^='https']") # href 屬性以 https 開頭的元素
[attribute$=value] 匹配屬性值以指定值結尾的元素 soup.select("[href$='.jpg']") # href 屬性以 .jpg 結尾的元素
[attribute*=value] 匹配屬性值包含指定值的元素 soup.select("[href*='example']") # href 屬性包含 'example' 的元素

補充說明:

  • *: 代表所有元素。
  • #id: 代表指定 ID 的元素,ID 必須是唯一的。
  • .class: 代表指定類別的元素,可以匹配多個元素。
  • element > element: 只匹配指定元素的直接子元素。
  • element + element: 只匹配緊接在指定元素後面的相鄰元素。
  • element ~ element: 匹配所有位於指定元素後的兄弟元素。

這些選擇器可以幫助你快速精確地定位網頁中的元素。

find vs CSS Selector 比較

方法 功能 回傳結果 用途 範例
find 選取符合條件的第一個元素 單一元素 用來取得第一個符合條件的單一元素 soup.find('a')
find_all 選取所有符合條件的元素 元素列表 (List) 用來取得所有符合條件的元素 soup.find_all('a')
select_one 選取符合 CSS Selector 的第一個元素 單一元素 用來選取第一個符合 CSS Selector 的元素 soup.select_one('.title')
select 選取所有符合 CSS Selector 的元素 元素列表 (List) 用來選取所有符合 CSS Selector 的元素 soup.select('.title')

補充說明:

  • find: 更適合當你需要快速定位單一元素時,且語法簡單直接。
  • CSS Selector: 更強大且靈活,適合用來進行複雜的多條件篩選,也更通用,特別是在與 Selenium 或其他 JavaScript 驅動工具結合使用時。

兩者各有優勢,根據具體需求選擇使用。

Python 爬蟲自動更新header
Python 爬蟲系列:Selenium : 進階定位 find


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言