Android爬取漫画站点:POST返回hash、WebView获取JS内容失败求助
我尝试爬取manga.in.ua站点的章节列表,发起POST请求后仅返回"hash",WebView方式也无法获取到动态加载的章节内容,具体情况如下:
一、POST请求问题
请求地址(需VPN访问):manga.in.ua/engine/ajax/controller.php?mod=load_chapters&action=show&news_id=6590&news_category=1&this_link=""&site_login_hash=trefkbo756dsvnrfh4vhgfi654
站点通过JavaScript动态加载章节,对应的前端请求逻辑:
$(document).ready(function() { const news_id = $("#linkstocomics").data("news_id"); const news_category = $("#linkstocomics").data("news_category"); const this_link = news_category === 54 ? $("#linkstocomics").data("this_link") : ""; $.ajax({ url: "/engine/ajax/controller.php?mod=load_chapters", type: "POST", dataType: "html", data: { action:'show', news_id:news_id, news_category:news_category, this_link:this_link, user_hash:site_login_hash }, success: function(data) { // 处理返回数据的逻辑 } } }); });
我已经获取到news_id、news_category、this_link和site_login_hash的正确参数值,但POST请求始终仅返回"hash"。经排查,site_login_hash对应Cookie中的PHPSESSID,这个值通常静态,但偶尔会变化。
二、WebView尝试及问题
因为开发的是Android应用,无法确定用户浏览器版本,所以没使用Selenium。尝试用WebView执行上述JS代码,但返回null:
val myJsFun = "$(document).ready(function() ......" webView.settings.javaScriptEnabled = true webView.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView, url: String) { webView.evaluateJavascript(myJsFun){ Log.i("info", it.toString()) } } }
Logcat输出:info: null
UPDATE #1 (WebView)
尝试多种WebView用法,获取HTML时出错:
val web: WebView? = WebView(requireActivity()) web?.settings?.javaScriptEnabled = true web?.webViewClient = object : WebViewClient(){ override fun doUpdateVisitedHistory(view: WebView?, url: String?, isReload: Boolean) { view?.evaluateJavascript("document.documentElement.outerHTML"){ val html = it.replace("\\u003C", "<") Log.i("info", html.substring(html.indexOf("linkstocomics"), html.indexOf("linkstocomics") + 1000)) } } } web?.loadUrl(//url);
Logcat报错:(server)' ~ Channel is unrecoverably broken and will be disposed!,返回null。
但如果把WebView实例改为从布局中获取:
val web: WebView? = view?.findViewById(R.id.webview)
WebView界面能正常显示JS加载的章节元素,但在doUpdateVisitedHistory中获取到的是未执行JS的原始HTML,不包含动态加载的章节信息。
希望能通过POST请求或WebView任一方式获取章节数据,求解决思路。
内容的提问来源于stack exchange,提问作者Madman

