在c#中从搜索引擎获取链接
get links from search engines in c#
首先请原谅我蹩脚的英语
我想编写一个元搜索引擎
首先我尝试使用 google bing 和 yahoo api s 但他们是有限的
然后我尝试使用 htmlagility pack 来获得搜索引擎 link 的结果
我有这个代码
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.ServiceModel.Syndication;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
namespace Search
{
public partial class Form1 : Form
{
// load snippet
HtmlAgilityPack.HtmlDocument htmlSnippet = new HtmlAgilityPack.HtmlDocument();
public Form1()
{
InitializeComponent();
}
private void btn1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
StringBuilder sb = new StringBuilder();
byte[] ResultsBuffer = new byte[8192];
string SearchResults = "http://google.com/search?q=" + txtKeyWords.Text.Trim();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(SearchResults);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();
string tempString = null;
int count = 0;
do
{
count = resStream.Read(ResultsBuffer, 0, ResultsBuffer.Length);
if (count != 0)
{
tempString = Encoding.ASCII.GetString(ResultsBuffer, 0, count);
sb.Append(tempString);
}
}
while (count > 0);
string sbb = sb.ToString();
HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
html.OptionOutputAsXml = true;
html.LoadHtml(sbb);
HtmlNode doc = html.DocumentNode;
foreach (HtmlNode link in doc.SelectNodes("//a[@href]"))
{
//HtmlAttribute att = link.Attributes["href"];
string hrefValue = link.GetAttributeValue("href", string.Empty);
if (!hrefValue.ToString().ToUpper().Contains("GOOGLE") && hrefValue.ToString().Contains("/url?q=") && hrefValue.ToString().ToUpper().Contains("HTTP://"))
{
int index = hrefValue.IndexOf("&");
if (index > 0)
{
hrefValue = hrefValue.Substring(0, index);
listBox1.Items.Add(hrefValue.Replace("/url?q=", ""));
}
}
}
}
}
}
我可以将此代码用于所有搜索引擎吗?
我更改了这些行,以便它适用于其他搜索引擎
if (!hrefValue.ToString().ToUpper().Contains("YAHOO") && hrefValue.ToString().Contains("/url?q=") && hrefValue.ToString().ToUpper().Contains("HTTP://"))
和
string SearchResults = "http://yahoo.com/search?q=" + textBox1.Text.Trim();
但它不起作用
我的另一个问题是这段代码只是 return 第一页 links 。如果我想先 return N link 我该怎么办?
有人可以帮忙吗?
首先你在这个话题上有不止一个问题。请为每个问题写一个主题。
在雅虎的情况下,“http://yahoo.com/search?q=" is not valid, if you try http://yahoo.com/search?q=Whosebug 你没有得到结果页面。你必须为每个搜索引擎找到搜索 url。例如雅虎有:
https://search.yahoo.com/search?p=.
您还必须为每个搜索引擎修改此 if (!hrefValue.ToString().ToUpper().Contains("YAHOO") && hrefValue.ToString().Contains("/url?q=") && hrefValue.ToString().ToUpper().Contains("HTTP://"))
。例如,您只能获得 HTTP 值,但 HTTPS 会被丢弃。
分页
Google 使用 &start= 进行分页,通常每页 returns 10 个结果。所以如果你把 start=20,你会从 20 到 30
https://www.google.es/search?q=Whosebug&start=20
Yahoo 还 returns 每页 10 个结果并使用 por 分页 &b=。 b=1 是第一页,b=11 是第二页,依此类推。示例:https://search.yahoo.com/search?p=Whosebug&b=11
希望对您有所帮助。
首先请原谅我蹩脚的英语
我想编写一个元搜索引擎
首先我尝试使用 google bing 和 yahoo api s 但他们是有限的
然后我尝试使用 htmlagility pack 来获得搜索引擎 link 的结果
我有这个代码
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.ServiceModel.Syndication;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
namespace Search
{
public partial class Form1 : Form
{
// load snippet
HtmlAgilityPack.HtmlDocument htmlSnippet = new HtmlAgilityPack.HtmlDocument();
public Form1()
{
InitializeComponent();
}
private void btn1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
StringBuilder sb = new StringBuilder();
byte[] ResultsBuffer = new byte[8192];
string SearchResults = "http://google.com/search?q=" + txtKeyWords.Text.Trim();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(SearchResults);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();
string tempString = null;
int count = 0;
do
{
count = resStream.Read(ResultsBuffer, 0, ResultsBuffer.Length);
if (count != 0)
{
tempString = Encoding.ASCII.GetString(ResultsBuffer, 0, count);
sb.Append(tempString);
}
}
while (count > 0);
string sbb = sb.ToString();
HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
html.OptionOutputAsXml = true;
html.LoadHtml(sbb);
HtmlNode doc = html.DocumentNode;
foreach (HtmlNode link in doc.SelectNodes("//a[@href]"))
{
//HtmlAttribute att = link.Attributes["href"];
string hrefValue = link.GetAttributeValue("href", string.Empty);
if (!hrefValue.ToString().ToUpper().Contains("GOOGLE") && hrefValue.ToString().Contains("/url?q=") && hrefValue.ToString().ToUpper().Contains("HTTP://"))
{
int index = hrefValue.IndexOf("&");
if (index > 0)
{
hrefValue = hrefValue.Substring(0, index);
listBox1.Items.Add(hrefValue.Replace("/url?q=", ""));
}
}
}
}
}
}
我可以将此代码用于所有搜索引擎吗? 我更改了这些行,以便它适用于其他搜索引擎
if (!hrefValue.ToString().ToUpper().Contains("YAHOO") && hrefValue.ToString().Contains("/url?q=") && hrefValue.ToString().ToUpper().Contains("HTTP://"))
和
string SearchResults = "http://yahoo.com/search?q=" + textBox1.Text.Trim();
但它不起作用
我的另一个问题是这段代码只是 return 第一页 links 。如果我想先 return N link 我该怎么办?
有人可以帮忙吗?
首先你在这个话题上有不止一个问题。请为每个问题写一个主题。
在雅虎的情况下,“http://yahoo.com/search?q=" is not valid, if you try http://yahoo.com/search?q=Whosebug 你没有得到结果页面。你必须为每个搜索引擎找到搜索 url。例如雅虎有: https://search.yahoo.com/search?p=.
您还必须为每个搜索引擎修改此 if (!hrefValue.ToString().ToUpper().Contains("YAHOO") && hrefValue.ToString().Contains("/url?q=") && hrefValue.ToString().ToUpper().Contains("HTTP://"))
。例如,您只能获得 HTTP 值,但 HTTPS 会被丢弃。
分页
Google 使用 &start= 进行分页,通常每页 returns 10 个结果。所以如果你把 start=20,你会从 20 到 30 https://www.google.es/search?q=Whosebug&start=20
Yahoo 还 returns 每页 10 个结果并使用 por 分页 &b=。 b=1 是第一页,b=11 是第二页,依此类推。示例:https://search.yahoo.com/search?p=Whosebug&b=11
希望对您有所帮助。