2017-12-25 5 views
2

Ich habe eine Website, von der ich Daten analysieren muss. Ich brauche eine Suche nach Keyword-Ergebnissen. Allerdings sind nicht alle Felder in der Vorschau der Produkte sichtbar. Es scheint, dass diese Felder (Produktfarbe, Beschreibung, alte Preise) nur von jeder Produktseite abgekratzt werden können. Die URL einer Produktseite sieht folgendermaßen aus: https://www.aboutyou.de/p/new-look/basecap-in-satin-optik-3649077 SI weiß nicht, wie man es generisch nennt, also müsste ich nicht jedes Produkt durchlaufen. Ich kann den Namen und die Marke des Projekts herausfinden, aber ich weiß nicht, wie ich die URL erstellen soll - setze alle Buchstaben auf Großbuchstaben und setze Bindestriche zwischen die Wörter? Markennamen und Produktname kann ich so bekommen: NEW LOOK Basecap in Satin-Optik.Verbinden mit Produktseiten URLs Jsoup

Also, wie kann ich die URL für jedes Produkt definieren?

Hier ist der Code, den ich bisher habe:

String url = "https://www.aboutyou.de/frauen/accessoires/huete-und-muetzen/caps"; 
Document doc = Jsoup.connect(url).get(); 

System.out.println("Title: " + doc.title()); 

String mainPath = "section.layout_11glwo1-o_O-stretchLayout_1jug6qr > " + 
     "div.content_1jug6qr > " + 
     "div.container > " + 
     "div.mainContent_10ejhcu > " + 
     "div.productStream_6k751k > " + 
     "div > " + 
     "div.wrapper_8yay2a > " + 
     "div.col-sm-6.col-md-4 > " + 
     "div.wrapper_1eu800j > " + 
     "div > " + 
     "div.categoryTileWrapper_e296pg"; 

String searchPath = mainPath + " > a.anchor_wgmchy > " + 
     "div.details_197iil9 > " + 
     "div.meta_1ihynio"; 
String linksPath = mainPath + " > a.anchor_wgmchy"; 
String brandPath = mainPath + " > a.anchor_wgmchy > " + 
     "div.details_197iil9 > " + 
     "div.meta_1ihynio > " + 
     "div.description_ya0ltb > " + 
     "strong.brand_ke66rm"; 

Elements result = doc.body().select("main#app"); 
for(Element element : result) { 
    Elements products = element.select(searchPath); 
    Elements links = element.select(linksPath); 

    Elements brands = element.select(brandPath); 
    for(Element product : products){ 
     System.out.println(product.text()); 
    } 

    String[] linksText = null; 
    for(Element link : links){ 
     String linkHref = link.attr("href"); 
     String linkText = link.text(); 
     linksText = linkHref.split("[\\-]"); 
     String id = linksText[linksText.length-1]; 
     System.out.println("id: " + id); 
     System.out.print("link attr:" + linkHref + ", "); 
    } 
    System.out.print("\nbrands" + brands.text()); 
} 

Vielleicht gibt es einige Bibliotheken für das? Ich wäre dankbar für jeden Rat!

Antwort

0

Die meisten der erforderlichen Daten aus den divs packte suchen wie:

<div class="details_..." ...> 

Grabbing den Text für diese divs Sie würde so etwas wie:

-10%9,90€ -10 % EXTRA8,90€ NEW LOOK Basecap in Satin-Optik 8,01€ 

Beispielcode mit der Trennung von einigen Details und Unteranfrage für die Farbdetails von der Produktseite:

String url = "https://www.aboutyou.de/frauen/accessoires/huete-und-muetzen/caps"; 
String userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"; 

try { 
    Document doc = Jsoup.connect(url).userAgent(userAgent).get(); 
    Elements elements = doc.select("div[class^='categoryTileWrapper_']"); 

    for (Element element : elements) { 

     String brand = element.select("strong[class^='brand_']").first().text(); 
     String name = element.select("p[class^='name_']").first().text(); 
     System.out.println(brand + " - " + name); 

     String href = element.select("a[class^='anchor_']").first().absUrl("href"); 
     Document subDoc = Jsoup.connect(href).userAgent(userAgent).get(); 
     String color = subDoc.select("div[class^='attributeWrapper_']").first().text();  
     System.out.println("\t"+href); 
     System.out.println("\t"+color); 

     String finalPrice = element.select("div[class^='finalPrice_']").first().text(); 

     if(element.select("ul").size()>0){ 
      for (Element listItems : element.select("ul").first().select("li")) { 
       System.out.println("\tpriece was: " + listItems.select("span[class^='price_']").first().text()); 
      } 
     } 
     System.out.println("\tfinal priece: " + finalPrice); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Ausgabe:

NEW LOOK - Basecap in Satin-Optik 
    https://www.aboutyou.de/p/new-look/basecap-in-satin-optik-3649077 
    Textil Unifarben 
    priece was: 9,90€ 
    priece was: 8,90€ 
    final priece: 8,01€ 
WOOD WOOD - Weiche 'Baseball cap' 
    https://www.aboutyou.de/p/wood-wood/weiche-baseball-cap-3687779 
    Logoprint 
    priece was: 39,90€ 
    priece was: 29,90€ 
    final priece: 20,93€ 
[... truncated] 
+0

Aber ich brauche auch eine Produktfarbe sowie Beschreibung. Ich erwähnte es in der Frage – Cassie

+0

@Cassie dann wird tatsächlich eine Unterabfrage benötigt, siehe aktualisierten Code. –

+0

@Cassie ist das gelöst? Dann akzeptiere bitte die Antwort oder poste einen Kommentar. –