C# 解析器Bing浏览器
我为google创建了web解析器,效果很好。在这里,我得到了前5个结果,并在我的程序中显示了一个用户。所附代码: 控制器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;
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);
}
}