Website: formharvester.com
FormHarvester is an AI-assisted form intelligence engine. It navigates the open web autonomously - executing searches, parsing page structure, extracting contact signals, and interacting with forms at the browser level. Built on async browser with stealth fingerprinting, proxy rotation, and a pluggable captcha solver interface.
Adjusting config.txt
mode
The CSV that will be used by the bot (e.g. mode = lawn will use lawn.csv)
max_google_pages
The CSV that will be used by the bot (e.g. mode = lawn will use lawn.csv)
skip_ads
FormHarvester will skip any ads on Google Search.
start_page
FormHarvester will start on X google page.
send_form
FormHarvester will send the form inside the website. It can be disabled to save time.
generate_email_sources
Generate an extra file showing the source URL where the email was extracted.
hide_browser
This setting will run the browser in headless mode and it will be hidden.
max_time
Max time FormHarvester can spend on a single website.
min_delay and max_delay
A random delay between min and max will be used for google.
captcha_sleep
Sleep for X minutes after a Google captcha is found. 0 to disable.
search_timer
A waiting time (in minutes) between the last google search and the next one.
[captcha]
Configure an automatic captcha solver. Set provider to deathbycaptcha,
2captcha, or none (blank auto-detects from whichever credentials you fill in):
[captcha]
provider = 2captcha
dbc_username =
dbc_password =
twocaptcha_api_key = your_2captcha_key
[dev]
Disable in production. They are used for development reasons. debug_form may be useful, as it prevents the form from submitting.
How to run
Executable
Download formharvester.exe
(built automatically on every release by .github/workflows/release-windows-exe.yml), then run it.
Python
pip install -e .
formharvester # runs the config-driven harvest loop (reads config.txt)
Programmatic use (library API)
Since 2.3.0 FormHarvester ships a library API so you can drive the engine from
your own code - no config.txt, input CSV or progress files required. The CLI
is unchanged.
from formharvester import FormHarvester, FormFillDetails, HarvesterOptions
details = FormFillDetails(
first_name="Jane", last_name="Doe",
email="jane@example.com", phone="1234567890",
subject="Enquiry", message="Hi, I'd like a quote.",
)
with FormHarvester(details, HarvesterOptions(send_form=True, headless=True)) as fh:
result = fh.harvest("https://acme.com")
print(result.status, result.submitted, result.emails)
for r in fh.harvest_many(["https://a.com", "https://b.com"]):
print(r.url, r.status)
result.status is one of SUBMITTED, FORM_NOT_FOUND, BUTTON_NOT_FOUND,
VISITED, or ERROR - the same tokens the CLI writes to its progress file.
One-shot helpers harvest_site(url, details) and harvest_sites(urls, details)
are also available.
Package layout (2.3.0)
src/formharvester/
├── __init__.py # public API (FormHarvester, FormFillDetails, …)
├── api.py # library API
├── engine/ # Selenium browser engine + Chrome driver
├── scraper/ # Google search + email scraping
├── form_handler/ # contact-page discovery, field fill, submit
├── captcha/ # solver providers (DeathByCaptcha, 2captcha) + detection
├── cli/ # config.txt loader + run loop (`formharvester` command)
└── utils/ # root-domain, email regex, link filters
Building the Windows executable (maintainers)
.github/workflows/release-windows-exe.yml builds formharvester.exe with PyInstaller and
attaches it to the GitHub Release for any pushed v* tag (also runnable manually via
workflow_dispatch). To build it locally:
uv sync --no-group dev
uv pip install pyinstaller
uv run pyinstaller --onefile --console --name formharvester packaging/windows_entry.py
Folder structure (runtime)
data
Where scraped emails and logs are dumped.
drivers
Browser drivers used by selenium.
input
Input CSV files go here.
log
This folder will report errors on websites, very useful to improve the bot.
This project is released under the MIT License. You are free to use, modify, and distribute this software, provided that the original copyright notice and license terms are included in all copies or substantial portions of the software.
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 formharvester-2.3.0.tar.gz.
File metadata
- Download URL: formharvester-2.3.0.tar.gz
- Upload date:
- Size: 837.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f2404c5b14441730297ee0bc109cefdd64e770ecb39b504075ac2723deb7bf7
|
|
| MD5 |
fe45b77009f5ec6cd7f9e3379a268f25
|
|
| BLAKE2b-256 |
e0388c085da2f85aef447bb0be67b54c3f109e2125e8fcbaf476b71c6df22b00
|
Provenance
The following attestation bundles were made for formharvester-2.3.0.tar.gz:
Publisher:
publish.yml on dariomory/formharvester
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
formharvester-2.3.0.tar.gz -
Subject digest:
4f2404c5b14441730297ee0bc109cefdd64e770ecb39b504075ac2723deb7bf7 - Sigstore transparency entry: 2217964593
- Sigstore integration time:
-
Permalink:
dariomory/formharvester@fca22c50361b739c5656ef4b1ea63d476e000fb7 -
Branch / Tag:
refs/tags/v.2.3.0 - Owner: https://github.com/dariomory
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fca22c50361b739c5656ef4b1ea63d476e000fb7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file formharvester-2.3.0-py3-none-any.whl.
File metadata
- Download URL: formharvester-2.3.0-py3-none-any.whl
- Upload date:
- Size: 31.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6e28f07e4d737849b0b256a1b54773be649ea6e7ff840482564c3eed9a37787
|
|
| MD5 |
40e9f721a98189417600972e0044b584
|
|
| BLAKE2b-256 |
30e72dbff554ce07f2a8ad2f2432297f5a2b71b56728339c26253bc28ee66fbf
|
Provenance
The following attestation bundles were made for formharvester-2.3.0-py3-none-any.whl:
Publisher:
publish.yml on dariomory/formharvester
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
formharvester-2.3.0-py3-none-any.whl -
Subject digest:
f6e28f07e4d737849b0b256a1b54773be649ea6e7ff840482564c3eed9a37787 - Sigstore transparency entry: 2217965030
- Sigstore integration time:
-
Permalink:
dariomory/formharvester@fca22c50361b739c5656ef4b1ea63d476e000fb7 -
Branch / Tag:
refs/tags/v.2.3.0 - Owner: https://github.com/dariomory
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fca22c50361b739c5656ef4b1ea63d476e000fb7 -
Trigger Event:
push
-
Statement type: