使用C#开发在线音乐播放APP遇网页爬取问题求助
解决方案:HtmlAgilityPack加载无内容问题+MP3资源获取线索
让我们一步步解决你的问题:
一、解决HtmlWeb加载后doc无内容的问题
你遇到的大概率是网站反爬拦截或动态内容渲染的问题,试试下面几个方案:
1. 自定义User-Agent绕过基础反爬
很多网站会拦截默认的爬虫请求头,给HtmlWeb设置一个模拟浏览器的User-Agent就能解决大部分基础拦截:
var url = "http://keeng.vn/album/cho-anh-em-nhe-khanh-phong/osYbZ3ph.html"; var web = new HtmlWeb(); // 模拟Chrome浏览器的请求头 web.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"; var doc = web.Load(url);
2. 处理JavaScript动态渲染的内容
HtmlAgilityPack本身不执行JavaScript,如果页面内容是通过JS动态加载的,就得用能模拟浏览器的工具。比如使用Playwright的.NET版本来获取完整渲染后的DOM:
using var playwright = await Playwright.CreateAsync(); await using var browser = await playwright.Chromium.LaunchAsync(); var page = await browser.NewPageAsync(); await page.SetUserAgentAsync("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); await page.GotoAsync("http://keeng.vn/album/cho-anh-em-nhe-khanh-phong/osYbZ3ph.html"); // 获取完整渲染后的页面内容 var content = await page.ContentAsync(); var doc = new HtmlDocument(); doc.LoadHtml(content);
3. 添加额外请求头应对复杂反爬
如果上面的方法还不行,打开浏览器开发者工具(F12),查看正常访问该页面时的请求头,把必要的字段(比如Referer、Cookie)添加到HtmlWeb中:
web.PreRequest += (request) => { request.Headers.Add("Referer", "http://keeng.vn/"); // 可以复制浏览器中的Cookie值添加到这里 // request.Headers.Add("Cookie", "你的Cookie内容"); return true; };
二、获取免费MP3资源的关键线索
要拿到MP3下载链接,你可以通过浏览器开发者工具分析网站的请求逻辑:
- 抓包找音乐API:在开发者工具的「网络」标签里,筛选XHR/Fetch请求,搜索
mp3、audio、track、download这类关键词,找到网站获取音乐数据的接口,接口返回的JSON里通常会有audio_url、download_url或者url这类字段。 - 分析页面元素规则:查看下载按钮的HTML结构,看href属性里的链接格式,或者点击按钮时触发的JS函数,提取链接的生成规则(比如链接里包含
cdn、keeng这类标识)。 - 查找全局JS变量:有些网站会把音乐数据存在全局变量里,比如
window.albumTracks、window.songList,你可以在页面源代码里搜索这类变量,直接提取里面的MP3信息。
注意:一定要遵守网站的版权和使用条款,确保你的APP使用这些资源是合规的,避免法律风险。
内容的提问来源于stack exchange,提问作者Hiếu Ngô
相关产品推荐
相关产品推荐

