HAR İle Dosya İsteklerinin Derlenmesi ve Analizi

Bir web sitesi yüklenme sürecinde statik ve dinamik olarak pek çok farklı formattan dosyanın arka planda indirilmesi esasına göre hareket etmektedir. Tarayıcının Network sekmesi aracılığı ile dosyaların hangi aşamada indirildiği, boyutu ve içeriği gibi bilgilerine ulaşmak mümkün. Bu dosyalar ayrıca formatlarına göre de gruplandırılabilmekte. Ancak, ilgili dosyaları tarayıcı dışında offline olarak inceleyebilmek ve/veya analiz edebilmek için genelde dosyaların tek tek indirilmekte veya Network alanı üzerinden değerlendirme yapılmakta. Bu yazıda alternatif bir yöntem olan HAR olarak isteklerin edinilmesinden bahsedeceğim.

AA

Görüntülenen bir web sayfası yüklenme sürecinde gerçekleştirilen istekleri (GET, POST, vb.) ve istekler neticesinde iletilen ve/veya dönen yanıtları Network aracılığı ile izleyebilmekteyiz.

Network Sinyalleri

İlgili istekleri genel olarak ya da belirli bir formata göre listeleyerek ilgili alan üzerine sağ tıkladığımızda karşımıza Save all as HAR with content seçeneği çıkar. Bu seçenek sayesinde ilgili istekler HAR formatında (*.har) bilgisayarımıza indirilebilmektedir. Aşağıda JS isteklerini içeren örnek bir HAR içeriği yer almaktadır.

Peki, HAR nedir?

HTTP Archive (HAR) Formatı

HTTP Archive (HAR), bir web tarayıcısının bir siteyle etkileşiminin günlüğe (logging) JSON biçiminde arşivlenerek kaydedilmesi sonucu oluşan bir dosya formatıdır. Bu arşiv ilgili isteklerle ilgili ayrıntılı performans verilerini (header, metadata, cookies, form data, vs.) içerir ve bu bilgiler dışa aktarılabilir1 2 3.

flowchart TD C[Log] C -->D[Creator] C -->E[Pages] C -->F[Entries]

Bu biçim, World Wide Web Konsorsiyumu'nun (W3C) Web Performansı Çalışma Grubu tarafından üretilmiştir ancak hiçbir zaman yayınlanmamıştır1.

Aşağıda JS isteklerini içeren örnek bir HAR arşiv içeriği yer almaktadır.

{
  "log": {
    "version": "1.2",
    "creator": {
      "name": "WebInspector",
      "version": "537.36"
    },
    "pages": [],
    "entries": [
      {
        "_initiator": {
          "type": "script",
          "stack": {
            "callFrames": [
              {
                "functionName": "send",
                "scriptId": "65",
                "url": "https://script.bugpilot.io/d1d055a0-ece1-4f91-9ac1-9ae73f43df0d/adopto.js",
                "lineNumber": 572,
                "columnNumber": 665
              },
              {
                "functionName": "Ta",
                "scriptId": "164",
                "url": "https://www.clarity.ms/s/0.7.7/clarity.js",
                "lineNumber": 1,
                "columnNumber": 40543
              },
              {
                "functionName": "",
                "scriptId": "164",
                "url": "https://www.clarity.ms/s/0.7.7/clarity.js",
                "lineNumber": 1,
                "columnNumber": 39956
              },
              {
                "functionName": "",
                "scriptId": "164",
                "url": "https://www.clarity.ms/s/0.7.7/clarity.js",
                "lineNumber": 1,
                "columnNumber": 7773
              },
              {
                "functionName": "",
                "scriptId": "164",
                "url": "https://www.clarity.ms/s/0.7.7/clarity.js",
                "lineNumber": 1,
                "columnNumber": 7878
              },
              {
                "functionName": "o",
                "scriptId": "164",
                "url": "https://www.clarity.ms/s/0.7.7/clarity.js",
                "lineNumber": 1,
                "columnNumber": 6595
              }
            ]
          }
        }
      }],
      // ...
  }
}

HAR dosyaları çeşitli araçlar aracılığı ile görüntülenebileceği4 5 gibi ilgili dosyaların (web sitesinin görüntülendiği süreçte gerçekleşen tüm etkileşimleri içerecek şekilde) indirilmesi için de kullanılabilmektedir6 7 8.

