2010-02-11 17 views

Odpowiedz

6

Co robię teraz to:

public static final HashMap<String, String> acceptTypes = new HashMap<String, String>(){{ 
     put("html", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
     put("img", "image/png,image/*;q=0.8,*/*;q=0.5"); 
     put("script", "*/*"); 
     put("style", "text/css,*/*;q=0.1"); 
    }}; 

protected void downloadCssAndImages(HtmlPage page) { 
     String xPathExpression = "//*[name() = 'img' or name() = 'link' and @type = 'text/css']"; 
     List<?> resultList = page.getByXPath(xPathExpression); 

     Iterator<?> i = resultList.iterator(); 
     while (i.hasNext()) { 
      try { 
       HtmlElement el = (HtmlElement) i.next(); 

       String path = el.getAttribute("src").equals("")?el.getAttribute("href"):el.getAttribute("src"); 
       if (path == null || path.equals("")) continue; 

       URL url = page.getFullyQualifiedUrl(path); 

       WebRequestSettings wrs = new WebRequestSettings(url); 
       wrs.setAdditionalHeader("Referer", page.getWebResponse().getRequestSettings().getUrl().toString()); 

       client.addRequestHeader("Accept", acceptTypes.get(el.getTagName().toLowerCase())); 
       client.getPage(wrs); 
      } catch (Exception e) {} 
     } 



client.removeRequestHeader("Accept"); 
} 
0

HtmlUnit nie pobiera CSS ani obrazów. Są one bezużyteczne bez głowy przeglądarce ...

Ostatnio usłyszałem od niego jest tutaj, ale bilet jest oznaczony jako prywatny: http://osdir.com/ml/java.htmlunit.devel/2007-01/msg00021.html

+1

Co jeśli użytkownik chce sprawdzić css lub obrazy z bezgłową przeglądarką? To wydaje się być tym, co sugeruje pytanie. Sądzę, że css i obrazy nie byłyby bezużyteczne, prawda? W rzeczywistości to właśnie doprowadziło mnie do tego pytania, byłoby miło, gdybym mógł użyć przeglądarki bezgłowej, by sprawdzić obraz według rozmiaru lub hash lub css dla wartości koloru tła. Próbując pomóc tutaj ... twoja odpowiedź jest trochę sprzeczna, a nie konstruktywna. – fooMonster

1

źródło: How to get base64 encoded contents for an ImageReader?

HtmlImage img = (HtmlImage) p.getByXPath("//img").get(3); 
ImageReader imageReader = img.getImageReader(); 
BufferedImage bufferedImage = imageReader.read(0); 
String formatName = imageReader.getFormatName(); 
ByteArrayOutputStream byteaOutput = new ByteArrayOutputStream(); 
Base64OutputStream base64Output = new base64OutputStream(byteaOutput); 
ImageIO.write(bufferedImage, formatName, base64output); 
String base64 = new String(byteaOutput.toByteArray()); 
1

Oto co wymyśliłem:

public InputStream httpGetLowLevel(URL url) throws IOException 
{ 
    WebRequest wrq=new WebRequest(url); 

    ProxyConfig config =webClient.getProxyConfig(); 

    //set request webproxy 
    wrq.setProxyHost(config.getProxyHost()); 
    wrq.setProxyPort(config.getProxyPort()); 
    wrq.setCredentials(webClient.getCredentialsProvider().getCredentials(new AuthScope(config.getProxyHost(), config.getProxyPort()))); 
    for(Cookie c:webClient.getCookieManager().getCookies(url)){ 
     wrq.setAdditionalHeader("Cookie", c.toString());    
    }   
    WebResponse wr= webClient.getWebConnection().getResponse(wrq); 
    return wr.getContentAsStream(); 
} 

Moje testy pokazują, że robi Proxys wsparcia i że nie tylko przenosi pliki cookie z WebClient, ale również wtedy, gdy serwer wysyła nowe ciasteczka podczas odpowiedzi, WebClient zje te ciasteczka

Powiązane problemy