C# 解析器Bing浏览器

C# 解析器Bing浏览器,c#,html,asp.net,asp.net-mvc,parsing,C#,Html,Asp.net,Asp.net Mvc,Parsing,我为google创建了web解析器,效果很好。在这里,我得到了前5个结果,并在我的程序中显示了一个用户。所附代码: 控制器 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using HtmlAgilityPack; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging;

我为google创建了web解析器,效果很好。在这里,我得到了前5个结果,并在我的程序中显示了一个用户。所附代码:

控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using HtmlAgilityPack;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace SearchDemos.Controllers
{
    public class SearchInfo
    {
        public string Title { get; set; }
        public string Link { get; set; }

        public string BTitle { get; set; }
        public string BLink { get; set; }
    }

    [ApiController]
    [Route("[controller]")]
    public class SearchController : ControllerBase
    {
        [HttpGet("Google")]
        public IList<SearchInfo> DoGoogleSearch(string q)
        {
            var html = @"https://www.google.com/search?q="+q ;

            HtmlWeb web = new HtmlWeb();
            //  accept-language : RU or EN 
            var htmlDoc = web.Load(html);


            var rows = htmlDoc.DocumentNode.SelectNodes("//*[@class='r']").Take(5);

            var result = new List<SearchInfo>();
            foreach (HtmlNode row in rows)
            {
                var nodeRef = row.SelectSingleNode("./a");

                var si = new SearchInfo
                {

                    Link = nodeRef.GetAttributeValue("href", string.Empty),
                    Title = nodeRef.InnerText.Trim()
                };

                result.Add(si);
            }

            return result;
        }

我的控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using HtmlAgilityPack;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace SearchDemos.Controllers
{
    public class SearchInfo
    {
        public string Title { get; set; }
        public string Link { get; set; }

        public string BTitle { get; set; }
        public string BLink { get; set; }
    }

    [ApiController]
    [Route("[controller]")]
    public class SearchController : ControllerBase
    {

        [HttpGet("Bing")]
        public IList<SearchInfo> DoBingSearch(string q)
        {
            var html = @"https://www.bing.com/search?q=" + q;

            HtmlWeb web = new HtmlWeb();

            var htmlDoc = web.Load(html);


            var rows = htmlDoc.DocumentNode.SelectNodes("//*[@class='b_algo']").Take(5);

            var result = new List<SearchInfo>();
            foreach (HtmlNode row in rows)
            {
                var nodeRef = row.SelectSingleNode("./a");                //here could be  var nodeRef = row.SelectSingleNode("//a");      

                var si = new SearchInfo
                {

                    BLink = nodeRef.GetAttributeValue("href", string.Empty),
                    BTitle = nodeRef.InnerText.Trim()
                };

                result.Add(si);
            }

            return result;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用HtmlAgilityPack;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.Extensions.Logging;
命名空间SearchDemos.Controllers
{
公共类搜索信息
{
公共字符串标题{get;set;}
公共字符串链接{get;set;}
公共字符串BTitle{get;set;}
公共字符串闪烁{get;set;}
}
[ApiController]
[路线(“[控制器]”)]
公共类SearchController:ControllerBase
{
[HttpGet(“Bing”)]
公共IList DobinSearch(字符串q)
{
var html=@”https://www.bing.com/search?q=“+q;
HtmlWeb web=新的HtmlWeb();
var htmlDoc=web.Load(html);
var rows=htmlDoc.DocumentNode.SelectNodes(“/*[@class='b_algo']”)。取(5);
var result=新列表();
foreach(行中的HtmlNode行)
{
var nodeRef=row.SelectSingleNode(“./a”);//这里可能是var nodeRef=row.SelectSingleNode(//a”);
var si=新搜索信息
{
BLink=nodeRef.GetAttributeValue(“href”,string.Empty),
BTitle=nodeRef.InnerText.Trim()
};
结果:添加(si);
}
返回结果;
}
}
}
和HTML

@page

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Search page</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
          integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <link href="~/css/Style.css" rel="stylesheet" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
    <section class="main">
        <!-- Another variation with a button -->
        <div class="input-group">
            <input type="text" class="form-control" placeholder="Search Google & Bing" id="txtQuery">
            <div class="input-group-append">
                <button class="btn btn-secondary" type="button" id="btnSearch">
                    <i class="fa fa-search">Search</i>
                </button>
            </div>
        </div>

        <div id="searchResults">

        </div>

    </section>

    <script>
        $(function () {

            $("#btnSearch").click(function () {

                $("#searchResults").html("");

                $.ajax({
                    type: "GET",
                    url: '@Url.Action("Bing", "Search")',
                    data: {
                        q: $("#txtQuery").val()
                    },
                    success: function (data) {
                        for (var i in data) {
                            var item = data[i];
                            console.log(item.title);
                            var p = $("<p></p>").text(item.title);
                            $("#searchResults").append(p);

                           /* console.log(item.append);
                            var h = $(" < p ></p >").text(item.a);
                            $("#searchResults").url(h);*/

                        }
                        console.log("data received");
                    },
                    error: function () {
                        alert("Server error!");
                    }
                });

            });

        });
    </script>

</body>
</html>
@page
搜索页面
搜寻
$(函数(){
$(“#BTN搜索”)。单击(函数(){
$(“#搜索结果”).html(“”);
$.ajax({
键入:“获取”,
url:'@url.Action(“必应”,“搜索”)',
数据:{
问:$(“#txtQuery”).val()
},
成功:功能(数据){
用于(数据中的var i){
var项目=数据[i];
控制台日志(项目名称);
var p=$(“

”).text(item.title); $(“#搜索结果”)。追加(p); /*console.log(item.append); var h=$(“

”)。文本(项目a); $(“#搜索结果”).url(h)*/ } 控制台日志(“收到的数据”); }, 错误:函数(){ 警报(“服务器错误!”); } }); }); });
好的,最后我通过快速谷歌找到了解决方案

仍然存在错误,因为for循环搜索不正确,但至少返回结果

您必须修改才能在API控制器中使用

请不要在生产或任何现场使用-最终您的站点/服务器将被bing或google阻止,从而导致代码无法使用。请看API代码。此外,如果谷歌或微软修改了这些代码/css等,那么这也将中断

public class SearchController : Controller
    {

        public class SearchInfo
        {
            public string Title { get; set; }
            public string Link { get; set; }

            public string BTitle { get; set; }
            public string BLink { get; set; }
        }

        public async System.Threading.Tasks.Task<ActionResult> DoBingSearchAsync(string q)
        {

            var html = @"https://www.bing.com/search?q=" + q;

            HtmlWeb web = new HtmlWeb();
            web.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134";

            var htmlDoc = await web.LoadFromWebAsync(html);




            var rows = htmlDoc.DocumentNode.SelectNodes("//*[@class='b_algo']").Take(5);

            var result = new List<SearchInfo>();
            foreach (HtmlNode row in rows)
            {
                var nodeRef = row.SelectSingleNode("./a");                //here could be  var nodeRef = row.SelectSingleNode("//a");      

                var si = new SearchInfo
                {

                    BLink = nodeRef.GetAttributeValue("href", string.Empty),
                    BTitle = nodeRef.InnerText.Trim()
                };

                result.Add(si);
            }

            return View(result);
        }
    }
公共类SearchController:Controller
{
公共类搜索信息
{
公共字符串标题{get;set;}
公共字符串链接{get;set;}
公共字符串BTitle{get;set;}
公共字符串闪烁{get;set;}
}
公共异步System.Threading.Tasks.Task DobingSearchSync(字符串q)
{
var html=@”https://www.bing.com/search?q=“+q;
HtmlWeb web=新的HtmlWeb();
web.UserAgent=“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134”;
var htmlDoc=await web.LoadFromWebAsync(html);
var rows=htmlDoc.DocumentNode.SelectNodes(“/*[@class='b_algo']”)。取(5);
var result=新列表();
foreach(行中的HtmlNode行)
{
var nodeRef=row.SelectSingleNode(“./a”);//这里可能是var nodeRef=row.SelectSingleNode(//a”);
var si=新搜索信息
{
BLink=nodeRef.GetAttributeValue(“href”,string.Empty),
BTitle=nodeRef.InnerText.Trim()
};
结果:添加(si);
}
返回视图(结果);
}
}

是的,只是尝试了一下,得到了同样的结果-从外观上看,这取决于bing的工作方式,基本上不想让你获取搜索结果。你是说解析bing是不可能的吗?与其尝试刮除bing不喜欢的搜索api,不如说刮除任何网站,不是很友好-取决于你的黑客攻击频率。例如,你的谷歌代码在某个时候会失败,因为你会意识到你的网络服务器被击中的次数非常多,并认为“这不是一个人”,是的,阻止你的服务器是的,谢谢。我明白。但是我很长时间都不需要它了。我不能在我的项目中使用API。这是必需的为什么不能使用API?这毫无意义。除非你的项目是专门学习如何做网页抓取?如果是这样的话,那就找一个能让你刮掉它的网站。如果没有,那么就使用API。HTML文档是供人类使用的(在浏览器中呈现后),而不是供机器使用。API返回机器可读的数据(例如,通常是JSON或XML),其他自动化程序可以轻松处理这些数据。这就是它们存在的原因——因此像您这样的程序可以访问站点中的数据,而无需尝试解析复杂的HTML
@page

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Search page</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
          integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <link href="~/css/Style.css" rel="stylesheet" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
    <section class="main">
        <!-- Another variation with a button -->
        <div class="input-group">
            <input type="text" class="form-control" placeholder="Search Google & Bing" id="txtQuery">
            <div class="input-group-append">
                <button class="btn btn-secondary" type="button" id="btnSearch">
                    <i class="fa fa-search">Search</i>
                </button>
            </div>
        </div>

        <div id="searchResults">

        </div>

    </section>

    <script>
        $(function () {

            $("#btnSearch").click(function () {

                $("#searchResults").html("");

                $.ajax({
                    type: "GET",
                    url: '@Url.Action("Bing", "Search")',
                    data: {
                        q: $("#txtQuery").val()
                    },
                    success: function (data) {
                        for (var i in data) {
                            var item = data[i];
                            console.log(item.title);
                            var p = $("<p></p>").text(item.title);
                            $("#searchResults").append(p);

                           /* console.log(item.append);
                            var h = $(" < p ></p >").text(item.a);
                            $("#searchResults").url(h);*/

                        }
                        console.log("data received");
                    },
                    error: function () {
                        alert("Server error!");
                    }
                });

            });

        });
    </script>

</body>
</html>
public class SearchController : Controller
    {

        public class SearchInfo
        {
            public string Title { get; set; }
            public string Link { get; set; }

            public string BTitle { get; set; }
            public string BLink { get; set; }
        }

        public async System.Threading.Tasks.Task<ActionResult> DoBingSearchAsync(string q)
        {

            var html = @"https://www.bing.com/search?q=" + q;

            HtmlWeb web = new HtmlWeb();
            web.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134";

            var htmlDoc = await web.LoadFromWebAsync(html);




            var rows = htmlDoc.DocumentNode.SelectNodes("//*[@class='b_algo']").Take(5);

            var result = new List<SearchInfo>();
            foreach (HtmlNode row in rows)
            {
                var nodeRef = row.SelectSingleNode("./a");                //here could be  var nodeRef = row.SelectSingleNode("//a");      

                var si = new SearchInfo
                {

                    BLink = nodeRef.GetAttributeValue("href", string.Empty),
                    BTitle = nodeRef.InnerText.Trim()
                };

                result.Add(si);
            }

            return View(result);
        }
    }