0

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

以下是要求:

  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()
4

1 回答 1

0

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

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

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

看看是否有帮助。

于 2018-04-30T20:29:24.187 回答