File file = new File("/sdcard/main.html"); String line = ""; try{ FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); URL url = new URL("string); HttpURLConnection connect = (HttpURLConnection)url.openConnection(); if(connect!=null){ connect.setConnectTimeout(1000); connect.setUseCaches(false); if(connect.getResponseCode()==HttpURLConnection.HTTP_OK){ BufferedReader br = new BufferedReader(new InputStreamReader(connect.getInputStream())); for(;;){ line = br.readLine(); if(line==null) break; if(line.contains("amp;")){ Log.e("@@@","amp line:"+line); } line = line.replaceAll("amp;", ""); if(line.contains("amp;")){ Log.e("@@@","amp line:"+line); } bw.write(line + "\n"); bw.flush(); line = null; } br.close(); } connect.disconnect(); } } catch(Exception ex){ex.printStackTrace(); } |
그래서 html 소스를 보니까 이미지 링크에 amp; 가 껴있어서 그런거 같아 소스상 빨간색부분과 같이 다 지워주었지만
제가 앱개발만 하다보니 웹쪽을 잘몰라서 정확하게 이해는 못하지만
검색해본 결과 네이버 m.naver.com은 html5구조(?) ajax?로 되어있고 이 형태는
http 요청시 그냥 요청하면 안되고 DOM 구조로 자바스크립트를 써서 요청하고
동일한 방식으로 응답 받는 구조인게..... 맞는지 궁금합니다.;;
참고한 사이트: http://blog.naver.com/jhoh86?Redirect=Log&logNo=10133727118
올려주신 소스만으로는 추측 밖에 할 수 없구요.
정확한 답변을 원하시면 1. 저장한 html 파일 2. html파일을 로드하는 소스를 같이 올려주세요
받아온 네이버 HTML 소스의 그림부분을 보면 아래와 같습니다.
<li class="tlst">
<a href="http://m.news.naver.com/read.nhn?mode=LS2D&sid1=106&sid2=221&oid=108&aid=0002193079" class="tlst_a" onclick="nclk(this,'nw1.img1','','')">
<span class="tlst_mw">
<img data-src="http://mwig.naver.net/alcatraz_mig/m.jsp?src="http://imgnews.naver.net/image/upload/item/2013/01/10/092353533_untitled-6.jpg&twidth=0&theight=0&cmd=2&qlt=80&rf=main" width="92" height="70" alt="" class="tlst_m" src="http://static.naver.net/www/m/guide/dummy_1X1.jpg">
</span>
<span class="tlst_d">
한혜진측 "기성용과 열애설? 황당"</span>
</a>
</li>
그리고 추가적으로 뉴스/연예/스포츠/라이프/FUN/쇼핑 이런 Tab들도 안눌리고 안넘어가고
손가락으로 원래 오른쪽 왼쪽 스와이프 하면 옆으로 넘어가는데 그것도 안먹네요;;
html 파일 로드하는 소스는 아래와 같습니다..
/**
* An example full-screen activity that shows and hides the system UI (i.e.
* status bar and navigation/system bar) with user interaction.
*
* @see SystemUiHider
*/
public class FullscreenActivity extends Activity {
public WebView wb = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fullscreen);
wb = (WebView)findViewById(R.id.web);
wb.getSettings().setJavaScriptEnabled(true);
wb.getSettings().setLoadsImagesAutomatically(true);
wb.getSettings().setLoadWithOverviewMode(true);
wb.getSettings().setUseWideViewPort(true);
wb.requestFocus();
wb.setWebViewClient(new GTIWebViewClient());
wb.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
wb.setWebChromeClient(new ChromeClient());
wb.getSettings().setAppCacheEnabled(false);
wb.getSettings().setDomStorageEnabled(true);
new AsyncTask(){
@Override
protected Object doInBackground(Object... params) {
/* 여기서 부터 시작 */
Log.e("##########","DownloadHtml end");
Log.e("##########",DownloadHtml("http://m.naver.com"));
Log.e("##########","DownloadHtml end");
wb.loadUrl("file:///sdcard/main.html");
// wb.loadUrl("file://sdcard/main.html");
// String URL = "file://sdcard/main.html";
// Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(URL));
// startActivity(intent);
return null;
}
}.execute();
}
private String DownloadHtml(String string) {
File file = new File("/sdcard/main.html");
// StringBuilder html = new StringBuilder();
String line = "";
try{
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
URL url = new URL("string);
HttpURLConnection connect = (HttpURLConnection)url.openConnection();
if(connect!=null){
connect.setConnectTimeout(1000);
connect.setUseCaches(false);
if(connect.getResponseCode()==HttpURLConnection.HTTP_OK){
BufferedReader br = new BufferedReader(new InputStreamReader(connect.getInputStream()));
for(;;){
line = br.readLine();
if(line==null) break;
// if(line.contains("amp;")){
// Log.e("@@@","amp line:"+line);
// }
// line = line.replaceAll("amp;", "");
// if(line.contains("amp;")){
// Log.e("@@@","amp line:"+line);
// }
bw.write(line + "\n");
bw.flush();
line = null;
// html.append(line+'\n');
}
br.close();
}
connect.disconnect();
}
}
catch(Exception ex){ex.printStackTrace();
Log.e("##########","Exception");
}
return "";
}
private class ChromeClient extends WebChromeClient {
@Override
public void onConsoleMessage(String message, int lineNumber,
String sourceID) {
Log.e("ChromeClient_ConsoleMSG", message + " -- From line " + lineNumber + " of " + sourceID);
}
}
private class GTIWebViewClient extends WebViewClient {
GTIWebViewClient(){
Log.e("GTIWebViewClient", "GTIWebViewClient");
}
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("GTIWebViewClient", "====shouldOverrideUrlLoading========");
wb.loadUrl("url);
return true;
}
}
살펴봐야 할 html 소스는 다운받아 저장된 것이 아니라 webview에서 로드된 소스입니다.
네이버도 AJAX로 페이지를 로딩해서 보여주는 것이 맞을텐데, 그렇다면
<img data-src="http://mwig.naver.net/alcatraz_mig/m.jsp?src="http://imgnews.naver.net/image/upload/item/2013/01/10/092353533_untitled-6.jpg&twidth=0&theight=0&cmd=2&qlt=80&rf=main" width="92" height="70" alt="" class="tlst_m" src="http://static.naver.net/www/m/guide/dummy_1X1.jpg">
img의 src 부분에 http://static.naver.net/www/m/guide/dummy_1X1.jpg 은
자바스크립트로 data-src 의 내용을 읽어와 img를 갱신해주는 과정에서 미리 넣어놓은 더미겠죠?
그럼 이 부분이 webview로 로드 됐을때는 어떻게 수정이 되어있는지 확인하셔야 된다는 말입니다.
제 경험상 ajax등을 사용해서 동적 로딩을 하는 웹 페이지라고 하더라도
결국에 end client에서는 full-loading 되어 있는 웹 페이지를 보는 것이 당연하고
이를 저장하면 문제를 해결할 수 있을 것이라고 생각합니다.
사용하신 방법은 URL 을 통해 웹페이지를 저장하는 방식인데
이 방식은 동적으로 로딩되는 웹페이지에서는 로딩되기 위한 뼈대만 저장하게 됩니다.
이 방식을 사용하더라도 해결책이 없는건 아닙니다.
뼈대를 토대로 웹페이지를 재구성하는 과정에서 적용되는 값들을 로컬로 끌어올 수 있으면 됩니다.
쉽게 말하자면 웹브라우저로 페이지 저장을 했을때 브라우저가 img, script, css등을 함께 저장하는 것을 볼 수 있습니다. 이와 같은 방식을 사용하셔도 무리는 없을 것 같습니다.
음... 우선 "amp;" 바꾸시는건 안하셔도 되구요. "&" 문자를 html에서 표현하려면 "&" 로 써야합니다.
저장하신 html 파일을 그냥 pc브라우져로 열어보시면 아마 동일하게 이미지가 안보이실꺼예요.
html 파일 그냥 텍스트에디터 등으로 열어 보시면 보이지않는 이미지 태그의 src 경로를 디폴트 이미지만 박혀 있지요.
음... 뭐 결론은 cross domain 문제 등으로 ajax 호출등을 하지 못해서 그런것으로 보입니다. 때문에 javascript 오류가 발생하고 다른 작업(이미지 src 바꿔주기 작업 등)을 하지 못한것으로 보입니다.