반응형
유튜브 크롤링을 사용하여 컨텐츠 정보를 가지고 오도록 해봤다.
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()
}
}
반응형
'OS > Android' 카테고리의 다른 글
안드로이드 CustomView 생성자 (0) | 2020.07.16 |
---|---|
안드로이드 Command Line으로 bundle 만들기 (0) | 2020.07.13 |
More than one file was found with OS independent path 'META-INF/app_release.kotlin_module' (0) | 2020.04.16 |
android ScrollView안에 recycerview나 ViewPager 넣었을 때 이벤트 겹침 (0) | 2020.03.28 |
exoplayer rtmp error(java.lang.AbstractMethodError) (0) | 2020.03.03 |