2010-02-11 2 views

Répondre

6

Ce que je fais en ce moment est:

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 ne télécharge pas de CSS ou d'images. Ils sont inutiles à un navigateur sans tête ...

dernière, j'entendu parler de c'est là, mais le billet est marqué privé: http://osdir.com/ml/java.htmlunit.devel/2007-01/msg00021.html

+1

si l'utilisateur veut vérifier le css ou des images avec un navigateur sans tête? Cela semble être ce que laisse entendre la question. Je suppose que css et les images ne seraient pas inutiles, non? En fait, c'est ce qui m'a conduit à cette question, ce serait bien si je pouvais utiliser un navigateur sans tête pour vérifier une image par la taille ou le hachage ou un CSS pour les valeurs d'une couleur de fond. Essayer d'aider ici ... votre réponse sort un peu argumentative plutôt que constructive. – fooMonster

1

source: 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

Voici ce que je suis venu avec:

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(); 
} 

Mes tests montrent qu'il fait proxys de soutien et qu'il porte non seulement les cookies de WebClient, mais aussi si le serveur envoie de nouveaux cookies lors de la réponse, le WebClient mangera ces cookies

Questions connexes