【问题标题】:Incomplete HAR list using Python: Browsermobproxy, selenium, phantomJS使用 Python 的不完整 HAR 列表:Browsermobproxy、selenium、phantomJS
【发布时间】:2018-03-08 08:44:01
【问题描述】:

对 python 相当陌生,我是边做边学的,所以我想试试这个项目。尝试创建一个脚本来查找某个网站的 google 分析请求会解析请求有效负载并对其进行处理。

以下是要求:

  1. 向用户询问 2 个 url(用于比较来自 2 个不同的 HAR 有效负载的有效负载)
  2. 使用selenium打开两个url,使用browsermobproxy/phantomJS 获取所有 HAR
  3. 将 HAR 存储为列表
  4. 从所有 HAR 文件列表中,找到 google 分析请求,包括有效负载
  5. 如果找到 Google Analytics 标记,则执行操作....如解析有效负载等。比较有效负载等。

问题:有时对于我知道有谷歌分析的网站,即 nytimes.com - 我得到的 HAR 是不完整的,即我的 prog。会说“未找到 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()

【问题讨论】:

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


    【解决方案1】:

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

    你需要改变两件事: 1 - 删除 sys.exit() - 这会导致你的程序在第一次遍历 ent 列表后停止,所以如果你想要的不是第一件事,它就不会被发现

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

    看看是否有帮助。

    【讨论】:

      猜你喜欢
      • 2016-04-12
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多