2016-09-17 3 views
1

По соображениям образования я узнаю о разборе и слоте содержимого HTML. Я видел много вопросов и ответов о получении содержимого html, отображаемого в веб-просмотре. Моя проблема в том, что я не могу получить весь html, как я полагаю, он должен выглядеть. Когда я проверяю URL-адрес в Safari, все элементы могут быть расположены в HTML-файле, но когда я загружаю HTML-адрес того же URL-адреса из webview, отсутствуют элементы. Мой код прямо сейчас: `Как получить HTML показанный контент в Webview

private WebView wv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 

    wv = (WebView) findViewById(R.id.webView); 
    wv.getSettings().setJavaScriptEnabled(true); 

    wv.addJavascriptInterface(new LoadListener(), "HTMLOUT"); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 

    wv.setWebViewClient(new WebViewClient() { 
     public void onPageFinished(WebView view, String url) { 
      if(wv.getProgress() == 100) { 
       view.loadUrl("javascript:window.HTMLOUT.processHTML(document.documentElement.innerHTML);"); 
      } 
     } 
    }); 


    wv.loadUrl("http://hdfilme.tv/movie-movies?order_f=view&order_d=desc&per_page=#"); 
} 

class LoadListener{ 
    @JavascriptInterface 
    public void processHTML(String html) { 
     longInfo(html); 
    } 
} 

public static void longInfo(String str) { 
    if (str.length() > 4000) { 
     Log.i("DEBUG", str.substring(0, 4000)); 
     longInfo(str.substring(4000)); 
    } else 
     Log.i("DEBUG", str); 
}` 

Usuallay Я использую Jsoup для подключения и разбора HTML, но в этом случае веб-страница использует CloudFlare, и я не был в состоянии успешно загрузить страницу HTML.

Я обнаружил, что каждый листинг веб-страницы, который содержит тег <span class="hot"></span>, не загружен в мой код прямо сейчас.

Что мне не хватает?

Update1

Намек F.Klein сделал это!

Я действительно не понимаю, почему установка агента пользователя следующим образом: wv.getSettings().setUserAgentString("Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13");

изменил извлеченную HTML, как я предполагал, что это будет. Показанный контент в веб-просмотре был до и после установки пользовательского агента одинаковым.

UPDATE2

Я был в начале порадовали ... изменения агент пользователя в конечном итоге недостающих элементов, чтобы показать, но и другие предметы, которые, прежде чем были загружены теперь пошли ??? У меня проблемы.

+1

Вы пробовали настройку агента пользователя? По умолчанию будет загружаться мобильная презентация, могут быть различия в версиях. –

+0

Еще нет, я попробую. Заранее спасибо. – Flah

+0

Элементы, отсутствующие в возвращенном HTML, отображаются в Webview, поэтому я так запутался, но попробую установить агент пользователя. – Flah

ответ

1

Как уже было догадалось, мобильная версия страницы отличается от версии по умолчанию: в мобильной версии есть 50 div элементов с классом box-product, а версия по умолчанию - 70 элементов.

Фикс

String userAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36"; 
wv.getSettings().setUserAgentString(userAgent); 

Ваш упоминалось агент пользователя (Обновление 1) является одним для мобильной версии, следовательно, такой же результат, как и без установки агента пользователя (по умолчанию это мобильной версии на Android).


Альтернатива без WebView с использованием Rhino (для расчета вызова приобрести печенье доступа):

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    new BackgroundTask().execute(); 

} 

class BackgroundTask extends AsyncTask<Void,Void,Void>{ 

    @Override 
    protected Void doInBackground(Void... voids) { 
     scrapePage(); 
     return null; 
    } 
} 

private void scrapePage() { 

    Map<String, String> cookies; 
    final String referrer = "http://hdfilme.tv/movie-movies?order_f=view&order_d=desc&per_page=0"; 

    try { 

     Connection.Response res = Jsoup.connect("http://hdfilme.tv/movie-movies?order_f=view&order_d=desc&per_page=#") 
       .followRedirects(true).header("Connection", "keep-alive").userAgent(userAgent) 
       .ignoreHttpErrors(true).header("host", "hdfilme.tv").referrer(referrer).method(Connection.Method.GET) 
       .execute(); 

     cookies = res.cookies(); 

     Document doc = Jsoup.parse(res.body()); 

     String[] scriptlines = doc.select("script").toString().split("\n"); 

     StringBuilder builder = new StringBuilder(); 
     builder.append("var a={};"); 

     for (String line : scriptlines) { 
      if (line.contains("var s,t,o,p,b,r,e,a,k,i,n,g")) { 
       builder.append(line.trim()); 
       builder.append("t=\"hdfilme.tv\""); 
      } 
      if (line.contains("a.value = parseInt")) { 
       builder.append(line.trim()); 
      } 
     } 

     int jschl_answer = runRhino(builder.toString()); 
     String jschl_vc = doc.select("input[name=jschl_vc]").first().attr("value"); 
     String pass = doc.select("input[name=pass]").first().attr("value"); 

     Log.e("info","Acquiring access cookies (takes about 4 seconds)."); 

     try { 
      Thread.sleep(4000); //DDOS protection 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     String requestUrl = "http://hdfilme.tv/cdn-cgi/l/chk_jschl"; 

     res = Jsoup.connect(requestUrl).followRedirects(true).userAgent(userAgent) 
       .header("Referer", "http://hdfilme.tv/movie-movies?order_f=view&order_d=desc&per_page=") 
       .data("jschl_vc", jschl_vc).ignoreHttpErrors(true).cookies(cookies) 
       .data("jschl_answer", "" + jschl_answer).data("pass", pass).header("host", "hdfilme.tv") 
       .method(Connection.Method.GET).timeout(5000).execute(); 

     Log.e("repsonse",res.statusCode() + " - " + res.statusMessage()); 

     cookies.putAll(res.cookies()); 

     builder = new StringBuilder(); 
     builder.append("\tcookies"); 
     for (String cookie : cookies.keySet()) { 
      builder.append("\n\t\t" + cookie + ":" + cookies.get(cookie)); 
     } 

     Log.e("cookies", builder.toString()); 

     doc = Jsoup.connect("http://hdfilme.tv/movie-movies?order_f=view&order_d=desc&per_page=#") 
       .cookies(cookies) 
       .userAgent(userAgent) 
       .timeout(10000).referrer(referrer).header("host", "hdfilme.tv").followRedirects(true).get(); 

     builder = new StringBuilder(); 
     builder.append("elements"); 

     for (Element element : doc.select(selector)) { 
      builder.append("\n"+element.select("a[href]").attr("abs:href")); 
     } 

     Log.e("elements","total number of elements="+doc.select(selector).size()+"\n"+builder.toString()); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private int runRhino(String jsSource) { 
    Context rhino = Context.enter(); // org.mozilla.javascript.Context; 

    // Turn off optimization to make Rhino Android compatible 
    rhino.setOptimizationLevel(-1); 

    Scriptable scope = rhino.initStandardObjects(); 
    rhino.evaluateString(scope, jsSource, "ScriptAPI", 1, null); 

    NativeObject object = (NativeObject) scope.get("a", scope); 
    return (int) ((Double) object.get("value")/1); 
} 
Смежные вопросы