Использование Python / Selenium / Best Tool for The Job для получения URI запросов изображений, сгенерированных с помощью JavaScript? - PullRequest
1 голос
/ 10 ноября 2009

У меня есть JavaScript от стороннего поставщика, который инициирует запрос изображения. Я хотел бы выяснить URI этого запроса изображения.

Я могу загрузить страницу в своем браузере, а затем отслеживать «заголовки HTTP HTTP» или «Данные несанкционированного доступа», чтобы выяснить URI запроса изображения, но я бы предпочел создать процесс командной строки для этого. 1003 *

Моя интуиция заключается в том, что это возможно при использовании 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 ... ().

Любая помощь будет принята с благодарностью!

Спасибо.

Ответы [ 5 ]

4 голосов
/ 16 ноября 2009

Самое простое, что можно сделать, это использовать что-то вроде HtmlUnit и полностью пропустить настоящий браузер. Используя Rhino, он может оценивать JavaScript и, вероятно, использоваться для извлечения этого URL.

Тем не менее, если вы не можете заставить это работать, попробуйте Selenium RC и используйте команду captureNetworkTraffic (которая требует, чтобы момент Selenium был запущен с параметром captureNetworkTraffic = true). Это запустит Firefox с настроенным прокси, а затем позволит вам вытащить информацию запроса обратно в виде JSON / XML / обычный текст. Затем вы можете проанализировать этот контент и получить то, что вы хотите.

Попробуйте инструмент для мгновенного тестирования , который предлагает моя компания. Если данные, которые вы ищете, есть в наших результатах (после того, как вы нажмете «Просмотреть детали»), вы сможете получить их из Selenium. Я знаю, так как я написал API captureNetworkTraffic для Selenium для моей компании, BrowserMob.

3 голосов
/ 15 ноября 2009

Я бы выбрал любой из многих http прокси-серверов , написанных на Python - возможно, один из самых простых в верхней части списка - и настроил его для записи всех запрошенных URL-адресов (как ну и прокси-обслуживай их) например добавив их в текстовый файл - без потери общности назовите этот текстовый файл «XXX.txt».

Теперь все, что вам нужно, это скрипт, который: запускает рассматриваемый прокси-сервер; запускает Firefox (или любой другой) на вашем основном желаемом URL с прокси, о котором идет речь, в качестве вашего прокси (см., например, этот вопрос о том, как), хотя я уверен, что другие браузеры будут работать так же хорошо; немного ждет (например, пока файл XXX.txt прокси не будет изменен в течение более чем N секунд); читает файл XXX.txt, чтобы извлечь только те URL-адреса, которые вам интересны, и записывать их в любом месте; выключает прокси и процессы Firefox.

Я думаю, что это будет гораздо быстрее установить и заставить работать правильно, для ваших конкретных требований, чем любое более общее решение, основанное на qtwebkit, selenium или других "наборах автоматизации".

1 голос
/ 20 ноября 2009

В конце концов, я сделал это на 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()
1 голос
/ 20 ноября 2009

Используйте Firebug Плагин Firefox . Он покажет вам все запросы в режиме реального времени, и вы даже можете отладить JS в своем браузере или запустить его пошагово.

0 голосов
/ 13 ноября 2009

Почему вы не можете просто прочитать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...