headless-driver
Lightweight Python package to manage Selenium WebDriver in headless mode with proxy support, stealth tweaks, auto-driver installation, multi-driver management, download handling, and advanced search-scraping utilities
Features
- Headless and non-headless Chrome management
- Temporary or persistent user-data directories (profiles)
- HTTP and SOCKS proxy support
- Optional stealth mode (integrates with selenium-stealth when available)
- Automatic ChromeDriver install (via webdriver-manager) as an optional dependency
- Download folder management and automatic cleanup
- Screenshot and PDF export via Chrome DevTools
- Multi-driver manager to run many isolated browser instances
- Advanced search scraper (DuckDuckGo default) with title, snippet, favicon, cached link, and batch search/export support
Installation
pip install headless-driver
Usage
from headless import Headless
hl = Headless()
driver = hl.get_driver()
driver.get("https://example.com")
print(driver.title)
hl.quit()
Or use as a context manager:
from headless import Headless
with Headless() as driver:
driver.get("https://example.com")
print(driver.title)
Search
from headless import SearchScraper, Headless
hl = Headless()
driver = hl.get_driver()
scraper = SearchScraper(driver=driver, max_results=5)
results = scraper.search("Nuhman PK github")
print(results)
Stealth
from headless import ExtendedHeadless
hl = ExtendedHeadless(stealth=True)
driver = hl.get_driver()
driver.get("https://example.com")
print(driver.title)
hl.quit()
Proxy
from headless import ExtendedHeadless
hl = ExtendedHeadless(proxy="socks5://127.0.0.1:9050")
driver = hl.get_driver()
driver.get("https://example.com")
print(driver.title)
hl.quit()
Take Screen / Export PDF
from headless import ExtendedHeadless
hl = ExtendedHeadless(download_dir="/tmp/hd_downloads")
d = hl.get_driver()
d.get("https://example.com")
hl.screenshot("/tmp/example.png")
hl.save_pdf("/tmp/example.pdf")
hl.quit()
Auto Install Driver
from headless import ExtendedHeadless
hl = ExtendedHeadless(auto_install=True)
d = hl.get_driver()
d.get("https://example.com")
hl.screenshot("/tmp/example.png")
hl.save_pdf("/tmp/example.pdf")
hl.quit()
Multi driver manager
from headless import MultiDriverManager
mgr = MultiDriverManager()
a = mgr.create("bot1", stealth=True, auto_install=True)
b = mgr.create("bot2", proxy="http://1.2.3.4:3128", download_dir="/tmp/d2", auto_install=True)
da = a.get_driver()
db = b.get_driver()
mgr.quit_all()
Advanced scraper
from headless import AdvancedSearchScraper
# search_engine: "duckduckgo" (default), "bing" or "google"
scr = AdvancedSearchScraper(headless_options={"headless": True}, max_results=5)
res = scr.search("python headless")
batch = scr.search_batch(["python headless", "selenium stealth"], max_workers=2)
scr.export("results.json") # .json and .csv are supported
scr.quit()
Search engines defend aggressively against automation. When one serves a bot
check instead of results, search() reports the block and returns an empty
list; Google does this to headless browsers on most networks.
API Documentation
Headless class
Headless(
user_data_dir: Optional[str] = None,
window_size: Tuple[int, int] = (1920, 1080),
user_agent: Optional[str] = None,
headless: bool = True,
chrome_driver_path: Optional[str] = None,
additional_args: Optional[List[str]] = None,
remote_url: Optional[str] = None,
verbose: bool = False,
)
user_data_dir: Path for Chrome user data (temporary if not provided)window_size: Browser window size (default: 1920x1080)user_agent: Custom user agent stringheadless: Run Chrome in headless mode (default: True)chrome_driver_path: Path to chromedriver executable. When omitted, one is auto-detected on PATH and common install locations; if that driver turns out to mismatch the installed Chrome, a matching one is downloaded automaticallyadditional_args: List of extra Chrome argumentsremote_url: Use remote Selenium server if providedverbose: Print driver setup and teardown diagnostics
Methods
get_driver(): Returns a Selenium WebDriver instancequit(): Quits the driver and cleans up user data
Install Driver on Linux
sudo apt update
sudo apt install -y chromium chromium-driver
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file headless_driver-0.2.0.tar.gz.
File metadata
- Download URL: headless_driver-0.2.0.tar.gz
- Upload date:
- Size: 17.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba1db5d452eb4a800b6cdbaa2bc03038468697379e892b60724c891eed243029
|
|
| MD5 |
cf2b27560941f1ed2f6679b290600728
|
|
| BLAKE2b-256 |
52278dacb50b71aad91fde04311c8374afa572483b12acda849fff9884acaf9f
|
File details
Details for the file headless_driver-0.2.0-py3-none-any.whl.
File metadata
- Download URL: headless_driver-0.2.0-py3-none-any.whl
- Upload date:
- Size: 14.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec344229616d571e9a005695bafe3abbe293d20ce9d33717661c3160f92d9557
|
|
| MD5 |
f75a5f43c3e79c0e87aca74a7509a70a
|
|
| BLAKE2b-256 |
209435b4b82f78ea3b1829ec19a1b4015c46d2ba7144f193e69e539ea21ad18b
|