简介
动态内容网站使用 javascript 脚本动态检索和渲染数据,爬取信息时需要模拟浏览器行为,否则获取到的源码基本是空的。
本文使用的爬取步骤如下:
使用 selenium 获取渲染后的 html 文档
使用 htmlagilitypack 解析 html 文档
新建项目,安装需要的库:
selenium.webdriver
htmlagilitypack
获取 html 文档
需要注意的主要是以下2点:
设置浏览器启动参数:无头模式、禁用gpu加速、设置启动时窗口大小
等待页面动态加载完成:等待5秒钟,设置一个合适的时间即可
private static string gethtml(string url)
{
chromeoptions options = new chromeoptions();
// 不显示浏览器
options.addargument("--headless");
// gpu加速可能会导致chrome出现黑屏及cpu占用率过高
options.addargument("--nogpu");
// 设置chrome启动时size大小
options.addargument("--window-size=10,10");
using (var driver = new chromedriver(options))
{
try
{
driver.manage().window.minimize();
driver.navigate().gotourl(url);
// 等待页面动态加载完成
thread.sleep(5000);
// 返回页面源码
return driver.pagesource;
}
catch (nosuchelementexception)
{
console.writeline("找不到该元素");
return string.empty;
}
}
}
解析 html 文档
这里以b站为例,爬取b站up主主页上的视频信息,如视频的标题、链接、封面。
先定义一个类来保存信息:
class videoinfo
{
public string title { get; set; }
public string href { get; set; }
public string imgurl { get; set; }
}
定义解析函数,返回视频信息列表:
private static list<videoinfo> getvideoinfos(string url)
{
list<videoinfo> videoinfos = new list<videoinfo>();
// 加载文档
var html = gethtml(url);
var htmldoc = new htmldocument();
htmldoc.loadhtml(html);
// 解析文档,先定位到视频列表标签
var xpath = "/html/body/div[2]/div[4]/div/div/div[1]/div[2]/div/div";
var htmlnodes = htmldoc.documentnode.selectnodes(xpath);
// 循环解析它的子节点视频信息
foreach (var node in htmlnodes)
{
var titlenode = node.selectsinglenode("a[2]");
var imgnode = node.selectsinglenode("a[1]/div[1]/picture/source[1]");
var title = titlenode.innertext;
var href = titlenode.attributes["href"].value.trim('/');
var imgurl = imgnode.attributes["srcset"].value.split('@')[0].trim('/');
videoinfos.add(new videoinfo
{
title = title,
href = href,
imgurl = imgurl
});
}
return videoinfos;
}
视频列表标签的 xpath 路径是通过浏览器调试工具,在指定标签上右键 复制完整的xpath 得到:

分析代码中的 node 节点时,html文本格式可能很乱,可以通过在线 html 代码格式化 工具格式后再进行分析。
测试
以b站up主 星瞳_official 为例,爬取视频信息:
static void main(string[] args)
{
var url = @"https://space.bilibili.com/401315430";
var videoinfos = getvideoinfos(url);
foreach (var videoinfo in videoinfos)
{
console.writeline(videoinfo.title);
console.writeline(videoinfo.href);
console.writeline(videoinfo.imgurl);
console.writeline();
}
console.readkey();
}
结果如下:
等一下,好妹妹 www.bilibili.com/video/bv1uyxlejem9 i0.hdslb.com/bfs/archive/46a15065d1b6722a04696ffaaa2235287ceaa452.jpg 一口一个?你的超甜辣椒 www.bilibili.com/video/bv1aqsdeien1 i0.hdslb.com/bfs/archive/d93d47d67323ee284483e963ffed34fb9884cf61.jpg
这里只是演示爬取动态页面的方法,如果想获取b站up主的视频信息,建议直接使用 api 请求数据。
最后
以上就是c#爬取动态网页上信息得流程步骤的详细内容,更多关于c#爬取动态网页信息的资料请关注代码网其它相关文章!
发表评论