C#调用chrome获取页面html内容

我要抓一个网页的源代码,页面是分页的,页数比较多,用C#的httprequest模拟浏览器请求,屏蔽的比较厉害,用webbrowser或iframe就直接打不开了,已经尝... 我要抓一个网页的源代码,页面是分页的,页数比较多,用C#的httprequest 模拟浏览器请求,屏蔽的比较厉害,用webbrowser或iframe就直接打不开了,已经尝试各种办法,现在就用浏览器打开可以正常获取到页面html内容,但是页数很多,所以有没有办法可以让C# 调用chrome获取页面的html 展开
 我来答
Jarhf
推荐于2017-12-16 · TA获得超过1862个赞
知道小有建树答主
回答量:1736
采纳率:25%
帮助的人:1015万
展开全部

这个功能用在浏览器中用js就能完成,而且更方便。代码如下:

function crawl(baseUrl, pageStart, pageEnd){  
  for(var i = pageStart; i <= pageEnd; i++){
    var xhr = new XMLHttpRequest();
    xhr.open("get", baseUrl + i);
    xhr.onload = function(page) {
      return function(){
        console.log("第" + page + "页内容如下:");
        console.log(xhr.responseText);
        //TODO : 这里你可以发送ajax请求把数据保存到你的服务器端,前提是你服务器端要设置跨域响应头:Access-Control-Allow-Origin 
      }
    }(i);
    xhr.send();    
  }
}

使用方法,打开你要的网站,在chrome的控制台下执行,crawl("你的页面地址?page参数=", 1, 3)

追问
返回undefined
追答
你把要抓的页面url给我,我帮你试试,发图片,要不可能被度娘给吃了
创作者zUzVB1Sl31
2019-12-18 · 编程类资料、英语学习资料
创作者zUzVB1Sl31
采纳数:1331 获赞数:5974

向TA提问 私信TA
展开全部

cefsharp其实也难获取完整,我讲实话,你看我写的:

//例如下面这个结构
//<small class="test-name ncss-brand text-color-white u-uppercase d-sm-ib va-sm-m" aria-label="Options for 张三">张三</small> 
//我们获取登录名是张三怎么获取
//取中间值,没办法他没解析html的语法
public static string GetMiddleString(string SumString, string LeftString, string RightString)
{
   if (string.IsNullOrEmpty(SumString)) return "";
   if (string.IsNullOrEmpty(LeftString)) return "";
   if (string.IsNullOrEmpty(RightString)) return "";
   int LeftIndex = SumString.IndexOf(LeftString);
   if (LeftIndex == -1) return "";
   LeftIndex = LeftIndex + LeftString.Length;
   int RightIndex = SumString.IndexOf(RightString, LeftIndex);
   if (RightIndex == -1) return "";
   return SumString.Substring(LeftIndex, RightIndex - LeftIndex);
}
//这是方法体
void get_info()
{
     var stm = chromeB.GetSourceAsync().Result;
     string str = GetMiddleString(stm, "test-name ncss-brand text-color-white u-uppercase d-sm-ib va-sm-m", "small>");
     string st2 = GetMiddleString(str, ">", "<");
}
//写在结束加载语句里面
chromeB.FrameLoadEnd += (object sen, FrameLoadEndEventArgs ed) =>
{
     if(bl==true)get_info();
};

这种方法不灵,为什么end事件想要获取到最终html还要看他执行效果,有时候你发现点击都搞定了,网站也响应了,但是最终获取不到登录名,主要原因是他自身还没完全加载或者加载线程拥堵,没有获取完整。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式