Striking Distance Finder
Find quick-win keywords ranking positions 5-19 that are missing from your on-page content.
#about
Filters keywords by configurable position range (default bounds 4 and 20, both exclusive, so positions 5-19 are kept) and minimum volume, then fetches live page content using trafilatura.
Extracts title, H1, and body copy via BeautifulSoup, normalises text (removes apostrophes/hyphens), and checks keyword presence.
Groups keywords by URL showing top 5 per page.
Streamlit app
- Platform
- Browser-based (no installation required)
- Input
- Keywords CSV with URL, volume, position
- Output
- CSV with page keywords and optimisation flags
- Category
- Search Console
Use cases
- Finding quick wins for on-page optimisation
- Identifying keywords missing from page titles and H1s
- Prioritising content updates based on search volume
#features
- Live body copy extraction via trafilatura, title and H1 via requests/BeautifulSoup
- Position sliders exclusive at both ends (defaults 4 and 20 keep positions 5-19)
- Minimum search volume slider (default 50)
- Case-insensitive substring matching after normalisation (apostrophes removed, hyphens to spaces)
- Top 5 keywords per URL by volume with boolean presence flags
- Drops a page entirely if any top keyword appears in title, H1 and copy
- Encoding auto-detection via chardet (UTF-16 handled)
#how-to-use
- Upload your keyword CSV (Ahrefs/SEMrush/GSC export)
- Map the keyword, URL, volume and position columns
- Adjust the position sliders (exclusive at both ends) and minimum volume
- Run analysis (fetches each unique URL live, two requests per URL)
- Review pages with keywords missing from title/H1/body
- Download CSV with presence flags for each on-page element
#faq
- What input file does it accept?
- Any keyword export with keyword, URL, search volume and position columns; you map the columns after upload, so Ahrefs, SEMrush or GSC exports all work. File encoding is auto-detected (UTF-16 files are read as whitespace-delimited) and Ahrefs' '0-10' volume band is converted to 0.
- Are positions 4 and 20 included with the default sliders?
- No. The filter drops rows at or below the minimum and at or above the maximum, so the default settings of 4 and 20 actually keep positions 5 to 19. Widen each slider by one notch if you want the boundary positions included.
- Why is the analysis slow, and why might it fail on the hosted app?
- Every unique URL is fetched live, twice: once with trafilatura for the body copy and once with requests/BeautifulSoup for the title and H1, with no delay between requests. Sites that block the Streamlit Cloud server's IP return nothing, which triggers the 'try whitelisting or running this app locally' message; running the app locally usually fixes it.
- How is 'keyword in title/H1/copy' decided?
- Case-insensitive substring matching after normalisation (apostrophes removed, hyphens replaced with spaces). Because it is substring based, 'ring' counts as present inside 'monitoring', and a reworded phrase counts as missing even if every individual word is on the page.
- Why did a page disappear from the results entirely?
- If any single one of a page's top five keywords is found in the title, H1 and copy, the entire row for that page is dropped, even when the other four keywords are missing everywhere. A fully optimised top keyword can therefore hide the remaining opportunities on the same page.
/contact
Want me to run this for you? I run this tool as a managed service, or build something custom around your data. You get the insights without touching the code.