Python 提供了強大的工具來實作網頁自動化和資料處理。Playwright 和 Selenium 可用於模擬瀏覽器行為,像是點選元素、輸入文字和操作瀏覽器按鈕等。結合 openpyxl,更能有效地讀取、寫入和處理 Excel 檔案,提取所需資料並進行分析。這些技術在網頁爬蟲、自動化測試和資料分析等領域都有廣泛的應用。

16. Playwright 中的選擇器方法

Playwright 中可以使用 page.click()page.keyboard 物件來模擬點選和鍵盤輸入,例如選擇所有文字可以使用 page.keyboard.down('Control')page.keyboard.press('a')

17. 模擬瀏覽器按鈕點選(Selenium)

您可以使用 back(), forward(), 和 refresh() 方法來模擬瀏覽器的後退、前進和重新整理按鈕。

driver.back()
driver.forward()
driver.refresh()

18. 模擬瀏覽器按鈕點選(Playwright)

Playwright 中可以使用 page.go_back(), page.go_forward(), 和 page.reload() 方法來模擬瀏覽器的後退、前進和重新整理按鈕。

page.go_back()
page.go_forward()
page.reload()

練習程式

圖片下載程式

以下是一個簡單的圖片下載程式範例,使用 requestsBeautifulSoup 下載 Flickr 上特定類別的圖片:

import requests
from bs4 import BeautifulSoup

def download_images(url, category):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    images = soup.find_all('img', class_='photo')

    for image in images:
        image_url = image['src']
        response = requests.get(image_url)
        with open(f'{category}_{image_url.split("/")[-1]}', 'wb') as file:
            file.write(response.content)

url = 'https://www.flickr.com/search/?text=' + 'landscape'
download_images(url, 'landscape')

請注意,這個範例是簡化過的,可能需要根據實際的情況進行調整。

讀取 Excel 檔案

Excel 是一款流行且功能強大的試算表應用程式。openpyxl 模組允許您的 Python 程式讀取和修改 Excel 試算表檔案。例如,您可能需要從一個試算表複製某些資料並將其貼到另一個試算表中。或者,您可能需要瀏覽數千行資料並根據某些條件選擇其中少數幾行進行小幅編輯。或者,您可能需要瀏覽數百個部門預算的試算表,以尋找任何虧損的預算。這些都是 Python 可以幫助您完成的單調、無意義的試算表任務。

基本定義

首先,讓我們瞭解一些基本定義。Excel 試算表檔案稱為工作簿(workbook)。一個工作簿儲存在具有.xlsx 副檔名的檔案中。每個工作簿可以包含多個工作表(sheet),也稱為工作頁(worksheet)。使用者目前正在檢視的工作表(或在關閉 Excel 之前最後檢視的工作表)稱為作用中工作表(active sheet)。每個工作表都有欄(由字母地址)和列(由數字地址)。位於特定欄和列的方格稱為儲存格(cell)。每個儲存格都可以包含數值或文字值。儲存格及其資料組成一個工作表。

範例試算表

本章中的範例將使用一個名為 example3.xlsx 的試算表,儲存在當前工作目錄中。您可以自己建立試算表,也可以從本文的線上資源下載它。圖 14-1 顯示了三個工作表的標籤:Sheet1、Sheet2 和 Sheet3。

圖 14-1:工作簿工作表的標籤位於 Excel 的左下角。

範例檔案中的 Sheet1 應該如下所示(如未下載 example3.xlsx,則應自行輸入此資料)。

ABC
4/5/2035 1:34:02 PMApples73
4/5/2035 3:41:23 AMCherries85
4/6/2035 12:46:51 PMPears14

安裝 openpyxl

Python 不附帶 openpyxl,因此您需要安裝它。附錄 A 有關於如何使用 Python 的 pip 工具安裝第三方套件的資訊。

讀取試算表資料

現在,讓我們開始使用 openpyxl 讀取試算表資料。首先,您需要載入 openpyxl 模組並載入試算表檔案。

import openpyxl

# 載入試算表檔案
wb = openpyxl.load_workbook('example3.xlsx')

# 選擇作用中工作表
sheet = wb.active

# 讀取儲存格資料
for row in range(1, sheet.max_row + 1):
    for column in range(1, sheet.max_column + 1):
        cell = sheet.cell(row=row, column=column)
        print(cell.value)

這段程式碼會載入 example3.xlsx 試算表檔案,選擇作用中工作表,然後讀取每個儲存格的資料並印出。

