12_browser_storage_access.py
crawl/advanced/12_browser_storage_access.py
"""
Advanced Example: Browser Storage Access
=========================================
This example demonstrates how to access various browser storage types:
- Local Storage
- Session Storage
- Extension Storage
- IndexedDB
- Cookies
- Private State Tokens (Privacy Pass)
Using both Playwright and Selenium approaches.
"""
from playwright.sync_api import sync_playwright
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json
# ============================================================================
# PLAYWRIGHT APPROACH
# ============================================================================
def playwright_local_storage():
"""Access Local Storage with Playwright."""
with sync_playwright() as p:
print("="*60)
print("PLAYWRIGHT: LOCAL STORAGE")
print("="*60)
browser = p.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
# Navigate to a page
url = "https://quotes.toscrape.com/"
page.goto(url)
page.wait_for_load_state('networkidle')
print(f"\n1. Opened: {url}")
# Set Local Storage item
page.evaluate("localStorage.setItem('myKey', 'myValue');")
page.evaluate("localStorage.setItem('testData', JSON.stringify({name: 'Test', id: 123}));")
print(" ✅ Set Local Storage items")
# Get Local Storage item
value = page.evaluate("localStorage.getItem('myKey');")
print(f"\n2. Get Local Storage item:")
print(f" localStorage.getItem('myKey') = {value}")
# Get all Local Storage items
all_storage = page.evaluate("""
() => {
const items = {};
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
items[key] = localStorage.getItem(key);
}
return items;
}
""")
print(f"\n3. All Local Storage items:")
for key, value in all_storage.items():
print(f" {key}: {value}")
# Get Local Storage via context
storage_state = context.storage_state()
print(f"\n4. Storage state (context):")
print(f" Local Storage keys: {len(storage_state.get('origins', [{}])[0].get('localStorage', []))}")
browser.close()
def playwright_session_storage():
"""Access Session Storage with Playwright."""
with sync_playwright() as p:
print("\n" + "="*60)
print("PLAYWRIGHT: SESSION STORAGE")
print("="*60)
browser = p.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
url = "https://quotes.toscrape.com/"
page.goto(url)
page.wait_for_load_state('networkidle')
print(f"\n1. Opened: {url}")
# Set Session Storage item
page.evaluate("sessionStorage.setItem('sessionKey', 'sessionValue');")
page.evaluate("sessionStorage.setItem('userSession', JSON.stringify({userId: 456, timestamp: Date.now()}));")
print(" ✅ Set Session Storage items")
# Get Session Storage item
value = page.evaluate("sessionStorage.getItem('sessionKey');")
print(f"\n2. Get Session Storage item:")
print(f" sessionStorage.getItem('sessionKey') = {value}")
# Get all Session Storage items
all_storage = page.evaluate("""
() => {
const items = {};
for (let i = 0; i < sessionStorage.length; i++) {
const key = sessionStorage.key(i);
items[key] = sessionStorage.getItem(key);
}
return items;
}
""")
print(f"\n3. All Session Storage items:")
for key, value in all_storage.items():
print(f" {key}: {value}")
browser.close()
def playwright_cookies():
"""Access Cookies with Playwright."""
with sync_playwright() as p:
print("\n" + "="*60)
print("PLAYWRIGHT: COOKIES")
print("="*60)
browser = p.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
url = "https://quotes.toscrape.com/"
page.goto(url)
page.wait_for_load_state('networkidle')
print(f"\n1. Opened: {url}")
# Add cookies
context.add_cookies([
{
'name': 'test_cookie',
'value': 'test_value',
'domain': 'quotes.toscrape.com',
'path': '/',
},
{
'name': 'user_pref',
'value': 'dark_mode',
'domain': 'quotes.toscrape.com',
'path': '/',
}
])
print(" ✅ Added cookies")
# Get all cookies
cookies = context.cookies()
print(f"\n2. All cookies ({len(cookies)}):")
for cookie in cookies:
print(f" Name: {cookie['name']}")
print(f" Value: {cookie['value']}")
print(f" Domain: {cookie.get('domain', 'N/A')}")
print(f" Path: {cookie.get('path', 'N/A')}")
print()
# Get cookies for specific URL
url_cookies = context.cookies(url)
print(f"3. Cookies for {url}: {len(url_cookies)}")
# Get specific cookie value
cookie_value = next((c['value'] for c in cookies if c['name'] == 'test_cookie'), None)
print(f"\n4. Get specific cookie 'test_cookie': {cookie_value}")
browser.close()
def playwright_indexeddb():
"""Access IndexedDB with Playwright."""
with sync_playwright() as p:
print("\n" + "="*60)
print("PLAYWRIGHT: INDEXEDDB")
print("="*60)
browser = p.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
url = "https://quotes.toscrape.com/"
page.goto(url)
page.wait_for_load_state('networkidle')
print(f"\n1. Opened: {url}")
# Access IndexedDB via JavaScript
print("2. Accessing IndexedDB...")
# Example: Create database and store data
indexeddb_result = page.evaluate("""
() => {
return new Promise((resolve) => {
const request = indexedDB.open('testDB', 1);
request.onerror = () => resolve({success: false, error: 'Failed to open DB'});
request.onsuccess = (event) => {
const db = event.target.result;
// Get all database names
if (window.indexedDB.databases) {
window.indexedDB.databases().then(databases => {
resolve({
success: true,
databases: databases.map(db => db.name),
currentDB: db.name,
version: db.version
});
});
} else {
resolve({
success: true,
currentDB: db.name,
version: db.version,
note: 'databases() not supported'
});
}
};
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains('testStore')) {
db.createObjectStore('testStore', {keyPath: 'id'});
}
};
});
}
""")
print(f" IndexedDB Result: {json.dumps(indexeddb_result, indent=2)}")
# Get database info
db_info = page.evaluate("""
() => {
if (window.indexedDB.databases) {
return window.indexedDB.databases().then(dbs => {
return dbs.map(db => ({
name: db.name,
version: db.version
}));
});
}
return Promise.resolve([]);
}
""")
if db_info:
print(f"\n3. Available IndexedDB databases:")
for db in db_info:
print(f" Name: {db['name']}, Version: {db['version']}")
browser.close()
def playwright_storage_state():
"""Save and restore storage state (Local Storage, Session Storage, Cookies)."""
with sync_playwright() as p:
print("\n" + "="*60)
print("PLAYWRIGHT: STORAGE STATE (SAVE/RESTORE)")
print("="*60)
# Create context and set up storage
browser = p.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
url = "https://quotes.toscrape.com/"
page.goto(url)
# Set storage
page.evaluate("localStorage.setItem('savedData', 'important_value');")
context.add_cookies([{
'name': 'saved_cookie',
'value': 'cookie_value',
'domain': 'quotes.toscrape.com',
'path': '/',
}])
# Save storage state
storage_state = context.storage_state()
print(f"\n1. Saved storage state:")
print(f" Cookies: {len(storage_state.get('cookies', []))}")
print(f" Origins: {len(storage_state.get('origins', []))}")
# Save to file
with open('storage_state.json', 'w') as f:
json.dump(storage_state, f, indent=2)
print(f" ✅ Saved to storage_state.json")
browser.close()
# Restore from saved state
print(f"\n2. Restoring from saved state...")
browser2 = p.chromium.launch(headless=True)
context2 = browser2.new_context(storage_state=storage_state)
page2 = context2.new_page()
page2.goto(url)
# Verify restored storage
restored_value = page2.evaluate("localStorage.getItem('savedData');")
print(f" ✅ Restored Local Storage value: {restored_value}")
restored_cookies = context2.cookies()
print(f" ✅ Restored cookies: {len(restored_cookies)}")
browser2.close()
# ============================================================================
# SELENIUM APPROACH
# ============================================================================
def selenium_local_storage():
"""Access Local Storage with Selenium."""
print("\n" + "="*60)
print("SELENIUM: LOCAL STORAGE")
print("="*60)
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
try:
url = "https://quotes.toscrape.com/"
driver.get(url)
print(f"\n1. Opened: {url}")
# Set Local Storage
driver.execute_script("localStorage.setItem('myKey', 'myValue');")
driver.execute_script("localStorage.setItem('testData', JSON.stringify({name: 'Test', id: 123}));")
print(" ✅ Set Local Storage items")
# Get Local Storage item
value = driver.execute_script("return localStorage.getItem('myKey');")
print(f"\n2. Get Local Storage item:")
print(f" localStorage.getItem('myKey') = {value}")
# Get all Local Storage items
all_storage = driver.execute_script("""
var items = {};
for (var i = 0; i < localStorage.length; i++) {
var key = localStorage.key(i);
items[key] = localStorage.getItem(key);
}
return items;
""")
print(f"\n3. All Local Storage items:")
for key, value in all_storage.items():
print(f" {key}: {value}")
# Get Local Storage size
size = driver.execute_script("return localStorage.length;")
print(f"\n4. Local Storage size: {size} items")
finally:
driver.quit()
def selenium_session_storage():
"""Access Session Storage with Selenium."""
print("\n" + "="*60)
print("SELENIUM: SESSION STORAGE")
print("="*60)
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
try:
url = "https://quotes.toscrape.com/"
driver.get(url)
print(f"\n1. Opened: {url}")
# Set Session Storage
driver.execute_script("sessionStorage.setItem('sessionKey', 'sessionValue');")
driver.execute_script("sessionStorage.setItem('userSession', JSON.stringify({userId: 456}));")
print(" ✅ Set Session Storage items")
# Get Session Storage item
value = driver.execute_script("return sessionStorage.getItem('sessionKey');")
print(f"\n2. Get Session Storage item:")
print(f" sessionStorage.getItem('sessionKey') = {value}")
# Get all Session Storage items
all_storage = driver.execute_script("""
var items = {};
for (var i = 0; i < sessionStorage.length; i++) {
var key = sessionStorage.key(i);
items[key] = sessionStorage.getItem(key);
}
return items;
""")
print(f"\n3. All Session Storage items:")
for key, value in all_storage.items():
print(f" {key}: {value}")
finally:
driver.quit()
def selenium_cookies():
"""Access Cookies with Selenium."""
print("\n" + "="*60)
print("SELENIUM: COOKIES")
print("="*60)
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
try:
url = "https://quotes.toscrape.com/"
driver.get(url)
print(f"\n1. Opened: {url}")
# Add cookies
driver.add_cookie({
'name': 'test_cookie',
'value': 'test_value',
'domain': 'quotes.toscrape.com',
'path': '/',
})
driver.add_cookie({
'name': 'user_pref',
'value': 'dark_mode',
'domain': 'quotes.toscrape.com',
'path': '/',
})
print(" ✅ Added cookies")
# Get all cookies
cookies = driver.get_cookies()
print(f"\n2. All cookies ({len(cookies)}):")
for cookie in cookies:
print(f" Name: {cookie['name']}")
print(f" Value: {cookie['value']}")
print(f" Domain: {cookie.get('domain', 'N/A')}")
print(f" Path: {cookie.get('path', 'N/A')}")
print()
# Get specific cookie
cookie_value = driver.get_cookie('test_cookie')
if cookie_value:
print(f"3. Get specific cookie 'test_cookie':")
print(f" Value: {cookie_value['value']}")
# Delete cookie
driver.delete_cookie('test_cookie')
print(f"\n4. ✅ Deleted cookie 'test_cookie'")
# Verify deletion
remaining_cookies = driver.get_cookies()
print(f" Remaining cookies: {len(remaining_cookies)}")
finally:
driver.quit()
def selenium_indexeddb():
"""Access IndexedDB with Selenium."""
print("\n" + "="*60)
print("SELENIUM: INDEXEDDB")
print("="*60)
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
try:
url = "https://quotes.toscrape.com/"
driver.get(url)
print(f"\n1. Opened: {url}")
# Access IndexedDB
print("2. Accessing IndexedDB...")
# Check if IndexedDB is available
indexeddb_available = driver.execute_script("return typeof indexedDB !== 'undefined';")
print(f" IndexedDB available: {indexeddb_available}")
# Get database names (if supported)
databases = driver.execute_script("""
if (window.indexedDB.databases) {
return window.indexedDB.databases().then(dbs => {
return dbs.map(db => ({
name: db.name,
version: db.version
}));
});
}
return [];
""")
if databases:
print(f"\n3. Available IndexedDB databases:")
for db in databases:
print(f" Name: {db['name']}, Version: {db['version']}")
else:
print(" Note: IndexedDB.databases() may not be supported in this browser")
finally:
driver.quit()
# ============================================================================
# PRIVATE STATE TOKENS (Privacy Pass) - Advanced
# ============================================================================
def playwright_private_state_tokens():
"""Access Private State Tokens with Playwright."""
with sync_playwright() as p:
print("\n" + "="*60)
print("PLAYWRIGHT: PRIVATE STATE TOKENS")
print("="*60)
print("\n1. Private State Tokens (Privacy Pass) are browser-managed")
print(" and cannot be directly accessed via JavaScript for security reasons.")
print(" However, we can check if the API is available:")
browser = p.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
url = "https://quotes.toscrape.com/"
page.goto(url)
page.wait_for_load_state('networkidle')
# Check Private State Token API availability
token_check = page.evaluate("""
() => {
return {
documentHasPrivateToken: typeof document.privateToken !== 'undefined',
fetchHasPrivateToken: typeof fetch !== 'undefined' && 'privateToken' in Request.prototype
};
}
""")
print(f"\n2. Private State Token API check:")
print(f" document.privateToken available: {token_check.get('documentHasPrivateToken', False)}")
print(f" Fetch privateToken available: {token_check.get('fetchHasPrivateToken', False)}")
print("\n Note: Private State Tokens are managed by the browser")
print(" and cannot be directly read/modified for security reasons.")
print(" They are used for anti-fraud and privacy-preserving authentication.")
browser.close()
def selenium_private_state_tokens():
"""Access Private State Tokens with Selenium."""
print("\n" + "="*60)
print("SELENIUM: PRIVATE STATE TOKENS")
print("="*60)
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
try:
url = "https://quotes.toscrape.com/"
driver.get(url)
print(f"\n1. Opened: {url}")
# Check Private State Token API
token_check = driver.execute_script("""
return {
documentHasPrivateToken: typeof document.privateToken !== 'undefined',
fetchHasPrivateToken: typeof fetch !== 'undefined' && 'privateToken' in Request.prototype
};
""")
print(f"\n2. Private State Token API check:")
print(f" document.privateToken available: {token_check.get('documentHasPrivateToken', False)}")
print(f" Fetch privateToken available: {token_check.get('fetchHasPrivateToken', False)}")
print("\n Note: Private State Tokens are browser-managed and cannot")
print(" be directly accessed via automation for security reasons.")
finally:
driver.quit()
# ============================================================================
# EXTENSION STORAGE (Chrome Extension) - Advanced
# ============================================================================
def playwright_extension_storage():
"""Access Chrome Extension Storage with Playwright."""
print("\n" + "="*60)
print("PLAYWRIGHT: EXTENSION STORAGE")
print("="*60)
print("\n1. Extension Storage is accessed through Chrome Extension APIs.")
print(" To access extension storage, you need to:")
print(" - Load an unpacked extension")
print(" - Use extension context to access chrome.storage API")
with sync_playwright() as p:
# Note: Loading extensions requires specific setup
print("\n2. To load an extension with Playwright:")
print(" context = browser.new_context()")
print(" # Extension storage is accessible via chrome.storage API")
print(" # from within the extension's context, not from web pages")
print("\n Example extension context:")
print(" browser = p.chromium.launch_persistent_context(")
print(" user_data_dir='/path/to/profile',")
print(" headless=False,")
print(" args=['--disable-extensions-except=/path/to/ext']")
print(" )")
print("\n3. Extension storage types:")
print(" - chrome.storage.local: Persistent storage")
print(" - chrome.storage.sync: Synced across devices")
print(" - chrome.storage.session: Session-only storage")
print(" - chrome.storage.managed: Enterprise-managed")
def selenium_extension_storage():
"""Access Chrome Extension Storage with Selenium."""
print("\n" + "="*60)
print("SELENIUM: EXTENSION STORAGE")
print("="*60)
print("\n1. To access extension storage with Selenium:")
print(" chrome_options = Options()")
print(" chrome_options.add_extension('/path/to/extension.crx')")
print(" # or")
print(" chrome_options.add_argument('--load-extension=/path/to/unpacked')")
print("\n2. Extension storage is accessed via chrome.storage API")
print(" from within the extension's background/content scripts.")
print(" It cannot be directly accessed from web pages.")
print("\n3. To access extension storage programmatically:")
print(" - Use Chrome DevTools Protocol (CDP)")
print(" - Access via extension's background page")
print(" - Use chrome.storage.get() / chrome.storage.set()")
# ============================================================================
# MAIN EXECUTION
# ============================================================================
if __name__ == "__main__":
print("="*60)
print("BROWSER STORAGE ACCESS EXAMPLES")
print("="*60)
print("\nThis example demonstrates accessing:")
print(" 1. Local Storage")
print(" 2. Session Storage")
print(" 3. Extension Storage (info)")
print(" 4. IndexedDB")
print(" 5. Cookies")
print(" 6. Private State Tokens (info)")
print("\nUsing both Playwright and Selenium approaches.\n")
# Playwright examples
print("\n" + "="*60)
print("PLAYWRIGHT EXAMPLES")
print("="*60)
playwright_local_storage()
playwright_session_storage()
playwright_cookies()
playwright_indexeddb()
playwright_storage_state()
playwright_private_state_tokens()
playwright_extension_storage()
# Selenium examples
print("\n" + "="*60)
print("SELENIUM EXAMPLES")
print("="*60)
selenium_local_storage()
selenium_session_storage()
selenium_cookies()
selenium_indexeddb()
selenium_private_state_tokens()
selenium_extension_storage()
print("\n" + "="*60)
print("ALL EXAMPLES COMPLETED")
print("="*60)
print("\n💡 Key Points:")
print(" ✅ Local Storage: Persistent, domain-specific")
print(" ✅ Session Storage: Session-only, tab-specific")
print(" ✅ Cookies: Sent with HTTP requests, domain-specific")
print(" ✅ IndexedDB: NoSQL database in browser")
print(" ⚠️ Extension Storage: Requires extension context, not directly accessible")
print(" ⚠️ Private State Tokens: Browser-managed, security-protected")
print("\n Both Playwright and Selenium can access these storages,")
print(" but Playwright has better built-in support for storage state management.")
関連記事
01_selenium_basics.py
01_selenium_basics.py — python source code from the crawl learning materials (crawl/advanced/01_selenium_basics.py).
記事を読む →02_async_scraping.py
02_async_scraping.py — python source code from the crawl learning materials (crawl/advanced/02_async_scraping.py).
記事を読む →quotes_spider.py
quotes_spider.py — python source code from the crawl learning materials (crawl/advanced/03_scrapy_example/quotes_spider.py).
記事を読む →04_database_integration.py
04_database_integration.py — python source code from the crawl learning materials (crawl/advanced/04_database_integration.py).
記事を読む →05_selenium_headless.py
05_selenium_headless.py — python source code from the crawl learning materials (crawl/advanced/05_selenium_headless.py).
記事を読む →06_selenium_advanced_interactions.py
06_selenium_advanced_interactions.py — python source code from the crawl learning materials (crawl/advanced/06_selenium_advanced_interactions.py).
記事を読む →