Kaptain.
Telegram /
LinkedIn /
Email /
GIT /
RSS /
GPG /
Заказ печатных плат

№ 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: God isn't dead, He's just trying to avoid the draft.
Leave a Reply