Network Sinyalleri

Github. "swiss-army-scripts". altında yayınladığım har-js-analyzer/js-file-downloader.py ile bir HAR dosyasında yer alan (örnek dosya bu işlemi JS formatlı dosyalar için gerçekleştirmekte) dosyaların indirilmesi sağlanabilmekte. har-js-analyzer/js-analyzer.py ile ise ilgili HAR içeriği için temel bir analiz gerçekleştirilebilmekte.

Temel HAR Analiz İşlemi

Örnek kod parçacığı JS dosyalarına ait istekleri içermekte ve analiz işlemi de yine bu dosyalar bağlamında gerçekleştirilmekte. Elbette dosya formatı değiştirilebileceği için format seçeneği kaldırılarak ilgili işlemler tüm istekler için gerçekleştirilebilir.

...

import json
from haralyzer import HarParser, HarPage

with open('har_data.har', 'r') as f:
    har_parser = HarParser(json.loads(f.read()))

print har_parser.browser
# {u'name': u'Firefox', u'version': u'25.0.1'}

print har_parser.hostname
# 'humanssuck.net'

for page in har_parser.pages:
    assert isinstance(page, HarPage, None)
    # returns True for each

har-image-analyzer.py dosyasında yer alan Python kod parçacığı ile entry sayısı, entry kapsamındaki sütunlar, isteklerle ilgili özet (min, max, mean, vb.) bilgiler, görsellerin isim ve boyutları gibi bilgilere ulaşabilir, görselleri gruplandırabilir ve toplam yüklenme sürelerini karşılaştırabilirsiniz.

  • Entry sayısı 38
  • Görsel isteği sayısı: 18
Dosya Adı Boyut
wikipedia.png 13444 B
100px-Salvador_Dal%C3%AD_1939.jpg 4674 B
150px-The_Simpsons_yellow_logo.svg.png 6716 B
100px-YuanEmperorAlbumKhubilaiPortrait.jpg 3038 B
68px-Ask_and_Embla_by_Robert_Engels.jpg 4934 B
250px-Sergei_Rachmaninoff_LOC_33969u.jpg 18170 B
48px-Notification-icon-Wikiquote.svg.png 1322 B
48px-Notification-icon-Wikisource-logo.svg.png 1784 B
48px-Notification-icon-Commons-logo.svg.png 960 B
48px-Notification-icon-Wiktionary-logo.svg.png 4270 B
48px-Notification-icon-Wikidata-logo.svg.png 568 B
48px-Notification-icon-Wikibooks-logo.svg.png 2770 B
48px-Notification-icon-Wikiversity-logo.svg.png 1813 B
48px-MediaWiki-2020-icon.svg.png 2890 B
48px-Notification-icon-Wikivoyage-logo.svg.png 628 B
48px-Notification-icon-Wikispecies-logo.svg.png 1680 B
48px-Notification-icon-Meta-logo.svg.png 2010 B
171px-Logo_original-t.png 9212 B
Dosya Adı İstek Sayısı Toplam Boyut Maksimum Yükleme Süresi Minimum Yükleme Süresi Ortalama Yükleme Süresi
wikipedia.png 1 13444 B 318.45 ms 318.45 ms 318.45 ms
100px-Salvador_Dal%C3%AD_1939.jpg 1 4674 B 522.38 ms 522.38 ms 522.38 ms
150px-The_Simpsons_yellow_logo.svg 1 4977 B 285.14 ms 285.14 ms 285.14 ms
220px-Leonhard_Euler_2.jpg 1 13595 B 308.75 ms 308.75 ms 308.75 ms
1200px-Manhattan_wikivoyage_banner.jpg 1 142069 B 1.25 s 1.25 s 1.25 s
2000px-BlankMap-World6.svg 1 171246 B 982.39 ms 982.39 ms 982.39 ms
1400px-Rubik's_cube.svg.png 1 182729 B 1.22 s 1.22 s 1.22 s
2000px-Map_of_the_world_by_the_US_Gov_as_of_2016.svg 1 710413 B 1.54 s 1.54 s 1.54 s