內容解密:

  • openpyxl.load_workbook('example3.xlsx'):載入 example3.xlsx 試算表檔案。
  • wb.active:選擇作用中工作表。
  • sheet.cell(row=row, column=column):取得位於特定行和列的儲存格。
  • cell.value:取得儲存格的值。

圖表翻譯:

圖表翻譯:

此流程圖描述了讀取試算表資料的步驟。首先,載入試算表檔案,然後選擇作用中工作表。接下來,讀取每個儲存格的資料,最後印出儲存格的值。

使用openpyxl模組操作Excel檔案

openpyxl是一個強大的Python模組,允許您讀寫Excel檔案(.xlsx、.xlsm、.xltx、.xltm)。以下是使用openpyxl模組操作Excel檔案的步驟。

開啟工作簿

首先,您需要匯入openpyxl模組並開啟Excel檔案。您可以使用openpyxl.load_workbook()函式來開啟檔案。

import openpyxl
wb = openpyxl.load_workbook('example3.xlsx')

這會傳回一個Workbook物件,代表Excel檔案。

取得工作表

您可以使用wb.sheetnames屬性來取得工作表的名稱列表。然後,您可以使用工作表名稱來取得對應的Worksheet物件。

sheet = wb['Sheet1']

您也可以使用wb.active屬性來取得目前活躍的工作表。

取得儲存格

您可以使用sheet['A1']語法來取得儲存格的Cell物件。然後,您可以使用cell.value屬性來取得儲存格的值。

cell = sheet['A1']
print(cell.value)

您也可以使用sheet.cell()方法來取得儲存格,傳入行和列的整數值。

cell = sheet.cell(row=1, column=1)
print(cell.value)

迭代儲存格

您可以使用迴圈來迭代儲存格,例如:

for i in range(1, 8, 2):
    print(i, sheet.cell(row=i, column=2).value)

這會印出每個奇數行的第二列儲存格的值。

日期和時間

openpyxl會自動將日期和時間儲存格解釋為datetime物件。您可以使用cell.value屬性來取得日期和時間的值。

圖表翻譯:

這個Plantuml圖表展示了openpyxl的基本結構。從左到右,圖表展示瞭如何使用openpyxl模組開啟工作簿,取得工作表,取得儲存格,和取得儲存格的值。

讀取Excel檔案中的資料

使用openpyxl函式庫,可以輕鬆地讀取Excel檔案中的資料。首先,需要載入Excel檔案,然後選擇要讀取的工作表。

import openpyxl
wb = openpyxl.load_workbook('example3.xlsx')
sheet = wb['Sheet1']

讀取特定儲存格的資料

可以使用cell()方法來讀取特定儲存格的資料,需要指定行和列的編號。

cell = sheet.cell(row=1, column=2)
print(cell.value)  # 印出儲存格B1的值

也可以使用sheet['B1']的方式來讀取儲存格的資料。

讀取多個儲存格的資料

可以使用迴圈來讀取多個儲存格的資料。例如,想要讀取B欄中所有奇數行的儲存格資料,可以使用以下程式碼:

for i in range(1, sheet.max_row + 1, 2):
    cell = sheet.cell(row=i, column=2)
    print(cell.value)

取得工作表的大小

可以使用max_rowmax_column屬性來取得工作表的大小。

print(sheet.max_row)  # 印出工作表的最大行數
print(sheet.max_column)  # 印出工作表的最大列數

將列號轉換為字母

可以使用openpyxl.utils.get_column_letter()函式來將列號轉換為字母。

from openpyxl.utils import get_column_letter
print(get_column_letter(1))  # 印出'A'
print(get_column_letter(2))  # 印出'B'
print(get_column_letter(27))  # 印出'AA'

將字母轉換為列號

可以使用openpyxl.utils.column_index_from_string()函式來將字母轉換為列號。

from openpyxl.utils import column_index_from_string
print(column_index_from_string('A'))  # 印出1

圖表翻譯:

使用 openpyxl 模組進行 Excel 檔案操作

openpyxl 是一個 Python 模組,允許您讀寫 Excel 檔案(.xlsx、.xlsm、.xltx、.xltm)。以下是使用 openpyxl 進行 Excel 檔案操作的範例。

安裝 openpyxl

您可以使用 pip 安裝 openpyxl:

pip install openpyxl

載入 Excel 檔案

您可以使用 load_workbook() 函式載入 Excel 檔案:

import openpyxl

wb = openpyxl.load_workbook('example3.xlsx')

存取工作表

您可以使用 wb['Sheet1'] 存取工作表:

sheet = wb['Sheet1']

存取儲存格

