2017-12-25 4 views
2

데이터를 파싱해야하는 웹 사이트가 있습니다. 키워드 결과로 검색해야합니다. 그러나 모든 필드가 제품 미리보기에 표시되는 것은 아닙니다. 이 필드 (제품 색상, 설명, 이전 가격)는 각 제품 페이지에서만 스크랩 할 수 있습니다. 제품 페이지의 URL은 다음과 같습니다. https://www.aboutyou.de/p/new-look/basecap-in-satin-optik-3649077 SI는 일반적인 방법으로이를 호출하는 방법을 모르므로 각 제품을 검토하지 않아도됩니다. 프로젝트의 이름과 브랜드를 찾을 수는 있지만 URL을 작성하는 방법을 모릅니다. 모든 문자를 대문자로 설정하고 단어 사이에 대시를 넣으시겠습니까? 새틴 - 옵틱의 NEW LOOK Basecap과 같은 방식으로 브랜드 이름과 제품명을 얻을 수 있습니다.제품 페이지에 연결 urls Jsoup

그래서 각 제품에 대한 URL을 어떻게 정의 할 수 있습니까?

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

어쩌면, 그 몇 가지 라이브러리가 있습니다 : 여기

내가 지금까지 가지고있는 코드는? 나는 어떤 충고에 대해 감사 할 것입니다!

답변

0

필요한 세부 사항의 대부분처럼 보이는 div의에서 잡고 할 수있다 : 일부의 분리와

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

예제 코드 :

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

당신에게 뭔가를 줄 것이 div의 텍스트를 잡아 제품 세부 사항 및 제품 세부 사항에 대한 하위 요청 :

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

출력 :

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

그러나 제품 색상과 설명이 필요합니다. 나는 질문에서 언급했다. – Cassie

+0

@Cassie 실제로 하위 쿼리가 필요하다. 업데이트 된 코드를 참조하라. –

+0

@Cassie가 해결 되었습니까? 그런 다음 답변을 수락하거나 후속 조치 의견을 게시하십시오. –