爬蟲開發涉及多個階段,從需求分析到最終獲取數據並保存。以下是常見的爬蟲 SOP:
需求分析&目標明確:確定需要抓取的數據種類(例如商品價格、新聞標題、用戶評論等)。
目標網站:確定要抓取的網站或平台,並檢查是否允許爬取(查看 robots.txt 文件)。
預備工作
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
在爬蟲中,CSS Selector 是一種常用的工具,尤其是搭配像 BeautifulSoup 這樣的解析庫,來選擇網頁中的某些元素,並提取所需的資料。
主要方法
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
選擇器 | 描述 | 示例 |
---|---|---|
* |
匹配所有元素 | 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