2

我想获取id您在广告设置页面上选择加入时 Google 发出的 cookie (如果您已经接受目标广告,则必须先选择退出才能看到我所指的页面)。

我发现,为了获取此 cookie,您必须以该页面中的形式GET对URL 执行 HTTP。action问题是这个 URL 包含一个散列,它会随着每个新的 HTTP 连接而改变,所以,首先,我必须去这个页面并获取这个 URL,然后,GET对 URL 执行。

我正在使用 HttpComponents 来获取http://www.google.com/ads/preferences但是当我使用 JSOUP 解析内容时,只有一个脚本并且找不到任何表单。

恐怕会发生这种情况,因为内容是使用某种超时动态加载的……有谁知道解决方法吗?

编辑:顺便说一句,我现在使用的代码是:

        HttpClient httpclient = new DefaultHttpClient();

        // Create a local instance of cookie store
        CookieStore cookieStore = new BasicCookieStore();
        // Bind custom cookie store to the local context
        ((AbstractHttpClient) httpclient).setCookieStore(cookieStore);
        CookieSpecFactory csf = new CookieSpecFactory() {
            public CookieSpec newInstance(HttpParams params) {
                return new BrowserCompatSpec() {
                    @Override
                    public void validate(Cookie cookie, CookieOrigin origin)
                            throws MalformedCookieException {
                        // Allow all cookies
                        System.out.println("Allowed cookie: " + cookie.getName() + " "
                                + cookie.getValue() + " " + cookie.getPath());
                    }
                };
            }
        };
        ((AbstractHttpClient) httpclient).getCookieSpecs().register("EASY", csf);

        // Create local HTTP context
        HttpContext localContext = new BasicHttpContext();
        // Bind custom cookie store to the local context
        localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
        HttpGet httpget = new HttpGet(doubleClickURL);
        // Override the default policy for this request
        httpclient.getParams().setParameter(
                ClientPNames.COOKIE_POLICY, "EASY"); 

        // Pass local context as a parameter
        HttpResponse response = httpclient.execute(httpget, localContext);

        HttpEntity entity = response.getEntity();

        if (entity != null) {                               
                InputStream instream = entity.getContent();

                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(instream));
                instream.close();
                // Find action attribute of form
                Document document = Jsoup.parse(reader.readLine());
                Element form = document.select("form").first();         
                String optinURL = form.attr("action");
                URL connection = new URL(optinURL);
                // ... get id Cookie

        }
4

2 回答 2

1

您可能有更多机会使用HtmlUnitSeleniumjWebUnit来完成此类任务。JSoup 不解释 Javascript,并且您指向的 Google 页面充满了应由浏览器执行以生成您所看到的内容的 Javascript。

HtmlUnit 独立于操作系统,不需要安装任何其他东西,但我从未将它用于复杂的 Javascript 网站。HtmlUnit 也可以像 JSoup 一样从网页中提取数据,但是如果您更喜欢使用它,您仍然可以将 html 提供给 JSoup。

于 2012-10-31T08:22:56.003 回答
0

终于我找到了!我发现以下网站描述了双击 cookie 协议:

隐私咨询

id然后,就像在该域中使用 name和 value设置一个 cookie 一样简单A。然后向http://www.google.com/ads/preferences发出 HTTP 请求,他们会设置正确的 ID 值。

这是一个非常具体的问题,但我希望这对未来的观众有用。

顺便说一句,我发现 amazon.com 例如是 Ad-sense Network 的成员。双击的 HTTP 请求通过主页中的脚本发送到:

http://ad.doubleclick.net/adj/amzn.us.gw.atf

在那里您可以找到一个脚本,该脚本似乎是为您提供 id cookie 的实际代码。不过,如果您使用带有值的 cookie 访问A它,它将设置双击的 id。

于 2012-10-31T10:37:46.287 回答