使用Python的不完整HAR列表:Browsermobproxy,selenium,phantomJS

时间:2017-09-27 01:25:24

标签: python selenium-webdriver google-analytics har browsermob-proxy

蟒蛇相当新,我从实践中学习,所以我想我会给这个项目一个机会。尝试创建一个脚本,找到某个网站的Google Analytics分析请求,解析请求有效负载并对其执行某些操作。

以下是要求:

  1. 向用户询问2个网址(用于比较来自2个差异HAR负载的有效负载)
  2. 使用selenium打开两个网址,使用browsermobproxy / phantomJS 得到所有HAR
  3. 将HAR存储为列表
  4. 从所有HAR文件列表中,找到google analytics请求,包括有效负载
  5. 如果找到Google Analytics代码,则执行操作....例如解析有效负载等。比较有效负载等。
  6. 问题:有时对于我知道有谷歌分析的网站,即nytimes.com - 我得到的HAR是不完整的,即我的编程。会说“未找到GA”,但这只是因为没有捕获到完整的HAR,因此当正则表达式找到匹配的HAR时它就不存在了。这个问题在断断续续并不会一直发生。有任何想法吗?

    我认为由于某些依赖性或延迟,脚本继续运行并且完整的HAR未被捕获。我试过“等待交通停止”,但也许我没有做对。

    此外,作为奖励,我将非常感谢您可以提供有关如何使此脚本快速运行的任何帮助,它相当慢。正如我所提到的,我是python的新手,所以很容易:)

    这是我到目前为止所得到的。

    import browsermobproxy as mob
    from selenium import webdriver
    import re
    import sys
    import urlparse
    import time
    from datetime import datetime
    
    
    def cleanup():
        s.stop()
        driver.quit()
    
    proxy_path = '/Users/bob/Downloads/browsermob-proxy-2.1.4-bin/browsermob-proxy-2.1.4/bin/browsermob-proxy'
    s = mob.Server(proxy_path)
    s.start()
    proxy = s.create_proxy()
    proxy_address = "--proxy=127.0.0.1:%s" % proxy.port
    service_args = [proxy_address, '--ignore-ssl-errors=yes', '--ssl-protocol=any']  # so that i can do https connections
    driver = webdriver.PhantomJS(executable_path='/Users/bob/Downloads/phantomjs-2.1.1-windows/phantomjs-2.1.1-windows/bin/phantomjs', service_args=service_args)
    driver.set_window_size(1400, 1050)
    
    urlLists = []
    collectTags = []
    gaCollect = 0
    varList = []
    
    for x in range(0,2): # I want to ask the user for 2 inputs
        url = raw_input("Enter a website to find GA on: ")
        time.sleep(2.0)
        urlLists.append(url)
    
        if not url:
            print "You need to type something in...here"
            sys.exit()
        #gets the two user url and stores in list
    
    for urlList in urlLists:
    
        print urlList, 'start 2nd loop' #printing for debug purpose, no need for this
    
        if not urlList:
            print 'Your Url list is empty'
            sys.exit()
    
        proxy.new_har()
        driver.get(urlList)
        #proxy.wait_for_traffic_to_stop(15, 30) #<-- tried this but did not do anything
    
        for ent in proxy.har['log']['entries']:
            gaCollect = (ent['request']['url'])
    
            print gaCollect
    
            if re.search(r'google-analytics.com/r\b', gaCollect):
    
                print 'Found GA'
                collectTags.append(gaCollect)
                time.sleep(2.0)
                break
        else:
    
            print 'No GA Found - Ending Prog.'
            cleanup()
            sys.exit()
    
    cleanup()
    

1 个答案:

答案 0 :(得分:0)

这可能是一个陈旧的问题,但我找到了一个对我有用的答案。

你需要改变两件事: 1 - 删除sys.exit() - 这会导致程序在第一次迭代通过ent列表后停止,所以如果你想要的不是第一件事,那么就找不到它

2 - 调用new_har并启用captureContent选项以获取请求的有效负载: proxy.new_har(options = {'captureHeaders':True,'captureContent':True})

看看是否有帮助。