Skip to content

dimitryzub/seo-position-tracker

Repository files navigation

SEO Position Tracker 📡

A simple Python CLI and in-code SEO position tracking tool for Google and 6 other search engines.

This project uses SerpApi

SerpApi

Downloads licence

🔎 Current search engines support

  • Google Search - first 100 organic results.
  • Baidu Search - first 50 organic results.
  • Bing Search - first 50 organic results.
  • DuckDuckGo Search - up to 30 organic results.
  • Yahoo! Search - first 10 organic results.
  • Yandex Search - up to 15 organic results.
  • Naver Search - first 15 organic results.

⚙️Installation

$ pip install seo-position-tracker

Install from source:

Windows:

$ git clone https://github.com/dimitryzub/seo-position-tracking.git
$ cd seo-position-tracker/
$ python -m venv env
$ env/Scripts/activate
$ pip install poetry
$ poetry install
If you get an error
$ pip install chardet 
$ poetry install

🤹‍♂️Usage

$ seo -h
Available arugments
SerpApi SEO position tracker [-h] [-q] [-tk  [...]] [-tw  [...]] [-se  [...]] [-ak] [-hl] [-gl] [-loc] [-d] [-st]

A simple Python CLI for SEO position tracking from Google, Baidu, Bing, DuckDuckGo, Yahoo, Yandex and Naver.

optional arguments:
  -h, --help            show this help message and exit
  -q , --query          Search query. Default "coffee".
  -tk  [ ...], --target-keywords  [ ...]
                        Target keywords to track. Default "['coffee']".
  -tw  [ ...], --target-websites  [ ...]
                        Target websites to track. Default "['starbucks.com']".
  -se  [ ...], --search-engine  [ ...]
                        Choosing a search engine to track: "google", "baidu", "bing", "duckduckgo", "yahoo", "yandex", "naver". You can select multiple search engines. All search   
                        engines are selected by default.
  -ak , --api-key       Your SerpApi API key: https://serpapi.com/manage-api-key. Default is a test API key to test CLI.
  -hl , --lang          Language of the search. Supported only for "google", "baidu", "yahoo" and "yandex" engines. Default "None". Find more by Googling: "SerpApi supported        
                        <engine> languages"
  -gl , --country       Country of the search. Supported only for "google", "bing" and "yahoo" engines. Default "None". Find more by Googling: "SerpApi supported <engine>
                        countries"
  -loc , --location     Location of the search. Supported only for "google", "bing", "duckduckgo" and "yandex" engines. Default "None". Find more by Googling: "SerpApi supported    
                        <engine> locations"
  -d , --domain         Search engine domain to use. Supported only for "google", "yahoo" and "yandex" engines. Default "None". Find more by Googling: "SerpApi supported <engine>   
                        domains"
  -st , --save-to       Saves the results in the current directory in the selected format (CSV, JSON, TXT). Default CSV.


Found a bug? Open issue: https://github.com/dimitryzub/seo-position-tracker/issues

🤹‍♂️Examples

Extracting positions from all search engines for a given query with a target website and a target keyword:

$ seo --api-key=<your_serpapi_api_key> \
-q "minecraft" \
-tk official \
-tw minecraft.net
[
  {
    "engine": "google",
    "position": 1,
    "title": "Welcome to the Minecraft Official Site | Minecraft",
    "link": "https://www.minecraft.net/en-us"
  },
  {
    "engine": "bing",
    "position": 1,
    "title": "Minecraft - Official Site",
    "link": "https://minecraft.net/"
  },
  {
    "engine": "bing",
    "position": 2,
    "title": "Welcome to the Minecraft Official Site | Minecraft",
    "link": "https://www.minecraft.net/en-us"
  },
  {
    "engine": "bing",
    "position": 10,
    "title": "Minecraft Official Site | Minecraft Education",
    "link": "https://education.minecraft.net/en-us"
  },
  {
    "engine": "duckduckgo",
    "position": 1,
    "title": "Minecraft - Official Site",
    "link": "https://minecraft.net/"
  },
  {
    "engine": "duckduckgo",
    "position": 2,
    "title": "Welcome to the Minecraft Official Site | Minecraft",
    "link": "https://www.minecraft.net/en-us"
  },
  {
    "engine": "yahoo",
    "position": 1,
    "title": "Minecraft - Official Site",
    "link": "https://minecraft.net/"
  },
  {
    "engine": "yahoo",
    "position": 2,
    "title": "Welcome to the Minecraft Official Site | Minecraft",
    "link": "https://www.minecraft.net/en-us"
  },
  {
    "engine": "yandex",
    "position": 2,
    "title": "Welcome to the Minecraft Official Site | Minecraft",
    "link": "https://www.minecraft.net/"
  }
]

Extracting positions from 3 search engines with default arguments and saving to JSON:

$ seo --api-key=<your_serpapi_api_key> \
-se google bing duckduckgo \
-st JSON
[
  {
    "engine": "google",
    "position": 6,
    "title": "Starbucks Coffee Company",
    "link": "https://www.starbucks.com/"
  },
  {
    "engine": "bing",
    "position": 12,
    "title": "The Best Coffee from Starbucks Coffee: Starbucks Coffee Company",
    "link": "https://www.starbucks.com/coffee/"
  },
  {
    "engine": "duckduckgo",
    "position": 11,
    "title": "The Best Coffee from Starbucks Coffee: Starbucks Coffee Company",
    "link": "https://www.starbucks.com/coffee/"
  }
]

Extracting positions from one engine with all arguments for it:

$ seo --api-key=<your_serpapi_api_key> \
-q serpapi \
-tk serpapi \
-tw https://serpapi.com/ https://github.com/ \
-se google \
-hl de \
-gl de \
-loc Germany \
-d google.de \
-st TXT
[
  {
    "engine": "google",
    "position": 1,
    "title": "SerpApi: Google Search API",
    "link": "https://serpapi.com/"
  },
  {
    "engine": "google",
    "position": 3,
    "title": "SerpApi - GitHub",
    "link": "https://github.com/serpapi"
  }
]

Extracting positions from all search engines manually (without CLI):

from seo_position_tracker.seo_position_tracker import SeoPositionTracker
import json

tracker = SeoPositionTracker(
    query='coffee', 
    api_key='<your_serpapi_api_key>', 
    keywords=['coffee', 'starbucks'], 
    websites=['starbucks.com']
)

position_data = []

google_results = tracker.scrape_google(lang='en', country='us', location='United States', domain='google.com')
position_data.extend(google_results)

baidu_results = tracker.scrape_baidu(lang='1')
position_data.extend(baidu_results)

bing_results = tracker.scrape_bing(country='us', location='United States')
position_data.extend(bing_results)

duckduckgo_results = tracker.scrape_duckduckgo(location='us-en')
position_data.extend(duckduckgo_results)

yahoo_results = tracker.scrape_yahoo(lang='lang_en', country='us', domain='uk')
position_data.extend(yahoo_results)

yandex_results = tracker.scrape_yandex(lang='en', domain='yandex.com')
position_data.extend(yandex_results)

naver_results = tracker.scrape_naver()
position_data.extend(naver_results)

print(json.dumps(position_data, indent=2, ensure_ascii=False))

💡Issues or suggestions

Visit issues page.

📜 Licence

SEO Position Tracker is released under the BSD-3-Clause Licence.

About

A simple Python CLI and in-code SEO position tracking tool for Google and 6 other search engines.

Topics

Resources

License

Stars

Watchers

Forks

Languages