在作业中使用Python/Selenium/Best工具获取通过JavaScript生成的图像请求的URI?
我有一些来自第三方供应商的JavaScript,它正在发起一个图像请求。我想找出这个图像请求的URI 我可以在浏览器中加载页面,然后监视“实时HTTP头”或“篡改数据”,以确定图像请求URI,但我更愿意创建一个命令行进程来完成此操作 我的直觉是,使用python+qtwebkit是可能的,但也许有更好的方法 澄清一下:我可能有这个(过于简化的代码)在作业中使用Python/Selenium/Best工具获取通过JavaScript生成的图像请求的URI?,python,selenium,http-headers,analytics,Python,Selenium,Http Headers,Analytics,我有一些来自第三方供应商的JavaScript,它正在发起一个图像请求。我想找出这个图像请求的URI 我可以在浏览器中加载页面,然后监视“实时HTTP头”或“篡改数据”,以确定图像请求URI,但我更愿意创建一个命令行进程来完成此操作 我的直觉是,使用python+qtwebkit是可能的,但也许有更好的方法 澄清一下:我可能有这个(过于简化的代码) 后缀=magicNumberFunctionIDontHaveAccessTo(); url=”http://foobar.com/functio
后缀=magicNumberFunctionIDontHaveAccessTo();
url=”http://foobar.com/function?parameter=“+后缀
img=document.createElement('img');src=url;文件.all.body.appendChild(img);
然后,一旦页面被加载,我就可以通过嗅探数据包来找出url。但我不能从源头上理解它,因为我无法预测MagicNumber函数的结果…()
任何帮助都将不胜感激
谢谢。为什么你就不能读一下
后缀
,或者url
?图像是加载在iframe中还是加载在页面中
如果它加载到您的页面中,那么这可能是一个肮脏的黑客行为(将document.body替换为所考虑的任何元素):
你为什么不能直接读一下后缀,或者url?图像是加载在iframe中还是加载在页面中 如果它加载到您的页面中,那么这可能是一个肮脏的黑客行为(将document.body替换为所考虑的任何元素):
我会从许多用Python编写的文件中挑选任何一个——可能是列表顶部最简单的文件之一——并对其进行调整,以记录所有请求的URL(以及代理服务的URL),例如,将它们附加到文本文件中——在不失一般性的情况下,将该文本文件称为“XXX.txt” 现在您只需要一个脚本:启动有问题的代理服务器;在你想要的主要URL上启动Firefox(或其他任何浏览器),并将有问题的代理设置为你的代理(参见示例了解如何启动),尽管我相信其他浏览器也可以工作;等待一段时间(例如,直到代理的XXX.txt文件的更改时间超过N秒);阅读XXX.txt,只提取您关心的URL,并在任何地方记录它们;关闭代理和Firefox进程
我认为,与任何基于qtwebkit、selenium或其他“自动化工具包”的更通用的解决方案相比,针对您的特定需求,这将更快地实施并正确工作.我会从众多用Python编写的文件中挑选任何一个——可能是列表最顶端最简单的一个——并对其进行调整,以记录所有请求的URL(以及代理服务的URL),例如,将其附加到文本文件中——在不失一般性的情况下,将该文本文件称为“XXX.txt” 现在您只需要一个脚本:启动有问题的代理服务器;在你想要的主要URL上启动Firefox(或其他任何浏览器),并将有问题的代理设置为你的代理(参见示例了解如何启动),尽管我相信其他浏览器也可以工作;等待一段时间(例如,直到代理的XXX.txt文件的更改时间超过N秒);阅读XXX.txt,只提取您关心的URL,并在任何地方记录它们;关闭代理和Firefox进程
我认为,与任何基于qtwebkit、selenium或其他“自动化工具包”的通用解决方案相比,根据您的具体需求,这将更快地实施并正确运行。最简单的方法可能是使用类似HtmlUnit的东西,完全跳过真正的浏览器。通过使用Rhino,它可以评估JavaScript,并可能用于提取URL 也就是说,如果您无法使其正常工作,请尝试Selenium RC并使用captureNetworkTraffic命令(该命令要求Selenium instant以captureNetworkTraffic=true选项启动)。这将启动配置了代理的Firefox,然后让您将请求信息作为JSON/XML/纯文本拉回来。然后,您可以解析该内容并获得所需内容
试试我公司提供的服务。如果您要查找的数据在我们的结果中(单击“查看详细信息”后),您可以从Selenium获得它。我知道,因为我为我的公司BrowserMob为Selenium编写了captureNetworkTraffic API。最简单的方法可能是使用类似HtmlUnit的东西,完全跳过真正的浏览器。通过使用Rhino,它可以评估JavaScript,并可能用于提取URL 也就是说,如果您无法使其正常工作,请尝试Selenium RC并使用captureNetworkTraffic命令(该命令要求Selenium instant以captureNetworkTraffic=true选项启动)。这将启动配置了代理的Firefox,然后让您将请求信息作为JSON/XML/纯文本拉回来。然后,您可以解析该内容并获得所需内容
试试我公司提供的服务。如果您要查找的数据在我们的结果中(单击“查看详细信息”后),您可以从Selenium获得它。我知道,因为我为我的公司BrowserMob为Selenium编写了captureNetworkTraffic API。使用。它将实时显示所有请求,您甚至可以在浏览器中调试JS或一步一步地运行它。使用。它将实时向您显示所有请求,您甚至可以在浏览器中调试JS或一步一步地运行它。最终,我用python使用Selenium RC完成了这项工作。此解决方案需要selenium rc的python文件,您需要启动java服务器(“java-jar selenium server.jar”)
最终,我用python,使用Selenium RC完成了这项工作。此解决方案需要selenium rc的python文件,您需要启动java服务器(“java-jar selenium server.jar”)
想法是使用命令行中的脚本加载页面;在这种情况下
<script>
suffix = magicNumberFunctionIDontHaveAccessTo();
url = "http://foobar.com/function?parameter=" + suffix
img = document.createElement('img'); img.src=url; document.all.body.appendChild(img);
</script>
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);
}
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()