URL data analyzer and extractor. Detect malicious signs and other useful data associated with URLs.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

1002 lines
123 KiB

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# URL domain registrar variation analysis\n",
"\n",
"Author: Pekka Helenius, 2021\n",
"\n",
"- Analyzes given URLs and stores results into a new JSON data file\n",
"- Outputs associated domain registrars for each input URL as a plot\n",
" - \"Phishing campaigns register domains of websites from the same registrar (than the legitimate URL)\""
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"URL data: https://hoxhunt.com/\n",
"URL data: https://hs.fi\n",
"URL data: https://ts.fi\n",
"URL data: https://facebook.com\n",
"Generate statistics: https://hoxhunt.com/\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generate statistics: https://hs.fi\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 648x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generate statistics: https://ts.fi\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 648x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generate statistics: https://facebook.com\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 648x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#!/bin/env python\n",
"\n",
"\"\"\"\n",
"URL data extractor\n",
"\n",
"Pekka Helenius <pekka [dot] helenius [at] fjordtek [dot] com>\n",
"\n",
"Requirements:\n",
"\n",
"Python 3\n",
"Python 3 BeautifulSoup4 (python-beautifulsoup4)\n",
"Python 3 whois (python-whois; PyPI)\n",
"Python 3 JSON Schema (python-jsonschema)\n",
"Python 3 Numpy (python-numpy)\n",
"Python 3 matplotlib (python-matplotlib)\n",
"\n",
"TODO: URL domain part length comparison analysis\n",
"TODO: URL non-TLD part length comparison analysis\n",
" - in phishing webpages, URL tends to be much longer than legitimate webpages\n",
" however, domains themselves tend to be much shorter (without TLD)\n",
" - phishing URLs often contain more number of dots and subdomains than legitimate URLs\n",
" - legitimate: robots.txt redirects bots to a legitimate domain rather than to the original phishing domain\n",
"\n",
"TODO: Website visual similarity analysis\n",
"TODO: consistency of RDN usage in HTML data\n",
"\"\"\"\n",
"\n",
"######################################\n",
"\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from bs4 import BeautifulSoup as bs\n",
"from collections import Counter\n",
"from datetime import date, datetime\n",
"import json\n",
"import os\n",
"import re\n",
"import requests\n",
"from time import sleep\n",
"import urllib\n",
"from whois import whois\n",
"\n",
"# Target URLs\n",
"urls = [\n",
" \"https://hoxhunt.com/\",\n",
" \"https://hs.fi\",\n",
" \"https://ts.fi\",\n",
" \"https://facebook.com\"\n",
"]\n",
"\n",
"# Some web servers may block our request unless we set a widely used, well-known user agent string\n",
"request_headers = {\n",
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'\n",
"}\n",
"\n",
"# Date format for domain timestamps\n",
"dateformat = \"%Y/%m/%d\"\n",
"\n",
"# All webpages may not like fetching data too fast\n",
"# Sleep time in seconds\n",
"sleep_interval_between_requests = 0.5\n",
"\n",
"# Write JSON results to a file?\n",
"use_file = True\n",
"# Full file path + name\n",
"filename = os.getcwd() + \"/\" + \"url_info.json\"\n",
"\n",
"# Generate plot from existing JSON data?\n",
"plot_only = False\n",
"\n",
"# Save generated plot images?\n",
"save_plot_images = True\n",
"\n",
"# DPI of plot images\n",
"plot_images_dpi = 150\n",
"\n",
"# Common link attribute references in various HTML elements\n",
"link_refs = {\n",
" 'a': 'href',\n",
" 'img': 'src',\n",
" 'script': 'src'\n",
"}\n",
"\n",
"############################################################################\n",
"############################################################################\n",
"\n",
"class json_url_data(object):\n",
"\n",
"# def __init__(self):\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Set a new HTTP session and get response.\n",
"\n",
" Returns a requests.models.Response object.\n",
" \"\"\"\n",
" def set_session(self, url, method='get', redirects=True):\n",
" \n",
" # HTTP response status codes 1XX, 2XX and 3XX are OK\n",
" # Treat other codes as errors\n",
" sc = re.compile(r\"^[123]{1}[0-9]{2}\")\n",
" \n",
" sleep(sleep_interval_between_requests)\n",
" \n",
" try:\n",
" session = requests.Session()\n",
" response = session.request(method, url, headers=request_headers, allow_redirects=redirects)\n",
" \n",
" if not sc.match(str(response.status_code)):\n",
" raise Exception(\"Error: got invalid response status from the web server\")\n",
" return response\n",
" \n",
" except:\n",
" raise Exception(\"Error: HTTP session could not be established. URL: '\" + url + \"' (method: \" + method + \")\") from None\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Fetch HTML data.\n",
"\n",
" Returns a bs4.BeautifulSoup object.\n",
" \"\"\"\n",
" def get_html_data(self, url):\n",
" \n",
" try:\n",
" data = bs(self.set_session(url).content, 'html.parser')\n",
" return data\n",
" except:\n",
" raise Exception(\"Error: HTML data could not be retrieved\")\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Get URL redirects and related HTTP status codes.\n",
"\n",
" Returns a list object.\n",
" \"\"\"\n",
" def get_url_redirects(self, url):\n",
" \n",
" response = self.set_session(url)\n",
" list_data = []\n",
" \n",
" if response.history:\n",
" \n",
" for r in response.history:\n",
" list_data.append({'redirect_url': r.url, 'status': r.status_code})\n",
" \n",
" return list_data\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Extract title HTML element contents from given HTML data.\n",
"\n",
" Returns a string object.\n",
" \"\"\"\n",
" def get_webpage_title(self, url):\n",
" \n",
" html_data = self.get_html_data(url)\n",
" \n",
" title = html_data.title.string\n",
" return title\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Get WHOIS domain data.\n",
"\n",
" Returns a dict object.\n",
" \"\"\"\n",
" def get_whois_data(self, url):\n",
" dict_data = whois(url)\n",
" return dict_data\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Get domain name based on WHOIS domain data.\n",
" \"\"\"\n",
" def get_domain_name(self, url):\n",
" domain_name = self.get_whois_data(url).domain_name\n",
" \n",
" if type(domain_name) is list:\n",
" return domain_name[0].lower()\n",
" else:\n",
" return domain_name.lower()\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Get initial and final URLs\n",
" \n",
" Compare whether the final (destination) URL\n",
" matches with the initial URL in a request.\n",
" \n",
" Returns a dict object.\n",
" \"\"\"\n",
" def get_startfinal_urls(self, url):\n",
" \n",
" response = self.set_session(url)\n",
" end_url = response.url\n",
" \n",
" start_match = False\n",
" final_match = False\n",
" \n",
" # dr = re.compile(r\"^([a-z]+://)?([^/]+)\")\n",
" # dr_group_lastindex = dr.match(url).lastindex\n",
" # domain_name = dr.match(url).group(dr_group_lastindex)\n",
" \n",
" domain_name = self.get_domain_name(url)\n",
" \n",
" if re.search(domain_name, end_url):\n",
" final_match = True\n",
" \n",
" dict_data = {\n",
" 'startfinal_urls': {\n",
" 'start_url': {\n",
" 'url': url\n",
" },\n",
" 'final_url': {\n",
" 'url': end_url, 'domain_match': final_match\n",
" }\n",
" }\n",
" }\n",
" \n",
" return dict_data\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Get domain registrar\n",
" \n",
" Returns a dict object.\n",
" \"\"\"\n",
" def get_domain_registrar(self, url):\n",
" dict_data = {'domain_registrar': self.get_whois_data(url).registrar }\n",
" return dict_data\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Do comparison between the domain name, extracted\n",
" from WHOIS domain data and contents of a title HTML\n",
" element, extracted from HTML data based on a given URL.\n",
" \n",
" Returns a dict object.\n",
" \"\"\"\n",
" def get_domain_title_match(self, url):\n",
" \n",
" domain_name = self.get_domain_name(url)\n",
" title = self.get_webpage_title(url)\n",
" \n",
" # If is string:\n",
" if type(domain_name) is str:\n",
" if re.search(domain_name, title, re.IGNORECASE):\n",
" match = True\n",
" else:\n",
" match = False\n",
" \n",
" # If is list:\n",
" elif type(domain_name) is list:\n",
" for d in domain_name:\n",
" if re.search(d, title, re.IGNORECASE):\n",
" match = True\n",
" break\n",
" else:\n",
" match = False\n",
" else:\n",
" match = False\n",
" \n",
" dict_data = {\n",
" 'webpage_title': title,\n",
" 'domain_in_webpage_title': match\n",
" }\n",
" \n",
" return dict_data\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Get a single timestamp from given data\n",
" \n",
" Two scenarios are considered: dates argument is either\n",
" a list or a string. If it is a list, then we need\n",
" to decide which date value to extract.\n",
" \n",
" Returns a date object.\n",
" \"\"\"\n",
" def get_single_date(self, dates, newest=False):\n",
" \n",
" dates_epoch = []\n",
" \n",
" if type(dates) is list:\n",
" for d in dates:\n",
" dates_epoch.append(d.timestamp())\n",
" else:\n",
" dates_epoch.append(dates.timestamp())\n",
" \n",
" return datetime.fromtimestamp(sorted(dates_epoch, reverse=newest)[0])\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Get domain time information based on WHOIS domain data.\n",
" \n",
" Returns a dict object.\n",
" \"\"\"\n",
" def get_domain_timeinfo(self, url):\n",
" \n",
" whois_data = self.get_whois_data(url)\n",
" domain_creation_date = self.get_single_date(whois_data.creation_date, newest = False)\n",
" domain_updated_date = self.get_single_date(whois_data.updated_date, newest = False)\n",
" domain_expiration_date = self.get_single_date(whois_data.expiration_date, newest = False)\n",
" \n",
" dict_data = {\n",
" 'domain_timestamps':\n",
" {\n",
" 'created': domain_creation_date.strftime(dateformat),\n",
" 'updated': domain_updated_date.strftime(dateformat),\n",
" 'expires': domain_expiration_date.strftime(dateformat)\n",
" }\n",
" }\n",
" \n",
" return dict_data\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Get domain time information based on WHOIS domain data,\n",
" relative to the current date (UTC time).\n",
" \n",
" Returns a dict object.\n",
" \"\"\"\n",
" def get_domain_timeinfo_relative(self, url):\n",
" \n",
" date_now = datetime.utcnow()\n",
" \n",
" whois_data = self.get_whois_data(url)\n",
" domain_creation_date = self.get_single_date(whois_data.creation_date, newest = False)\n",
" domain_updated_date = self.get_single_date(whois_data.updated_date, newest = False)\n",
" domain_expiration_date = self.get_single_date(whois_data.expiration_date, newest = False)\n",
" \n",
" dict_data = {\n",
" 'domain_timestamps_relative':\n",
" {\n",
" 'current_date': (date_now.strftime(dateformat)),\n",
" 'created_days_ago': (date_now - domain_creation_date).days,\n",
" 'updated_days_ago': (date_now - domain_updated_date).days,\n",
" 'expires_days_left': (domain_expiration_date - date_now).days\n",
" }\n",
" }\n",
" \n",
" return dict_data\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Determine whether URL matches syntaxes such as\n",
" '../foo/bar/'\n",
" '/foo/../../bar/,\n",
" 'https://foo.bar/foo/../'\n",
" \n",
" etc.\n",
" \n",
" Returns a boolean object.\n",
" \"\"\"\n",
" def is_multidot_url(self, url):\n",
" \n",
" multidot = re.compile(r\".*[.]{2}/.*\")\n",
" \n",
" if multidot.match(url):\n",
" return True\n",
" return False\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Get HTML element data from HTML data contents.\n",
" \n",
" Two fetching methods are supported:\n",
" - A) use only HTML element/tag name and extract raw contents of\n",
" these tags\n",
" - B) use both HTML element/tag name and more fine-grained\n",
" inner attribute name to determine which HTML elements are extracted\n",
" \n",
" Special case - URL link references:\n",
" - attributes 'href' or 'src' are considered as link referrals and \n",
" they are handled in a special way\n",
" - A) link referrals to directly to domain are placed in 'self_refs' list\n",
" (patterns: '/', '#', '../' and '/<anything>')\n",
" - B) link referrals to external domains are placed in 'ext_refs' list\n",
" (patterns such as 'https://foo.bar.dot/fancysite' etc.)\n",
" \n",
" - Both A) and B) link categories have 'normal' and 'multidot' subcategories\n",
" - normal links do not contain pattern '../'\n",
" - multidot links contain '../' pattern\n",
" \n",
" Returns a dict object.\n",
" \"\"\"\n",
" \n",
" def get_tag_data(self, url, tag, attribute=None):\n",
" \n",
" html_data = self.get_html_data(url)\n",
" domain_name = self.get_domain_name(url)\n",
" data = []\n",
" \n",
" if attribute != None:\n",
" \n",
" for d in html_data.find_all(tag):\n",
" \n",
" # Ignore the HTML tag if it does not contain our attribute\n",
" if d.get(attribute) != None:\n",
" data.append(d.get(attribute))\n",
" \n",
" if attribute == 'href' or attribute == 'src':\n",
" \n",
" self_refs = { 'normal': [], 'multidot': []}\n",
" ext_refs = { 'normal': [], 'multidot': []}\n",
" \n",
" # Syntax: '#<anything>', '/<anything>', '../<anything>'\n",
" rs = re.compile(r\"^[/#]|^[.]{2}/.*\")\n",
" \n",
" # Syntax: '<text>:<text>/'\n",
" rd = re.compile(r\"^[a-z]+:[a-z]+/\")\n",
" \n",
" # Syntax examples:\n",
" # 'http://foo.bar/', 'https://foo.bar/, 'foo.bar/', 'https://virus.foo.bar/'\n",
" rl = re.compile(r\"^([a-z]+://)?([^/]*\" + domain_name + \"/)\")\n",
" \n",
" for s in data:\n",
" \n",
" # Ignore mailto links\n",
" if re.match(\"^mailto:\", s): continue\n",
" \n",
" if rs.match(s) or rl.match(s) or rd.match(s):\n",
" if self.is_multidot_url(s):\n",
" self_refs['multidot'].append(s)\n",
" else:\n",
" self_refs['normal'].append(s)\n",
" else:\n",
" \n",
" if self.is_multidot_url(s):\n",
" try:\n",
" ext_refs['multidot'].append({'url': s, 'registrar': self.get_whois_data(s).registrar })\n",
" except:\n",
" # Fallback if WHOIS query fails\n",
" ext_refs['normal'].append({'url': s, 'registrar': None })\n",
" pass\n",
" else:\n",
" try:\n",
" ext_refs['normal'].append({'url': s, 'registrar': self.get_whois_data(s).registrar })\n",
" except:\n",
" ext_refs['normal'].append({'url': s, 'registrar': None })\n",
" pass\n",
" \n",
" data = None\n",
" \n",
" dict_data = {\n",
" tag: {\n",
" attribute + '_ext': (ext_refs),\n",
" attribute + '_self': (self_refs)\n",
" }\n",
" }\n",
" \n",
" else:\n",
" dict_data = {\n",
" tag: {\n",
" attribute: (data)\n",
" }\n",
" }\n",
" \n",
" else:\n",
" for d in html_data.find_all(tag):\n",
" data.append(d.prettify())\n",
" \n",
" dict_data = {\n",
" tag: (data)\n",
" }\n",
" \n",
" return dict_data\n",
"\n",
"######################################\n",
" \"\"\"\n",
" How many external URL links have same registrar than\n",
" the webpage itself?\n",
" \"\"\"\n",
" def get_registrar_count(self, registrar, urls):\n",
" \n",
" i = 0\n",
" \n",
" for u in urls:\n",
" for k,v in u.items():\n",
" if k == 'registrar' and v == registrar:\n",
" i += 1\n",
" \n",
" o = len(urls) - i\n",
" \n",
" dict_data = {\n",
" 'same_registrar_count': i,\n",
" 'other_registrar_count': o\n",
" }\n",
" \n",
" return dict_data\n",
"\n",
"######################################\n",
"\n",
" \"\"\"\n",
" Get values existing in a dict object,\n",
" based on a known key string.\n",
" \n",
" Returns a list object.\n",
" \n",
" TODO: Major re-work for the fetch function\n",
"\n",
" TODO: Support for more sophisticated JSON key string filtering\n",
" (possibility to use multiple keys for filtering)\n",
" \"\"\"\n",
" class json_fetcher(object):\n",
"\n",
" def __init__(self, dict_data, json_key):\n",
" self.json_dict = json.loads(json.dumps(dict_data))\n",
" self.json_key = json_key\n",
"\n",
" ##########\n",
" # Ref: https://www.codespeedy.com/how-to-loop-through-json-with-subkeys-in-python/\n",
" def fetch(self, jdata):\n",
"\n",
" if isinstance(jdata, dict):\n",
"\n",
" for k,v in jdata.items():\n",
" if k == self.json_key:\n",
" yield v\n",
" elif isinstance(v, dict):\n",
" for val in self.fetch(v):\n",
" yield val\n",
" elif isinstance(v, list):\n",
" for l in v:\n",
" if isinstance(l, dict):\n",
" for ka,va in l.items():\n",
" if ka == self.json_key:\n",
" yield va\n",
"\n",
" elif isinstance(jdata, list):\n",
" for l in jdata:\n",
" if isinstance(l, dict):\n",
" for k,v in l.items():\n",
" if k == self.json_key:\n",
" yield v\n",
" elif isinstance(l, list):\n",
" for lb in v:\n",
" for ka,va in lb.items():\n",
" if ka == self.json_key:\n",
" yield va\n",
"\n",
" ##########\n",
" def get_data(self, flatten=True):\n",
"\n",
" data_extract = []\n",
" flat_data = []\n",
"\n",
" for i in self.fetch(self.json_dict):\n",
" data_extract.append(i)\n",
"\n",
" # Flatten possible nested lists\n",
" # (i.e. JSON data contains multiple keys in\n",
" # different nested sections)\n",
" def get_data_extract(ld):\n",
" for l in ld:\n",
" if isinstance(l, list):\n",
" for la in get_data_extract(l):\n",
" yield la\n",
" else:\n",
" yield l\n",
"\n",
" if flatten == True:\n",
" for u in get_data_extract(data_extract):\n",
" flat_data.append(u)\n",
" \n",
" return flat_data\n",
" else:\n",
" return data_extract\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Compile URL related data.\n",
" \"\"\"\n",
" def get_url_data(self, url):\n",
" \n",
" # Dict object for simple, non-nested data\n",
" data_simple = {}\n",
"\n",
" # Pre-defined dict object for specific data sets\n",
" webpage_data = {}\n",
" \n",
" startfinal_url = self.get_startfinal_urls(url)\n",
" redirect_url = self.get_url_redirects(url)\n",
" domain_registrar = self.get_domain_registrar(url)\n",
" domaintitle_match = self.get_domain_title_match(url)\n",
" \n",
" domain_time_relative = self.get_domain_timeinfo_relative(url)\n",
" domain_time = self.get_domain_timeinfo(url)\n",
" \n",
" html_element_iframe = self.get_tag_data(url, 'iframe')\n",
" html_element_a_href = self.get_tag_data(url, 'a', link_refs['a'])\n",
" html_element_img_src = self.get_tag_data(url, 'img', link_refs['img'])\n",
" html_element_script_src = self.get_tag_data(url, 'script', link_refs['script'])\n",
"\n",
" iframes_count = {\n",
" 'iframes_count':\n",
" len(self.json_fetcher(html_element_iframe, 'iframe').get_data())\n",
" }\n",
" \n",
" multidot_urls_count = {\n",
" 'multidot_url_count':\n",
" len(self.json_fetcher(html_element_a_href, 'multidot').get_data()) + len(self.json_fetcher(html_element_img_src, 'multidot').get_data()) + len(self.json_fetcher(html_element_script_src, 'multidot').get_data())\n",
" }\n",
" \n",
" ###################\n",
" def get_total_registrars():\n",
"\n",
" same_registrar_counts = 0\n",
" other_registrar_counts = 0\n",
" for k,v in link_refs.items():\n",
" \n",
" html_element = self.get_tag_data(url, k, v)\n",
" \n",
" same_registrar_counts += self.get_registrar_count(\n",
" domain_registrar['domain_registrar'],\n",
" html_element[k][v + '_ext']['normal']\n",
" )['same_registrar_count']\n",
" \n",
" other_registrar_counts += self.get_registrar_count(\n",
" domain_registrar['domain_registrar'],\n",
" html_element[k][v + '_ext']['normal']\n",
" )['other_registrar_count']\n",
" \n",
" registrar_counts = {\n",
" 'same_registrar_count': same_registrar_counts,\n",
" 'other_registrar_count': other_registrar_counts\n",
" }\n",
" return registrar_counts\n",
" \n",
" # Avoid unnecessary nesting of the following data\n",
" data_simple.update(domain_registrar)\n",
" data_simple.update(domaintitle_match)\n",
" data_simple.update(iframes_count)\n",
" data_simple.update(multidot_urls_count)\n",
" data_simple.update(get_total_registrars())\n",
" \n",
" url_data = dict({\n",
" url: [\n",
" data_simple,\n",
" startfinal_url,\n",
" {'redirects': redirect_url},\n",
" \n",
" domain_time_relative,\n",
" domain_time,\n",
" \n",
" {'webpage_data': [\n",
" html_element_iframe,\n",
" html_element_a_href,\n",
" html_element_img_src,\n",
" html_element_script_src\n",
" ]\n",
" }\n",
" ]\n",
" })\n",
" \n",
" return url_data\n",
"\n",
"\n",
"\n",
"class write_operations(object):\n",
"\n",
" def __init__(self):\n",
" self.filename = filename\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Set JSON file name, append number suffix\n",
" # if file exists already.\n",
" \n",
" Returns file name path.\n",
" \"\"\"\n",
" def set_filename(self):\n",
" \n",
" c = 0\n",
" while True:\n",
" if os.path.exists(self.filename):\n",
" if c == 0:\n",
" self.filename = self.filename + \".\" + str(c)\n",
" else:\n",
" self.filename = re.sub(\"[0-9]+$\", str(c), self.filename)\n",
" else:\n",
" break\n",
" c += 1\n",
" return self.filename\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Append to a JSON file.\n",
" \"\"\"\n",
" def write_to_file(self, data):\n",
" \n",
" try:\n",
" json_file = open(self.filename, \"a\")\n",
" json_file.write(data)\n",
" json_file.close()\n",
" return 0\n",
" except:\n",
" return 1\n",
"\n",
"######################################\n",
" \"\"\"\n",
" Fetch all pre-defined URLs.\n",
" \"\"\"\n",
" def fetch_and_store_url_data(self, urls, use_file):\n",
"\n",
" data_parts = {}\n",
" fetch_json_data = json_url_data()\n",
"\n",
" for u in urls:\n",
" print(\"URL data: %s\" % u)\n",
" try:\n",
" data_parts.update(fetch_json_data.get_url_data(u))\n",
" except:\n",
" print(\"Failed: %s\" % u)\n",
" pass\n",
"\n",
" json_data = json.dumps(data_parts)\n",
"\n",
" if use_file == True:\n",
" self.write_to_file(json_data)\n",
"\n",
" return json_data\n",
"\n",
"######################################\n",
"\"\"\"\n",
"Visualize & summarize data.\n",
"\"\"\"\n",
"\n",
"class data_visualization(object):\n",
"\n",
" def __init__(self, url, json_data):\n",
" self.url = url\n",
" self.json_data = json_data\n",
"\n",
" self.data = json.loads(json.dumps(self.json_data)).get(self.url)\n",
" self.json_url_obj = json_url_data()\n",
" self.domain_registrar = self.json_url_obj.get_domain_registrar(self.url)['domain_registrar']\n",
" self.webpage_data = self.json_url_obj.json_fetcher(self.data, 'webpage_data').get_data()\n",
"\n",
" def get_urls_count_summary(self):\n",
"\n",
" unique_refs = []\n",
"\n",
" for k,v in link_refs.items():\n",
" if v in unique_refs: continue\n",
" unique_refs.append(v)\n",
"\n",
" def link_count(refs, suffix):\n",
"\n",
" urls_cnt = 0\n",
"\n",
" for u in self.webpage_data:\n",
" for l in refs:\n",
" urls = self.json_url_obj.json_fetcher(u, l + suffix).get_data()\n",
" for n in urls:\n",
" urls_cnt += len(n['normal'])\n",
" urls_cnt += len(n['multidot'])\n",
" return urls_cnt\n",
"\n",
" data = {\n",
" 'local_urls': link_count(unique_refs, '_self'),\n",
" 'external_urls': link_count(unique_refs, '_ext')\n",
" }\n",
" \n",
" return data\n",
"\n",
" def get_registrars(self):\n",
"\n",
" registrars = []\n",
" #registrars.append(self.domain_registrar)\n",
"\n",
" for w in self.webpage_data:\n",
" webpage_registrars = self.json_url_obj.json_fetcher(w, 'registrar').get_data()\n",
" for wa in webpage_registrars:\n",
" if wa != None:\n",
" registrars.append(wa)\n",
" return registrars\n",
"\n",
" def get_registrar_count_summary(self):\n",
" \n",
" domain_counter = dict(Counter(self.get_registrars()))\n",
" data = {'fetched_domains': domain_counter, 'url_domain_registrar': self.domain_registrar }\n",
" return data\n",
"\n",
"######################################\n",
"\"\"\"\n",
"Execute the main program code.\n",
"\n",
"TODO: this code must figure out the correct JSON file\n",
"if multiple generated files are present.\n",
"\"\"\"\n",
"if __name__ == '__main__':\n",
"\n",
" if plot_only == False:\n",
" write_obj = write_operations()\n",
" write_obj.set_filename()\n",
" data = write_obj.fetch_and_store_url_data(urls, use_file)\n",
"\n",
" url_str_pattern = re.compile(r\"(^[a-z]+://)?([^/]*)\")\n",
"\n",
" if os.path.exists(filename):\n",
" with open(filename, \"r\") as json_file:\n",
" json_data = json.load(json_file)\n",
" else:\n",
" json_data = data\n",
"\n",
" # Get URLs from an available JSON data\n",
" for key_url in json_data.keys():\n",
" \n",
" print(\"Generate statistics: %s\" % key_url)\n",
"\n",
" fig = plt.figure()\n",
" fig_params = {\n",
" 'xtick.labelsize': 8,\n",
" 'figure.figsize': [9,8]\n",
" # 'figure.constrained_layout.use': True\n",
" }\n",
" plt.rcParams.update(fig_params)\n",
" \n",
" domain_string = url_str_pattern.split(key_url)[2].replace('.','')\n",
" summary = data_visualization(key_url, json_data)\n",
" \n",
" summary_registrars = summary.get_registrar_count_summary()['fetched_domains']\n",
"\n",
" x_r = list(summary_registrars.keys())\n",
" y_r = list(summary_registrars.values())\n",
" \n",
" # Show bar values\n",
" for index,data in enumerate(y_r):\n",
" plt.text(x=index, y=data+0.5, s=data, fontdict=dict(fontsize=8))\n",
" \n",
" title_r = \"Domains associated with HTML URL data (\" + key_url + \")\"\n",
" xlabel_r = \"Fetched domains\"\n",
" ylabel_r = \"Domain count\"\n",
"\n",
" plt.bar(x_r, y_r, color=\"green\", edgecolor=\"black\")\n",
" plt.title(title_r)\n",
" plt.xlabel(xlabel_r)\n",
" plt.ylabel(ylabel_r)\n",
" plt.xticks(rotation=45, horizontalalignment=\"right\")\n",
"\n",
" if save_plot_images == True:\n",
" plt.savefig(os.getcwd() + \"/\" + \"domain_figure_\" + domain_string + \".png\", dpi=plot_images_dpi)\n",
" plt.show()\n",
"\n",
" #fig_u = plt.figure()\n",
" \n",
" #summary_urls = summary.get_urls_count_summary()\n",
" \n",
" #x_u = list(summary_urls.keys())\n",
" #y_u = list(summary_urls.values())\n",
" #title_u = \"Local and external URL references (\" + key_url + \")\"\n",
" #xlabel_u = \"Fetched URLs\"\n",
" #ylabel_u = \"URL count\"\n",
" \n",
" #plt.bar(x_u, y_u, color=\"blue\", edgecolor='black')\n",
" #plt.title(title_u)\n",
" #plt.xlabel(xlabel_u)\n",
" #plt.ylabel(ylabel_u)\n",
" #plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Analysis\n",
"\n",
"| Website | Analysis | Top registrars |\n",
"|--------------|--------------------------------------------------------------------------------|----------------------------------------|\n",
"| HoxHunt | Great variation of different registrars | `MarkMonitor Inc.`, `CloudFlare Inc.` |\n",
"| HS.fi | Average variation of different registrars, relies mostly on its own registrar | `Sanoma` |\n",
"| TS.fi | Great variation of different registrars, uses mostly its own regisrtrar | `TS-Yhtymä Oy` |\n",
"| Facebook | Very low variation of different registrars, relies on a single regisrtrar | `RegistrarSafe LLC` |"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}