Используя Python / Selenium / Лучший инструмент для задания получения URI запросов изображений, сгенерированных с помощью JavaScript?

StackOverflow https://stackoverflow.com/questions/1709711

Вопрос

У меня есть некоторый 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top