№ 9012 В разделах: Programming
Sysadmin
от May 24th, 2018,
В подшивках: Browser, Headless browser, Python, Splash
Появилась задача, которая потребовала проверки сайтов на запрос по определенному урлу. Зачем это надо? Например, для рекламщиков, собирающих информацию о покупателях в интернет магазинах. Они вешают маленький яваскрипт, прячут его всячески и т.д. и код работает, собирая информацию о действиях пользователя на сайте. В случае проблем или недобросовестности партнеров код могут снять без предупреждения. Так вот задача отследить момент снятия кода с партнерского сайта. Код многих партнерских страниц оказался обфусцирован и простые методы не работали. Первая же мысль загрузить страницу в какой-то виртуальный браузер и проанализировать запросы. К тому моменту я еще не был знаком с headless браузерами и поэтому первый же возникший у меня вопрос: “как, черт возьми, я это сделаю?”. Начался процесс гугления и вопросов у коллег и таки нашлись люди, которые уже делали подобное. Оно так и называлось Headless Browsers Изучение доки привело меня к использованию Splash как наиболее приемлемого варианта. Скажу сразу, не долбайтесь с ручной установкой, это адский геморрой, который я так и не завершил, задолбался бороться с ошибками. Ставьте из репов пакет
docker.io
и забирайте докер образ к себе, в доке Splash написано как.
После запуска контейнера у вас сразу появляется возможность с ним работать прямо из консоли, это чертовски удобно. Однако, я с ним работать буду из python, поэтому пример будет на нём. Поскольку мы ленивые и еще куча работы ждет, то используем requests, указываем где наш сервер, что за запросы мы ищем и на каких урлах. Пока всё легко.
import requests searchServer = "http://127.0.0.1:8050" searchForRequests = { 'leadslabpixels.net': ['/tm.js', '/tag_manager.js'] } searchURLs = [ 'https://online.renins.com/buy/auto/#edit/new/data', 'http://nevatowers.ru', 'http://novogradpavlino.ru', 'http://m.uprimskiy.ru/' ]
Обращаться будем к API вызову render.har. Он подобно отладчику из Firefox вернет все запросы и тайминги, которые были во время работы скрипта.
Начинаем перебор по всем урлам, которые надо проверить, обращаемся по ним к har и получаем ответ. Обязательно перед каждым запросом чистим кеш вызовом _gc
.
for pageUrl in searchURLs: print("Checking", pageUrl) print(requests.post(searchServer+"/_gc").text) pageUrlRequest = searchServer+"/render.har?url="+ quote(pageUrl) print(pageUrlRequest) r = requests.get(pageUrlRequest) answer = r.json()
Начинаем перебор по всем запросам, которые произошли во время загрузки и ищем те, в которых есть наш сервер с нужным скриптом.
for requestUrl in answer['log']['entries']: url = requestUrl['response']['url'] for uSFR, aSFR in searchForRequests.items(): if uSFR in url: print(url) print("Found domain match") for scriptName in aSFR: if scriptName in url: print("Found request match")
Получается вот такая интересная вундервафля. Вызываете по крону, приделываете уведомления по почте и на продакшен.
Репозиторий с кодом https://git.blindage.org/21h/splash-browser-url-checker
Fortune cookie: Today's spam: BlG T_|_T_S h@rdc0re pics and m0vles!
Leave a Reply