마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 크롤링.....

0 추천

네이버 날씨를 크롤링하려 하는데 잘 안되네요....

try의 첫번째 문장에서 예외처리가 발생합니다

java.net.SocketException: socket failed: EPERM

어떤 문제가 있는건가요...

질문 많이해서죄송해요.....

 

<uses-permission android:name="android.permission.INTERNET" />
implementation 'org.jsoup:jsoup:1.13.1'
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.weather)
        testc = findViewById<TextView>(R.id.testc)

        object : Thread() {
            override fun run() {
                try {
                    var doc = Jsoup.connect("http://weather.naver.com").get()
                    var contents = doc.select("strong.location_name")
                    text += contents.text()
                    testc.setText(text)
                    contents = doc.select("strong.current")
                    text += contents.text()
                    contents = doc.select("span.weather.before_slash")
                    text += contents.text()
                    bundle.putString("texts", text)
                    val msg = handler.obtainMessage()
                    msg.setData(bundle)
                    handler.sendMessage(msg)

                } catch (e: IOException) {
                    e.printStackTrace()
                }
            }
        }.start()
    }

    var handler: Handler = object : Handler() {
        override fun handleMessage(msg: Message) {
            val bundle = msg.getData()
            testc.setText(bundle.getString("texts"))
        }
    }

 

 

개미1 (1,260 포인트) 님이 2021년 12월 10일 질문
개미1님이 2021년 12월 12일 수정

2개의 답변

0 추천
* 안드로이드 매니패스트 <application  android:usesCleartextTraffic="true" 에 추가를 해줍니다.

* 쓰레드에서 UI에 접근하면 에러가 발생합니다.

아래는 샘플로 작성해본 코드입니다. 자바로 코딩했습니다.

public class MainActivity extends AppCompatActivity {
    TextView testc ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        testc = findViewById(R.id.testc);

        new Thread(new Runnable() {
            String text ="";
            public void run() {
                try {
                    Document doc = Jsoup.connect("http://weather.naver.com").get();
                    Elements contents = doc.select("strong.location_name");

                    text += contents.text();

                    contents = doc.select("strong.current");
                    text += contents.text();
                    contents = doc.select("span.weather.before_slash");
                    text += contents.text();

                    Log.e("text",text);

                    //testc.setText(text);
                   
                }
                catch (Exception k){
                    Log.e("에러","에러");
                    k.printStackTrace();
                   
                }

                runOnUiThread(new Runnable() {
                    public void run() {
                        testc.setText(text);
                    }
                });
            }
        }).start();
    }

 

}
익명사용자 님이 2021년 12월 15일 답변
0 추천

Jsoup은 백그라운드에서 HTTP Request/Response가 이루어지며, Request를 던졌을 때 웹 서버에서 응답한 결과를 받아온다. 따라서, 서버 사이드 랜더링(SSR, Server-Side Rendering)을 사용하는 웹 사이트는 서버에서 랜더링을 한 후 화면을 그리기 때문에 크롤링이 가능하지만, 클라이언트 사이드 랜더링(CSR, Client-Side Redering)을 사용하는 웹 사이트는 최소한의 페이지만 서버에서 랜더링하고 클라이언트(브라우저)에서 나머지 화면을 랜더링하기 때문에 HTTP Request로는 실제 브라우저에서 보여지는 화면을 스크랩 할 수 없다.

https://heodolf.tistory.com/103 출처

selenium을 쓰던지

좀 시간이걸려도 상관없다면 javascript로 html반환받아서 파싱해서쓰면되실듯 

show7777 (1,170 포인트) 님이 2021년 12월 15일 답변
...