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並找到漫畫圖片的URL
  • os:用於建立目錄和儲存圖片

指令碼實作

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.')

內容解密:

  1. 我們使用requests模組下載網頁內容,並使用BeautifulSoup解析HTML內容。
  2. 我們找到漫畫圖片的URL,並下載圖片。
  3. 我們儲存漫畫圖片到"xkcd"目錄中。
  4. 我們更新下載數量,並找到前一頁的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 異常。為了避免這種情況,可以使用 tryexcept 陳述式來捕捉異常。

一旦你獲得了 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_TEXTBy.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_roleget_by_textget_by_labelget_by_placeholderlocator。每種方法都傳回一個定位器物件,代表網頁上可能的元素。

例子:使用 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

內容解密:

以上程式碼示範瞭如何使用 requestsBeautifulSoup 下載和解析網頁內容,以及如何使用 Selenium 和 Playwright 進行網頁自動化。同時,也展示瞭如何模擬特殊鍵盤按鍵,以便更好地控制網頁的行為。

網路爬蟲和自動化工具

1. 網路爬蟲模組比較

Python 中的 webbrowserrequestsbs4 模組都是用於網路爬蟲和自動化的工具,但它們的功能和用途不同。

  • 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 動態渲染的內容。同時,網頁反爬蟲技術也將更加精進,形成爬蟲與反爬蟲之間持續的技術競爭。對於開發者而言,掌握網頁爬蟲技術的同時,也需關注網頁結構的變化和反爬蟲機制的發展,才能在資訊擷取的戰場上保持優勢。玄貓認為,深入理解網頁技術原理,並選擇合適的工具和策略,才能在兼顧效率和倫理的前提下,有效地利用網頁爬蟲技術。