Python 提供了豐富的工具和函式庫,方便開發者進行網頁爬蟲和自動化操作。利用 requests 模組可以輕鬆取得網頁內容,搭配 Beautiful Soup 解析 HTML 結構,快速提取所需資訊。Selenium 和 Playwright 則能更進一步地模擬使用者行為,控制瀏覽器執行點選、輸入、滾動等動作,實作網頁自動化測試、表單填寫等進階應用。熟練掌握這些技術,能大幅提升開發效率,自動化處理繁瑣的網路任務。
使用Beautiful Soup和requests模組進行網頁爬蟲
在本文中,我們將使用Beautiful Soup和requests模組來爬取Python Package網站的搜尋結果頁面。
安裝必要模組
首先,需要安裝Beautiful Soup和requests模組。你可以使用pip命令來安裝:
pip install beautifulsoup4 requests
爬取搜尋結果頁面
下面的程式碼示範如何使用requests模組來爬取搜尋結果頁面:
import requests
from bs4 import BeautifulSoup
# 定義搜尋關鍵字
search_term = "pyautogui"
# 定義搜尋結果頁面的URL
url = f"https://pypi.org/search/?q={search_term}"
# 傳送GET請求到搜尋結果頁面
response = requests.get(url)
# 確保請求成功
response.raise_for_status()
# 使用Beautiful Soup解析HTML內容
soup = BeautifulSoup(response.text, "html.parser")
# 印出搜尋結果頁面的HTML內容
print(soup.prettify())
提取搜尋結果連結
下一步是提取搜尋結果連結。你可以使用Beautiful Soup的find_all方法來找到所有具有class="package-snippet"的 <a> 元素:
# 提取搜尋結果連結
links = soup.find_all("a", class_="package-snippet")
# 印出搜尋結果連結
for link in links:
print(link.get("href"))
開啟搜尋結果連結
最後,你可以使用webbrowser模組來開啟搜尋結果連結:
import webbrowser
# 開啟搜尋結果連結
for link in links:
url = f"https://pypi.org{link.get('href')}"
webbrowser.open(url)
完整程式碼
以下是完整的程式碼:
import requests
from bs4 import BeautifulSoup
import webbrowser
# 定義搜尋關鍵字
search_term = "pyautogui"
# 定義搜尋結果頁面的URL
url = f"https://pypi.org/search/?q={search_term}"
# 傳送GET請求到搜尋結果頁面
response = requests.get(url)
# 確保請求成功
response.raise_for_status()
# 使用Beautiful Soup解析HTML內容
soup = BeautifulSoup(response.text, "html.parser")
# 提取搜尋結果連結
links = soup.find_all("a", class_="package-snippet")
# 開啟搜尋結果連結
for link in links:
url = f"https://pypi.org{link.get('href')}"
webbrowser.open(url)
這個程式碼可以幫助你自動開啟Python Package網站的搜尋結果頁面,並提取搜尋結果連結。
自動化下載XKCD網頁漫畫
專案概述
本專案旨在建立一個Python指令碼,自動下載XKCD網頁漫畫的圖片。指令碼將從XKCD首頁開始,依次下載每一張漫畫圖片,直到達到第一張漫畫或設定的最大下載限制。
所需模組
requests:用於下載網頁內容BeautifulSoup:用於解析HTML並找到漫畫圖片的URLos:用於建立目錄和儲存圖片
指令碼實作
import requests
from bs4 import BeautifulSoup
import os
# 設定最大下載限制
max_download_limit = 100
# 建立目錄儲存圖片
if not os.path.exists('xkcd'):
os.makedirs('xkcd')
# 下載XKCD首頁
url = 'https://xkcd.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 找到第一張漫畫圖片的URL
comic_img_url = soup.find('img', {'class': 'comic_img'}).get('src')
# 下載並儲存第一張漫畫圖片
response = requests.get(comic_img_url)
with open(os.path.join('xkcd', '1.png'), 'wb') as f:
f.write(response.content)
# 迴圈下載其餘漫畫圖片
for i in range(2, max_download_limit + 1):
# 找到Previous Comic連結
prev_link = soup.find('a', {'rel': 'prev'}).get('href')
url = 'https://xkcd.com' + prev_link
# 下載下一頁
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 找到漫畫圖片的URL
comic_img_url = soup.find('img', {'class': 'comic_img'}).get('src')
# 下載並儲存漫畫圖片
response = requests.get(comic_img_url)
with open(os.path.join('xkcd', f'{i}.png'), 'wb') as f:
f.write(response.content)
執行指令碼
執行指令碼後,將會在當前目錄下建立一個名為xkcd的目錄,並下載XKCD網頁漫畫的圖片至該目錄中。
注意事項
- 本指令碼僅下載XKCD網頁漫畫的圖片,不包含其他內容。
- 如果XKCD網站改變了其網頁結構,可能需要更新指令碼以適應變化。
- 請尊重XKCD網站的服務條款和版權宣告。
下載XKCD漫畫
程式設計
為了下載XKCD漫畫,我們需要設計一個程式來實作這個功能。首先,我們需要了解XKCD網站的結構。透過瀏覽器的開發者工具,我們可以發現:
- 漫畫圖片的URL儲存在
<img>元素的src屬性中。 <img>元素位於<div id="comic">元素內。- “Prev"按鈕的
rel屬性值為"prev”,表示沒有更多的前一頁。
為了避免消耗太多XKCD網站的頻寬,我們限制下載數量為10個。以下是程式碼:
# downloadXkcdComics.py - 下載XKCD漫畫
import requests, os, bs4, time
os.makedirs('xkcd', exist_ok=True) # 儲存漫畫
num_downloads = 0
MAX_DOWNLOADS = 10
下載網頁
現在,我們需要實作下載網頁的程式碼。以下是更新後的程式碼:
# downloadXkcdComics.py - 下載XKCD漫畫
import requests, os, bs4, time
os.makedirs('xkcd', exist_ok=True) # 儲存漫畫
num_downloads = 0
MAX_DOWNLOADS = 10
url = 'https://xkcd.com' # 起始網址
while not url.endswith('#') and num_downloads < MAX_DOWNLOADS:
# 下載網頁
print(f'Downloading page {url}...')
res = requests.get(url)
res.raise_for_status() # 驗證請求是否成功
# 將網頁內容解析為Beautiful Soup物件
soup = bs4.BeautifulSoup(res.text, 'html.parser')
# 找到漫畫圖片的URL
comic_img = soup.select('#comic img')
if comic_img == []:
print('Could not find comic image.')
else:
comic_url = 'https:' + comic_img[0].get('src')
# 下載漫畫圖片
print(f'Downloading image {comic_url}...')
res = requests.get(comic_url)
res.raise_for_status()
# 儲存漫畫圖片
image_file = open(os.path.join('xkcd', os.path.basename(comic_url)), 'wb')
for chunk in res.iter_content(100000):
image_file.write(chunk)
image_file.close()
# 更新下載數量
num_downloads += 1
# 找到前一頁的URL
prev_link = soup.select('a[rel="prev"]')
if prev_link == []:
url = 'https://xkcd.com/#' # 沒有更多前一頁
else:
url = 'https://xkcd.com' + prev_link[0].get('href')
print('Done.')
內容解密:
- 我們使用
requests模組下載網頁內容,並使用BeautifulSoup解析HTML內容。 - 我們找到漫畫圖片的URL,並下載圖片。
- 我們儲存漫畫圖片到"xkcd"目錄中。
- 我們更新下載數量,並找到前一頁的URL。
圖表翻譯:
這個程式碼實作了下載XKCD漫畫的功能,並限制下載數量為10個。
下載XKCD漫畫
首先,我們需要下載XKCD漫畫的頁面。這可以使用requests模組的get()函式來完成。以下是下載頁面的程式碼:
import requests
url = 'https://xkcd.com'
res = requests.get(url)
res.raise_for_status()
接下來,我們需要使用BeautifulSoup模組來解析下載的頁面,並找到漫畫圖片的URL。以下是相關的程式碼:
import bs4
soup = bs4.BeautifulSoup(res.text, 'html.parser')
comic_elem = soup.select('#comic img')
如果找到漫畫圖片的URL,我們就可以下載它。否則,我們就跳過這個頁面。以下是相關的程式碼:
if comic_elem == []:
print('Could not find comic image.')
else:
comic_URL = 'https:' + comic_elem[0].get('src')
# 下載漫畫圖片
res = requests.get(comic_URL)
res.raise_for_status()
最後,我們需要儲存下載的漫畫圖片到本地。以下是相關的程式碼:
# Save the image to./xkcd.
image_file = open(os.path.join('xkcd', os.path.basename(comic_URL)), 'wb')
for chunk in res.iter_content(100000):
image_file.write(chunk)
image_file.close()
內容解密:
上述程式碼使用requests模組下載XKCD漫畫的頁面,然後使用BeautifulSoup模組解析頁面並找到漫畫圖片的URL。如果找到URL,就下載圖片並儲存到本地。這個過程使用了BeautifulSoup的選擇器來找到漫畫圖片的URL,然後使用requests模組下載圖片。
圖表翻譯:
這個流程圖顯示了下載XKCD漫畫的過程,從下載頁面到儲存圖片到本地。每個步驟都對應到上述程式碼中的相關部分。
下載XKCD漫畫圖片
首先,我們需要下載XKCD漫畫的圖片。為了做到這一點,我們會使用requests函式庫向漫畫的URL傳送GET請求,然後儲存圖片資料到一個檔案中。
import requests
import os
import bs4
# 下載圖片
def download_image(url, folder):
print(f"下載圖片 {url}...")
res = requests.get(url)
res.raise_for_status()
# 取得圖片檔名
image_file_name = os.path.basename(url)
# 儲存圖片到指定資料夾
image_file_path = os.path.join(folder, image_file_name)
image_file = open(image_file_path, 'wb')
for chunk in res.iter_content(100000):
image_file.write(chunk)
image_file.close()
# 取得前一篇漫畫的URL
def get_prev_url(soup):
prev_link = soup.select('a[rel="prev"]')[0]
return prev_link.get('href')
# 主程式
url = 'https://xkcd.com'
folder = 'xkcd'
os.makedirs(folder, exist_ok=True)
while not url.endswith('#'):
print(f"下載 {url}...")
res = requests.get(url)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')
comic_url = soup.select('#comic img')[0].get('src')
download_image(comic_url, folder)
prev_url = get_prev_url(soup)
url = 'https://xkcd.com' + prev_url
print('完成!')
內容解密:
上述程式碼的主要目的是下載XKCD漫畫的圖片並儲存到指定的資料夾中。程式碼首先定義了兩個函式:download_image用於下載圖片,get_prev_url用於取得前一篇漫畫的URL。
在主程式中,我們首先建立一個資料夾來儲存下載的圖片。然後,我們進入一個迴圈,持續下載漫畫圖片直到沒有前一篇漫畫的URL為止。在迴圈中,我們使用requests函式庫向漫畫的URL傳送GET請求,然後使用BeautifulSoup函式庫解析HTML內容,取得圖片的URL和前一篇漫畫的URL。最後,我們呼叫download_image函式下載圖片並儲存到指定的資料夾中。
圖表翻譯:
上述流程圖描述了程式碼的執行流程。首先,我們開始下載圖片,然後取得前一篇漫畫的URL,接著儲存圖片到指定的資料夾中。然後,我們取得前一篇漫畫的URL,並重複下載圖片的過程,直到沒有前一篇漫畫的URL為止。最後,程式碼完成執行。
網頁爬蟲與自動化:使用Selenium控制瀏覽器
在網頁爬蟲的世界中,Selenium是一個強大的工具,允許您直接控制瀏覽器,就像一個真人使用者一樣。使用Selenium,您可以與網頁進行互動,以更先進的方式,而不是使用requests和Beautiful Soup。然而,由於它啟動了一個瀏覽器,因此速度稍慢,且在背景執行時可能會遇到困難。
Selenium的優點
Selenium的主要優點是它可以模擬真實使用者的行為,包括點選按鈕、填寫表單和滾動頁面。這使得它非常適合於需要與網頁進行複雜互動的任務,例如登入、填寫表單和點選按鈕。
Selenium的缺點
Selenium的主要缺點是它啟動了一個瀏覽器,因此速度稍慢,且在背景執行時可能會遇到困難。此外,Selenium需要一個瀏覽器的webdriver,這可能需要額外的設定和維護。
使用Selenium控制瀏覽器
要使用Selenium控制瀏覽器,您需要先安裝Selenium的webdriver。然後,您可以使用以下程式碼啟動瀏覽器:
from selenium import webdriver
browser = webdriver.Firefox()
這將啟動一個Firefox瀏覽器,您可以使用Selenium的方法控制它。
Selenium的方法
Selenium提供了許多方法來控制瀏覽器,包括:
browser.back(): 點選後退按鈕browser.forward(): 點選前進按鈕browser.refresh(): 點選重新整理按鈕browser.quit(): 關閉瀏覽器
您也可以使用Selenium的find_element()和find_elements()方法來查詢網頁上的元素。這些方法傳回一個或多個WebElement物件,代表網頁上的元素。
查詢元素
您可以使用Selenium的find_element()和find_elements()方法來查詢網頁上的元素。這些方法傳回一個或多個WebElement物件,代表網頁上的元素。
以下是查詢元素的幾種方法:
By.CLASS_NAME: 透過CSS類別名稱查詢元素By.CSS_SELECTOR: 透過CSS選擇器查詢元素By.ID: 透過ID屬性查詢元素
您可以使用以下程式碼查詢元素:
element = browser.find_element(By.CLASS_NAME, "my_class")
這將傳回一個WebElement物件,代表網頁上的元素。
網頁元素定位和操作
在網頁自動化中,能夠正確定位網頁元素是非常重要的。Selenium 提供了多種方法來定位元素,包括:
By.LINK_TEXT: 透過連結文字定位<a>元素。By.PARTIAL_LINK_TEXT: 透過部分連結文字定位<a>元素。By.NAME: 透過name屬性定位元素。By.TAG_NAME: 透過標籤名稱定位元素,例如<a>、<button>等。
如果沒有找到匹配的元素,Selenium 會丟擲 NoSuchElement 異常。為了避免這種情況,可以使用 try 和 except 陳述式來捕捉異常。
一旦你獲得了 WebElement 物件,你就可以透過它的屬性和方法來瞭解更多關於該元素的資訊。以下是一些常用的屬性和方法:
tag_name: 取得元素的標籤名稱。get_attribute(name): 取得元素的指定屬性值。get_property(name): 取得元素的指定屬性值,這些屬性不會出現在 HTML 程式碼中。text: 取得元素內的文字內容。clear(): 清除文字欄或文字區域中的文字。is_displayed(): 判斷元素是否可見。is_enabled(): 判斷輸入元素是否啟用。
範例程式碼
from selenium import webdriver
from selenium.webdriver.common.by import By
# 建立瀏覽器物件
driver = webdriver.Chrome()
# 開啟網頁
driver.get("https://www.example.com")
# 透過連結文字定位元素
element = driver.find_element(By.LINK_TEXT, "連結文字")
# 取得元素的標籤名稱
print(element.tag_name)
# 取得元素的指定屬性值
print(element.get_attribute("href"))
# 關閉瀏覽器
driver.quit()
Plantuml 圖表:網頁自動化流程
圖表翻譯:
此圖表展示了網頁自動化的基本流程。首先,啟動瀏覽器;然後,開啟目標網頁;接下來,使用 Selenium 的定位方法(如 By.LINK_TEXT、By.NAME 等)來定位網頁上的特定元素;之後,對定位到的元素進行操作,如點選、輸入文字等;最後,關閉瀏覽器以結束自動化任務。這個流程是網頁自動化的核心步驟,透過這些步驟,可以實作各種自動化任務,如自動填寫表單、點選按鈕等。
網頁自動化:使用 Selenium 控制瀏覽器
Selenium 是一種強大的工具,允許您自動化網頁瀏覽器的操作。它支援多種瀏覽器,包括 Firefox、Chrome 和 Safari。以下是使用 Selenium 控制瀏覽器的基本步驟:
安裝 Selenium
首先,您需要安裝 Selenium。您可以使用 pip 安裝:
pip install selenium
啟動瀏覽器
接下來,您需要啟動瀏覽器。以下是啟動 Firefox 的範例:
from selenium import webdriver
browser = webdriver.Firefox()
瀏覽網頁
現在,您可以使用 get() 方法瀏覽網頁:
browser.get('https://www.example.com')
查詢元素
Selenium 提供了多種方法來查詢元素,包括 find_element_by_id()、find_element_by_name()、find_element_by_class_name() 等。以下是查詢元素的範例:
elems = browser.find_elements(By.CSS_SELECTOR, 'p')
操作元素
一旦您找到元素,您就可以對其進行操作。例如,您可以使用 click() 方法模擬滑鼠點選:
link_elem = browser.find_element(By.LINK_TEXT, 'This is a link')
link_elem.click()
填寫表單
您也可以使用 Selenium 填寫表單。以下是填寫表單的範例:
user_elem = browser.find_element(By.ID, 'login_username')
user_elem.send_keys('your_real_username_here')
password_elem = browser.find_element(By.ID, 'login_password')
password_elem.send_keys('your_real_password_here')
提交表單
最後,您可以使用 submit() 方法提交表單:
user_elem.submit()
關閉瀏覽器
當您完成自動化任務後,請記得關閉瀏覽器:
browser.quit()
圖表翻譯:
內容解密:
在這個範例中,我們使用 Selenium 控制瀏覽器,自動化網頁操作。首先,我們啟動瀏覽器,然後瀏覽網頁。接下來,我們查詢元素,然後對其進行操作。最後,我們填寫表單,提交表單,然後關閉瀏覽器。這個範例展示了 Selenium 的基本用法,包括啟動瀏覽器、瀏覽網頁、查詢元素、操作元素、填寫表單、提交表單和關閉瀏覽器。
使用Selenium和Playwright控制瀏覽器
在網頁自動化中,Selenium和Playwright是兩個非常重要的工具。它們可以模擬使用者的行為,自動化瀏覽器的操作。
Selenium
Selenium是一個開源的自動化工具,支援多種瀏覽器,包括Firefox、Chrome、Safari等。它可以模擬使用者的行為,例如點選按鈕、填寫表單、滾動頁面等。
以下是使用Selenium控制瀏覽器的範例:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
html_elem = browser.find_element(By.TAG_NAME, 'html')
html_elem.send_keys(Keys.END) # 滾動到頁面底部
html_elem.send_keys(Keys.HOME) # 滾動到頁面頂部
Playwright
Playwright是一個新的自動化工具,相比Selenium,它具有更好的效能和更簡單的API。它支援多種瀏覽器,包括Firefox、Chrome、Safari等。
以下是使用Playwright控制瀏覽器的範例:
from playwright.sync_api import sync_playwright
with sync_playwright() as playwright:
browser = playwright.firefox.launch()
page = browser.new_page()
print(page.title())
browser.close()
Playwright具有以下優點:
- 更好的效能:Playwright比Selenium快得多。
- 更簡單的API:Playwright的API更簡單、更容易使用。
- 支援headless模式:Playwright可以在headless模式下執行,這意味著它可以在沒有顯示器的情況下執行。
比較Selenium和Playwright
Selenium和Playwright都是非常好的自動化工具,但是它們具有不同的優點和缺點。以下是它們的比較:
- 效能:Playwright比Selenium快得多。
- API:Playwright的API更簡單、更容易使用。
- 支援瀏覽器:Selenium支援更多種瀏覽器。
- 支援headless模式:Playwright可以在headless模式下執行。
在網頁中定位元素
Playwright 提供了一種稱為定位器(Locator)的方法,傳回代表網頁上可能的 HTML 元素的物件。這些定位器可以用來查詢網頁上的元素,例如按鈕、連結或輸入欄。
使用定位器
Playwright 的 page 物件提供了多種方法來查詢元素,包括 get_by_role、get_by_text、get_by_label、get_by_placeholder 和 locator。每種方法都傳回一個定位器物件,代表網頁上可能的元素。
例子:使用 get_by_text 查詢元素
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
# 查詢包含文字 "is a link" 的元素
element = page.get_by_text("is a link")
print(element)
使用 ARIA 角色
Playwright 的 get_by_role 方法可以使用 Accessible Rich Internet Applications (ARIA) 角色來查詢元素。ARIA 角色是一套標準,允許軟體識別網頁內容並適應使用者的需求。
例子:使用 get_by_role 查詢元素
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
# 查詢具有 "heading" 角色的元素
element = page.get_by_role("heading", name="Example Heading")
print(element)
使用標籤文字查詢元素
Playwright 的 get_by_label 方法可以使用 <label> 標籤的文字來查詢元素。
例子:使用 get_by_label 查詢元素
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
# 查詢具有 "Agree" 標籤文字的元素
element = page.get_by_label("Agree")
print(element)
使用佔位符文字查詢元素
Playwright 的 get_by_placeholder 方法可以使用 <input> 和 <textarea> 標籤的佔位符文字來查詢元素。
例子:使用 get_by_placeholder 查詢元素
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
# 查詢具有 "admin" 佔位符文字的元素
element = page.get_by_placeholder("admin")
print(element)
使用 CSS 或 XPath 選擇器查詢元素
Playwright 的 locator 方法可以使用 CSS 或 XPath 選擇器來查詢元素。
例子:使用 locator 查詢元素
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
# 查詢具有 "example" 類別的元素
element = page.locator(".example")
print(element)
網頁自動化:使用 Playwright 來控制瀏覽器
Playwright 是一個強大的工具,允許您自動化瀏覽器的行為。它提供了一個簡單的 API,讓您可以控制瀏覽器,執行任務,例如點選按鈕、填寫表單、以及抓取網頁內容。
取得元素
要使用 Playwright,您需要先取得元素。您可以使用 page.get_by_alt_text() 方法來取得具有特定 alt 文字的圖片元素。例如:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.firefox.launch(headless=False)
page = browser.new_page()
image_element = page.get_by_alt_text('Zophie')
這個程式碼會傳回具有 alt 文字 “Zophie” 的圖片元素。
使用 Locator 物件
如果您只需要獲得一個 Locator 物件,您可以使用 locator() 方法並傳入 CSS 選擇器字串。這個方法與 Selenium 的 find_elements() 方法類別似。
locator = page.locator('#my_element')
這個程式碼會傳回一個 Locator 物件,指向具有 id “my_element” 的元素。
Locator 方法
Locator 物件提供了多種方法來操作元素。以下是其中一些方法:
get_attribute(name): 傳回元素的屬性值。count(): 傳回匹配元素的數量。nth(index): 傳回第 index 個匹配元素的 Locator 物件。first: 傳回第一個匹配元素的 Locator 物件。last: 傳回最後一個匹配元素的 Locator 物件。all(): 傳回所有匹配元素的 Locator 物件列表。
以下是使用這些方法的範例:
locator = page.locator('#my_element')
print(locator.get_attribute('href')) # 傳回元素的 href 屬性值
print(locator.count()) # 傳回匹配元素的數量
print(locator.nth(0)) # 傳回第一個匹配元素的 Locator 物件
元素方法
Locator 物件也提供了多種方法來操作元素。以下是其中一些方法:
inner_text(): 傳回元素內的文字。inner_html(): 傳回元素內的 HTML 程式碼。click(): 模擬點選元素。is_visible(): 傳回元素是否可見。is_enabled(): 傳回元素是否啟用。is_checked(): 傳回元素是否被選擇。
以下是使用這些方法的範例:
locator = page.locator('#my_element')
print(locator.inner_text()) # 傳回元素內的文字
print(locator.inner_html()) # 傳回元素內的 HTML 程式碼
locator.click() # 模擬點選元素
print(locator.is_visible()) # 傳回元素是否可見
###Bounding Box
Locator 物件也提供了 bounding_box() 方法,傳回元素的 bounding box。bounding box 是一個包含元素位置和大小的字典。
locator = page.locator('#my_element')
bounding_box = locator.bounding_box()
print(bounding_box['x']) # 傳回元素的 x 座標
print(bounding_box['y']) # 傳回元素的 y 座標
print(bounding_box['width']) # 傳回元素的寬度
print(bounding_box['height']) # 傳回元素的高度
這些方法可以幫助您自動化瀏覽器的行為,執行任務,例如點選按鈕、填寫表單、以及抓取網頁內容。
網頁自動化與資料擷取
網頁自動化和資料擷取是現代網路應用中非常重要的兩個方面。透過網頁自動化,我們可以模擬使用者的行為,自動完成各種網路任務,如登入、填寫表單、點選按鈕等。資料擷取則是從網頁中提取有用的資訊,供後續分析或處理使用。
requests 和 BeautifulSoup
Python 中的 requests 模組提供了一種簡單的方式來下載網頁內容,而 BeautifulSoup 則是一個強大的 HTML 和 XML 解析器,可以用來查詢和提取網頁中的特定資訊。
import requests
from bs4 import BeautifulSoup
# 下載網頁內容
url = "https://www.example.com"
response = requests.get(url)
# 解析 HTML 內容
soup = BeautifulSoup(response.content, 'html.parser')
# 查詢所有段落
paragraphs = soup.find_all('p')
# 列印段落內容
for paragraph in paragraphs:
print(paragraph.text)
Selenium 和 Playwright
Selenium 和 Playwright 是兩個流行的網頁自動化工具,它們可以模擬使用者的行為,自動完成各種網路任務。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.firefox.launch(headless=False)
page = browser.new_page()
page.goto("https://www.example.com")
# 點選按鈕
page.click('text="Click me"')
# 填寫表單
page.fill('input[type="text"]', 'Hello World')
# 提交表單
page.click('input[type="submit"]')
browser.close()
特殊鍵盤按鍵
在網頁自動化中,可能需要模擬特殊鍵盤按鍵,如 HOME、END、PAGE UP、PAGE DOWN 等。
page.locator('html').press('End') # 滾動到頁面底部
page.locator('html').press('Home') # 滾動到頁面頂部
圖表翻譯:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Python網頁爬蟲與自動化操作技術
package "資料視覺化流程" {
package "資料準備" {
component [資料載入] as load
component [資料清洗] as clean
component [資料轉換] as transform
}
package "圖表類型" {
component [折線圖 Line] as line
component [長條圖 Bar] as bar
component [散佈圖 Scatter] as scatter
component [熱力圖 Heatmap] as heatmap
}
package "美化輸出" {
component [樣式設定] as style
component [標籤註解] as label
component [匯出儲存] as export
}
}
load --> clean --> transform
transform --> line
transform --> bar
transform --> scatter
transform --> heatmap
line --> style --> export
bar --> label --> export
note right of scatter
探索變數關係
發現異常值
end note
@enduml內容解密:
以上程式碼示範瞭如何使用 requests 和 BeautifulSoup 下載和解析網頁內容,以及如何使用 Selenium 和 Playwright 進行網頁自動化。同時,也展示瞭如何模擬特殊鍵盤按鍵,以便更好地控制網頁的行為。
網路爬蟲和自動化工具
1. 網路爬蟲模組比較
Python 中的 webbrowser、requests 和 bs4 模組都是用於網路爬蟲和自動化的工具,但它們的功能和用途不同。
webbrowser模組可以用於開啟網頁瀏覽器和瀏覽網頁。requests模組可以用於傳送 HTTP 請求和接收伺服器的回應,常用於下載網頁內容。bs4(Beautiful Soup)模組可以用於解析 HTML 和 XML 檔案,常用於從網頁中提取資料。
2. 下載內容的存取
當使用 requests 模組傳送 GET 請求時,傳回的物件是一個 Response 物件。您可以使用 text 屬性存取下載的內容作為字串。
import requests
response = requests.get('https://www.example.com')
content = response.text
3. 檢查下載結果
您可以使用 status_code 屬性檢查下載是否成功。通常,狀態碼 200 表示成功。
if response.status_code == 200:
print('下載成功')
else:
print('下載失敗')
4. HTTP 狀態碼
您可以使用 status_code 屬性存取 HTTP 狀態碼。
status_code = response.status_code
print(status_code)
5. 儲存回應到檔案
您可以使用 content 屬性和檔案操作函式儲存回應到檔案。
with open('example.html', 'wb') as file:
file.write(response.content)
6. API 回應格式
大多數線上 API 回傳的回應格式為 JSON 或 XML。
7. 開啟瀏覽器開發工具
您可以使用 F12 鍵或右鍵點選並選擇「檢查」或「檢視原始碼」來開啟瀏覽器的開發工具。
8. 檢視元素 HTML
您可以在開發工具中選擇「元素」標籤,並點選元素選擇器工具來選擇特定元素,然後在 HTML 樹中檢視其 HTML 程式碼。
9. CSS 選擇器
要找到 id 屬性為 main 的元素,您可以使用以下 CSS 選擇器:
#main
10. CSS 選擇器(多個 id)
要找到 id 屬性為 highlight 的所有元素,您可以使用以下 CSS 選擇器:
#highlight
但由於 id 應該是唯一的,因此這個選擇器理論上只會找到一個元素。
11. 從 Beautiful Soup 標籤物件中取得字串
假設您有一個 Beautiful Soup 標籤物件 spam,您可以使用 text 屬性來取得其內容作為字串:
text = spam.text
print(text) # 輸出:Hello, world!
12. 儲存標籤物件的屬性
您可以使用 attrs 屬性來儲存標籤物件的所有屬性:
link_elem = soup.find('a')
attrs = link_elem.attrs
13. 匯入 Selenium
您需要匯入 webdriver 模組:
from selenium import webdriver
14. find_element() 和 find_elements()
find_element()方法傳回單個元素物件。find_elements()方法傳回元素物件列表。
15. 模擬滑鼠點選和鍵盤輸入
Selenium 的 WebElement 物件有 click() 方法來模擬滑鼠點選,以及 send_keys() 方法來模擬鍵盤輸入。
從使用者經驗視角來看,善用 Python 的網頁爬蟲工具,能大幅提升網路資訊擷取的效率。requests 模組搭配 Beautiful Soup 可輕鬆解析網頁結構,提取所需資料,實作網頁資訊的自動化收集。Selenium 和 Playwright 則更進一步,允許模擬使用者行為,自動執行網頁互動操作,例如表單填寫、按鈕點選等,適用於更複雜的網頁自動化情境。
然而,這些工具並非完美無缺。Beautiful Soup 適用於靜態網頁,但對於動態載入的網頁內容則力有未逮。Selenium 和 Playwright 雖能處理動態網頁,但執行速度較慢,且需額外設定瀏覽器驅動程式。此外,網頁結構的變動也可能導致爬蟲程式失效,需要定期維護更新。更重要的是,務必遵守網站的 robots.txt 規則,避免對伺服器造成過度負擔,並尊重網站的服務條款及版權宣告。
展望未來,隨著網頁技術的發展,爬蟲工具也將持續演進。預期將出現更智慧、更穩定的爬蟲框架,能自動適應網頁結構變化,並更有效地處理 JavaScript 動態渲染的內容。同時,網頁反爬蟲技術也將更加精進,形成爬蟲與反爬蟲之間持續的技術競爭。對於開發者而言,掌握網頁爬蟲技術的同時,也需關注網頁結構的變化和反爬蟲機制的發展,才能在資訊擷取的戰場上保持優勢。玄貓認為,深入理解網頁技術原理,並選擇合適的工具和策略,才能在兼顧效率和倫理的前提下,有效地利用網頁爬蟲技術。