您可以使用 sheet['A1'] 存取儲存格:

cell = sheet['A1']

列印儲存格值

您可以使用 cell.value 列印儲存格值:

print(cell.value)

使用 get_column_letter() 和 column_index_from_string()

您可以使用 get_column_letter()column_index_from_string() 函式進行列號和列字母之間的轉換:

from openpyxl.utils import get_column_letter, column_index_from_string

print(get_column_letter(27))  # 輸出: AA
print(column_index_from_string('AA'))  # 輸出: 27

切割工作表

您可以使用 sheet['A1':'C3'] 切割工作表:

cells = sheet['A1':'C3']

列印儲存格值

您可以使用兩個 for 迴圈列印儲存格值:

for row_of_cell_objects in cells:
    for cell_obj in row_of_cell_objects:
        print(cell_obj.value)
    print('--- END OF ROW 
---
')

存取列和行

您可以使用 sheet.rowssheet.columns 存取列和行:

for row in sheet.rows:
    for cell in row:
        print(cell.value)
    print('--- END OF ROW 
---
')

這些範例展示瞭如何使用 openpyxl 進行 Excel 檔案操作,包括載入檔案、存取工作表、儲存格、列和行,以及列印儲存格值。

讀取 Excel 試算表中的資料

在使用 openpyxl 時,首先需要匯入模組並載入試算表檔案。以下是範例程式碼:

import openpyxl

# 載入試算表檔案
wb = openpyxl.load_workbook('example3.xlsx')

# 取得第一個工作表
sheet = wb['Sheet1']

存取試算表中的資料

openpyxl 提供了多種方式來存取試算表中的資料。以下是幾種常見的方法:

1. 使用 rowscolumns 屬性

rowscolumns 屬性會傳回一個包含元組的列表,每個元組代表一行或一列的儲存格物件。

# 取得所有行
rows = list(sheet.rows)

# 取得所有列
columns = list(sheet.columns)

2. 使用索引存取儲存格

可以使用索引來存取特定的儲存格,例如 sheet['A1']sheet.cell(row=1, column=1)

# 取得 A1 儲存格的值
cell_value = sheet['A1'].value

# 取得第一行第一列儲存格的值
cell_value = sheet.cell(row=1, column=1).value

3. 使用 cell() 方法

cell() 方法可以用來存取特定的儲存格,例如 sheet.cell(row=1, column=1)

# 取得 A1 儲存格的值
cell_value = sheet.cell(row=1, column=1).value

範例:讀取試算表中的資料

以下是範例程式碼,示範如何讀取試算表中的資料:

import openpyxl

# 載入試算表檔案
wb = openpyxl.load_workbook('example3.xlsx')

# 取得第一個工作表
sheet = wb['Sheet1']

# 取得所有行
rows = list(sheet.rows)

# 列印每行的儲存格值
for row in rows:
    for cell in row:
        print(cell.value)

# 取得 A1 儲存格的值
cell_value = sheet['A1'].value
print(cell_value)

讀取人口普查資料的Excel檔案

首先,我們需要讀取人口普查資料的Excel檔案。這個檔案包含了美國各個縣的人口資料和人口普查區域的數量。為了簡化這個過程,我們將使用openpyxl模組來讀取Excel檔案。

import openpyxl
import pprint

# 讀取Excel檔案
print('Opening workbook...')
wb = openpyxl.load_workbook('censuspopdata.xlsx')

# 取得工作表
sheet = wb['Population by 玄貓']

# 建立一個字典來儲存縣的人口資料
county_data = {}

# 讀取工作表的行
print('Reading rows...')
for row in range(2, sheet.max_row + 1):
    # 取得州、縣和人口資料
    state = sheet['B' + str(row)].value
    county = sheet['C' + str(row)].value
    pop = sheet['D' + str(row)].value

    # 如果州不在字典中,新增一個州的字典
    if state not in county_data:
        county_data[state] = {}

    # 如果縣不在州的字典中,新增一個縣的字典
    if county not in county_data[state]:
        county_data[state][county] = {'tracts': 0, 'pop': 0}

    # 更新縣的人口資料
    county_data[state][county]['tracts'] += 1
    county_data[state][county]['pop'] += pop

# 印出縣的人口資料
print('Writing results...')
pprint.pprint(county_data)

寫入結果到文字檔案

最後,我們需要將結果寫入到一個文字檔案中。這樣,我們就可以輕鬆地存取和使用這些資料。

# 寫入結果到文字檔案
with open('county_data.py', 'w') as f:
    f.write('county_data = ' + pprint.pformat(county_data))

結果

執行這個程式後,我們就會得到一個包含美國各個縣的人口資料和人口普查區域的數量的字典。這個字典可以輕鬆地被存取和使用。

圖表翻譯:

這個流程圖展示瞭如何讀取人口普查資料的Excel檔案,然後更新縣的人口資料,最後印出結果並寫入到文字檔案中。每一步驟都清楚地展示瞭如何處理資料和存取結果。

處理美國人口普查資料的Python程式

程式目的

本程式旨在讀取美國人口普查資料,將其整理成一個結構化的字典,方便後續分析和使用。

程式結構

程式主要分為兩部分:讀取Excel檔案中的資料,然後將資料整理成字典。

讀取Excel檔案

使用openpyxl函式庫來讀取Excel檔案。

import openpyxl

# 載入Excel檔案
wb = openpyxl.load_workbook('census.xlsx')
sheet = wb['Sheet1']

整理資料

建立一個字典county_data來儲存整理好的資料。使用setdefault方法確保州和縣的鍵存在於字典中。

county_data = {}

for row in range(2, sheet.max_row + 1):
    state = sheet['B' + str(row)].value
    county = sheet['C' + str(row)].value
    pop = sheet['D' + str(row)].value
    
    # 確保州鍵存在於字典中
    county_data.setdefault(state, {})
    
    # 確保縣鍵存在於州字典中
    county_data[state].setdefault(county, {'tracts': 0, 'pop': 0})
    
    # 更新縣的資料
    county_data[state][county]['tracts'] += 1
    county_data[state][county]['pop'] += pop

範例輸出

print(county_data['AK']['Anchorage']['pop'])  # 291826
print(county_data['AK']['Anchorage']['tracts'])  # 55

完整程式碼

import openpyxl

def read_census_excel(file_path):
    wb = openpyxl.load_workbook(file_path)
    sheet = wb['Sheet1']
    county_data = {}
    
    for row in range(2, sheet.max_row + 1):
        state = sheet['B' + str(row)].value
        county = sheet['C' + str(row)].value
        pop = sheet['D' + str(row)].value
        
        county_data.setdefault(state, {})
        county_data[state].setdefault(county, {'tracts': 0, 'pop': 0})
        
        county_data[state][county]['tracts'] += 1
        county_data[state][county]['pop'] += pop
    
    return county_data

# 使用範例
file_path = 'census.xlsx'
county_data = read_census_excel(file_path)
print(county_data['AK']['Anchorage']['pop'])  # 291826
print(county_data['AK']['Anchorage']['tracts'])  # 55

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Python 自動化瀏覽器操作與 Excel 檔案處理

package "網頁爬蟲架構" {
    package "請求層" {
        component [HTTP 請求] as http
        component [Session 管理] as session
        component [代理池] as proxy
    }

    package "解析層" {
        component [HTML 解析器] as html
        component [CSS 選擇器] as css
        component [XPath] as xpath
        component [正規表示式] as regex
    }

    package "儲存層" {
        database [資料庫] as db
        component [檔案系統] as file
        component [API 輸出] as api
    }
}

http --> session : 保持連線
session --> proxy : 防封鎖
http --> html : 取得內容
html --> css : 選取元素
html --> xpath : 路徑查詢
css --> db : 儲存資料
xpath --> file : 匯出檔案

note right of proxy
  輪換 IP 位址
  模擬瀏覽器
  控制請求頻率
end note

@enduml

此圖表展示了程式的流程:讀取Excel檔案、整理資料、更新縣資料、輸出結果。

從使用者經驗視角來看,自動化瀏覽器操作和資料處理能大幅提升效率。Playwright 和 Selenium 提供的瀏覽器控制方法,讓網頁互動測試和資料擷取更加便捷,例如 page.go_back()page.reload() 等方法簡化了瀏覽器操作流程。分析程式碼範例可以發現,透過 requests 和 BeautifulSoup 的結合,能有效地從網頁中爬取圖片等資源,但程式碼的健壯性仍需加強,例如需考慮網路連線例外處理和網頁結構變化的適應性。技術限制深析顯示,網頁結構的複雜性和動態變化是資料擷取的常見挑戰,需要更進階的技術如動態渲染和 JavaScript 逆向工程來應對。展望未來,瀏覽器自動化技術將持續發展,更智慧的選擇器、更穩定的操作流程和更強大的反偵測能力將成為技術演進的重點。玄貓認為,熟練掌握這些工具和技術,能有效提升開發效率,並在資料分析、網頁測試等領域創造更大價值。