본문 바로가기

OS/Android

안드로이드 유튜브 검색 크롤링

반응형

유튜브 크롤링을 사용하여 컨텐츠 정보를 가지고 오도록 해봤다.

json 데이터를 파싱해오기 위해서는 userAgent를 모바일에서 PC로 수정해줘야 한다.

검색 데이터를 가지고 오기 위한 url은 https://www.youtube.com/results?search_query=검색내용&page=페이지번호이다~~ 

 

class SearchTubeTask(var m_context : Context?, var m_strUrl : String?) : AsyncTask<Void, Void, Boolean>()
{
    private var m_hSearchResultListener : OnSearchResultListener? = null
    private val USER_AGENT = "PC용 Agent"
    private val GOOGLE_URL = "http://www.google.com"

    override fun doInBackground(vararg p0: Void?): Boolean
    {
        if (m_strUrl == null || m_strUrl.equals("") || isCancelled || m_context == null)
        {
            return false
        }

        var strParse = ""

        try {
            val doc = Jsoup.connect(m_strUrl)
                    .userAgent(USER_AGENT)
                    .referrer(GOOGLE_URL)
                    .timeout(5000)
                    .get()

            val scanner: Scanner = Scanner(doc.toString())
            while (scanner.hasNextLine()) {
                val line = scanner.nextLine()
                if (line.contains("window[\"ytInitialData\"]")) {
                    strParse = line
                }
            }
            scanner.close()

            if (strParse.isEmpty())
            {
                return false
            }
        }catch (e : Exception)
        {
            return false
        }

        var jarr: JSONArray? = null

        try {
            var strResult = strParse.substring(0, strParse.length - 1).trim()
            strResult = strResult.replace("window[\"ytInitialData\"] =", "").trim().trimEnd()
            val jsonObject = JSONObject(strResult)
            jarr = jsonObject
                    .getJSONObject("contents")
                    .getJSONObject("twoColumnSearchResultsRenderer")
                    .getJSONObject("primaryContents")
                    .getJSONObject("sectionListRenderer")
                    .getJSONArray("contents")
                    .getJSONObject(0)
                    .getJSONObject("itemSectionRenderer")
                    .getJSONArray("contents")
        } catch (e: Exception)
        {
            return false
        }

        try {
            for (i in 0 until jarr.length())
            {
                val item: JSONObject
                try {
                    item = jarr.getJSONObject(i).getJSONObject("videoRenderer")
                } catch (e: Exception) {
                    continue
                }
                val videoId = item.get("videoId").toString()
                var title = item.getJSONObject("title").getJSONArray("runs").getJSONObject(0).get("text").toString().run { replace("'", "") }
                val icon_url = "https://i.ytimg.com/vi/$videoId/hqdefault.jpg"
                val strTime = item.getJSONObject("lengthText").get("simpleText").toString()
        } catch (e: Exception)
        {
            return false
        }
        return true
    }

    override fun onPostExecute(result: Boolean?)
    {
        var bResult = false
        if (result == null || result == false || mArr.size <= 0)
        {
            bResult = false
            return
        }

        bResult = true
    }


    override fun onCancelled()
    {
        super.onCancelled()
    }
}

 

반응형