2

我想要獲得id Cookie,當您選擇登錄ads settings page時,Google會發出一個cookie(如果您已經接受目標廣告,則必須先退出,以查看我所指的頁面)。如何獲取動態Cookie

我發現,爲了得到這個cookie,你必須執行一個HTTP GETaction這個URL。問題是這個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 

     } 

回答

0

終於找到了!我發現下面的網站描述的DoubleClick Cookie協議:

Privacy Advisory

然後,是在該領域與名稱id和值A設置cookie一樣簡單。然後發起一個HTTP請求到http://www.google.com/ads/preferences,他們會設置一個正確的ID值。

這是一個非常具體的問題,但我希望能爲未來的觀衆服務。

順便說一句,我發現amazon.com是例如廣告傳感網絡的成員。 HTTP請求到DoubleClick是通過腳本的方式在主網頁發送到:

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

那裏你可以找到一個腳本,似乎實際的代碼給你ID的Cookie。不過,如果您使用值爲A的cookie訪問此設置,它將設置雙擊的ID。

1

您可能需要使用HtmlUnitSeleniumjWebUnit對於這樣的任務更多的機會。 JSoup不解釋Javascript,而你指向的Google頁面充滿了JavaScript,應該由瀏覽器執行,以產生你所看到的內容。

HtmlUnit與操作系統無關,不需要其他任何東西安裝,但我從來沒有用它來複雜的Javascript網站。 HtmlUnit也可以像JSoup那樣從網頁中提取數據,但是如果您願意使用它,您仍然可以將該HTML提供給JSoup。

+0

我嘗試了以下HtmlUnit: 'WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage(doubleClickURL); DomNodeList forms = page.getElementsByTagName(「form」);' 但它並沒有反映任何形式:S似乎是在超時或什麼後加載。 – synack