Используя Python / Selenium / Лучший инструмент для задания получения URI запросов изображений, сгенерированных с помощью JavaScript?
-
19-09-2019 - |
Вопрос
У меня есть некоторый JavaScript от стороннего поставщика, который инициирует запрос изображения.Я хотел бы выяснить URI этого запроса на изображение.
Я могу загрузить страницу в свой браузер, а затем отслеживать "Текущие HTTP-заголовки" или "Данные несанкционированного доступа", чтобы определить URI запроса изображения, но я бы предпочел создать для этого процесс командной строки.
Моя интуиция подсказывает, что это могло бы быть возможно с помощью python + qtwebkit, но, возможно, есть способ получше.
Чтобы прояснить:У меня могло бы быть это (чрезмерно упрощенный код).
<script>
suffix = magicNumberFunctionIDontHaveAccessTo();
url = "http://foobar.com/function?parameter=" + suffix
img = document.createElement('img'); img.src=url; document.all.body.appendChild(img);
</script>
Затем, как только страница будет загружена, я смогу найти URL-адрес, прослушав пакеты.Но я не могу просто выяснить это из источника, потому что я не могу предсказать результат magicNumberFunction ...().
Любая помощь была бы очень признательна!
Спасибо.
Решение 4
В конечном счете, я сделал это на python, используя Selenium-RC.Для этого решения требуются файлы python для selenium-rc, и вам необходимо запустить java-сервер ("java -jar selenium-server.jar")
from selenium import selenium
import unittest
import lxml.html
class TestMyDomain(unittest.TestCase):
def setUp(self):
self.selenium = selenium("localhost", \
4444, "*firefox", "http://www.MyDomain.com")
self.selenium.start()
def test_mydomain(self):
htmldoc = open('site-list.html').read()
url_list = [link for (element, attribute,link,pos) in lxml.html.iterlinks(htmldoc)]
for url in url_list:
try:
sel = self.selenium
sel.open(url)
sel.select_window("null")
js_code = '''
myDomainWindow = this.browserbot.getUserWindow();
for(obj in myDomainWindow) {
/* This code grabs the OMNITURE tracking pixel img */
if ((obj.substring(0,4) == 's_i_') && (myDomainWindow[obj].src)) {
var ret = myDomainWindow[obj].src;
}
}
ret;
'''
omniture_url = sel.get_eval(js_code) #parse&process this however you want
except Exception, e:
print 'We ran into an error: %s' % (e,)
self.assertEqual("expectedValue", observedValue)
def tearDown(self):
self.selenium.stop()
if __name__ == "__main__":
unittest.main()
Другие советы
Самое простое, что можно сделать, это использовать что-то вроде HtmlUnit и полностью пропустить реальный браузер.Используя Rhino, он может оценивать JavaScript и, вероятно, будет использоваться для извлечения этого URL-адреса.
Тем не менее, если вы не можете заставить это работать, попробуйте Selenium RC и используйте команду captureNetworkTraffic (которая требует запуска Selenium instant с параметром captureNetworkTraffic = true).Это запустит Firefox с настроенным прокси-сервером, а затем позволит вам извлечь информацию о запросе обратно в виде JSON / XML / обычного текста.Затем вы можете проанализировать этот контент и получить то, что вы хотите.
Попробуйте использовать инструмент мгновенного тестирования это предлагает моя компания.Если данные, которые вы ищете, есть в наших результатах (после того, как вы нажмете Просмотреть сведения), вы сможете получить их из Selenium.Я знаю, так как я написал captureNetworkTraffic API для Selenium для моей компании BrowserMob.
Я бы выбрал любой из многих http прокси - серверы написанный на Python - вероятно, один из самых простых в самом верху списка - и настройте его так, чтобы записывать все запрошенные URL-адреса (а также обслуживать их через прокси), напримердобавление их в текстовый файл - без потери общности назовите этот текстовый файл 'XXX.txt '.
Теперь все, что вам нужно, это скрипт, который:запускает соответствующий прокси-сервер;запускает Firefox (или что-то еще) по вашему основному желаемому URL с соответствующим прокси, установленным в качестве вашего прокси (см., например, это ТАКОЙ вопрос как), хотя я уверен, что другие браузеры работали бы так же хорошо;немного подождет (например,до тех пор, пока прокси-сервер XXX.txt файл не был изменен более N секунд);читает XXX.txt извлекать только те URL, которые вас интересуют, и записывать их везде, где вы пожелаете;отключает прокси-сервер и процессы Firefox.
Я думаю, что это будет намного быстрее внедрить и заставить работать правильно, в соответствии с вашими конкретными требованиями, чем любое более общее решение, основанное на qtwebkit, selenium или других "наборах автоматизации".
Использование Плагин Firebug для Firefox.Он покажет вам все запросы в режиме реального времени, и вы даже сможете отладить JS в своем браузере или запустить его шаг за шагом.
Почему ты не можешь просто почитать suffix
, или url
если уж на то пошло?Загружается ли изображение в iframe или на вашей странице?
Если он загружен на вашей странице, то это может быть грязный взломать (замените document.body для любого рассматриваемого элемента):
var ac = document.body.appendChild;
var sources = [];
document.body.appendChild = function(child) {
if (/^img$/i.test(child.tagName)) {
sources.push(child.getAttribute('src'));
}
ac(child);
}