2011-12-23 8 views
9

Tôi chỉ muốn truy xuất bất kỳ mã nguồn của trang web nào từ Java. Tôi thấy rất nhiều giải pháp cho đến nay, nhưng tôi không thể tìm thấy bất kỳ mã mà làm việc cho tất cả các liên kết bên dưới:Cách lấy mã nguồn của trang web từ Java

Vấn đề chính đối với tôi là một số mã truy xuất mã nguồn trang web, nhưng với mã bị thiếu. Ví dụ, mã bên dưới không hoạt động đối với liên kết đầu tiên.

InputStream is = fURL.openStream(); //fURL can be one of the links above 
BufferedReader buffer = null; 
buffer = new BufferedReader(new InputStreamReader(is, "iso-8859-9")); 

int byteRead; 
while ((byteRead = buffer.read()) != -1) { 
    builder.append((char) byteRead); 
} 
buffer.close(); 
System.out.println(builder.toString()); 
+1

Lưu ý rằng bạn sẽ chỉ nhận được nguồn ban đầu được phân phối khi mở url. Có thể có nội dung bổ sung đang được tải qua AJAX và bạn không thấy nội dung đó khi bạn chỉ đọc luồng ban đầu. - Ví dụ: mở http://demo.vaadin.com/sampler trong Firefox và sau đó mở mã nguồn trang. Bạn sẽ không thấy nguồn cho tất cả nội dung được hiển thị ở đó. – Thomas

+0

@cerq: Tùy thuộc vào định nghĩa của bạn về * "mã nguồn của trang web" * bạn có thể hoặc bạn không thể làm điều đó. Ví dụ, có thể lập luận rằng "mã nguồn" của, giả sử, một trang web được tạo bởi * .jsp * là tệp * .jsp * và ** không ** mã HTML được tạo ... Những gì bạn đang theo dõi là HTML, không phải là "mã nguồn". Trong nhiều trường hợp, "mã nguồn" là trên máy chủ và ngắn của việc lậu máy chủ bạn chỉ đơn giản là không thể truy cập nó. – TacticalCoder

+0

@Thomas tôi nghĩ rằng vấn đề của tôi là về những điều bạn nói. Vì vậy, có cách nào để có được tất cả các nguồn nội dung hiển thị? – brtb

Trả lời

22

Hãy thử đoạn mã sau với một tài sản yêu cầu thêm:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLConnection; 

public class SocketConnection 
{ 
    public static String getURLSource(String url) throws IOException 
    { 
     URL urlObject = new URL(url); 
     URLConnection urlConnection = urlObject.openConnection(); 
     urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 

     return toString(urlConnection.getInputStream()); 
    } 

    private static String toString(InputStream inputStream) throws IOException 
    { 
     try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) 
     { 
      String inputLine; 
      StringBuilder stringBuilder = new StringBuilder(); 
      while ((inputLine = bufferedReader.readLine()) != null) 
      { 
       stringBuilder.append(inputLine); 
      } 

      return stringBuilder.toString(); 
     } 
    } 
} 
+0

Cả mã của bạn lẫn mã tôi đã viết đều không hoạt động liên kết http://www.cumhuriyet.com.tr?hn=298710 hãy kiểm tra mã của bạn trước tiên. – brtb

+2

System.out.println (getUrlSource ("http://cumhuriyet.com.tr/?hn=298710")); ok ok –

1
URL yahoo = new URL("http://www.yahoo.com/"); 
BufferedReader in = new BufferedReader(
      new InputStreamReader(
      yahoo.openStream())); 

String inputLine; 

while ((inputLine = in.readLine()) != null) 
    System.out.println(inputLine); 

in.close(); 
+0

tôi không muốn mã làm việc cho yahoo.com hoặc google.com, hãy kiểm tra bài đăng của tôi hai lần – brtb

3

Tôi chắc chắn rằng bạn đã tìm thấy một giải pháp ở đâu đó trong 2 năm trở lại đây nhưng sau đây là một giải pháp mà làm việc cho trang web được yêu cầu của bạn

package javasandbox; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

/** 
* 
* @author Ryan.Oglesby 
*/ 
public class JavaSandbox { 

private static String sURL; 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws MalformedURLException, IOException { 
    sURL = "http://www.cumhuriyet.com.tr/?hn=298710"; 
    System.out.println(sURL); 
    URL url = new URL(sURL); 
    HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
    //set http request headers 
      httpCon.addRequestProperty("Host", "www.cumhuriyet.com.tr"); 
      httpCon.addRequestProperty("Connection", "keep-alive"); 
      httpCon.addRequestProperty("Cache-Control", "max-age=0"); 
      httpCon.addRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 
      httpCon.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"); 
      httpCon.addRequestProperty("Accept-Encoding", "gzip,deflate,sdch"); 
      httpCon.addRequestProperty("Accept-Language", "en-US,en;q=0.8"); 
      //httpCon.addRequestProperty("Cookie", "JSESSIONID=EC0F373FCC023CD3B8B9C1E2E2F7606C; lang=tr; __utma=169322547.1217782332.1386173665.1386173665.1386173665.1; __utmb=169322547.1.10.1386173665; __utmc=169322547; __utmz=169322547.1386173665.1.1.utmcsr=stackoverflow.com|utmccn=(referral)|utmcmd=referral|utmcct=/questions/8616781/how-to-get-a-web-pages-source-code-from-java; __gads=ID=3ab4e50d8713e391:T=1386173664:S=ALNI_Mb8N_wW0xS_wRa68vhR0gTRl8MwFA; scrElm=body"); 
      HttpURLConnection.setFollowRedirects(false); 
      httpCon.setInstanceFollowRedirects(false); 
      httpCon.setDoOutput(true); 
      httpCon.setUseCaches(true); 

      httpCon.setRequestMethod("GET"); 

      BufferedReader in = new BufferedReader(new InputStreamReader(httpCon.getInputStream(), "UTF-8")); 
      String inputLine; 
      StringBuilder a = new StringBuilder(); 
      while ((inputLine = in.readLine()) != null) 
       a.append(inputLine); 
      in.close(); 

      System.out.println(a.toString()); 

      httpCon.disconnect(); 
} 
} 
+0

một trợ giúp không bao giờ là quá muộn. Nhưng tôi đã thử mã của bạn và nó không hoạt động trong nhiều trang web. –

+1

Tôi đồng ý rằng phân đoạn này sẽ không hoạt động với tất cả các trang web vì các trang khác nhau trả về dữ liệu ở các định dạng khác nhau và trong một số trường hợp, các chuyển hướng có thể được yêu cầu cho những gì bạn muốn thực hiện. trong một số trường hợp, bạn có thể nhận được phản hồi dưới dạng phản hồi gzip và bạn có thể xử lý nó như sau 'InputStream gzippedResponse = httpCon.getInputStream(); InputStream ungzippedResponse = new GZIPInputStream (gzippedResponse); InputStreamReader reader = new InputStreamReader (ungzippedResponse, "UTF-8"); StringWriter writer = new StringWriter(); ' – Roglesby