从c#中的搜索引擎获取链接

时间:2016-05-16 09:36:38

标签: c# html-agility-pack meta-search search-engine-api

首先请原谅我的英语破碎 我想编码元搜索引擎 首先我尝试使用谷歌bing和雅虎api s但他们是有限的 然后我试图使用htmlagility包获得搜索引擎的结果链接
我有这个代码

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();

但它起作用了

我的另一个问题是这段代码只返回第一页链接。如果我想返回N第一个链接,该怎么办?
任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

首先,您在本主题中有多个问题。请为每个问题写一个主题。

对于Yahoo,“http://yahoo.com/search?q=”无效,如果您尝试http://yahoo.com/search?q=stackoverflow,则无法获得结果页面。您必须为每个搜索引擎找到搜索网址。例如,雅虎有: 的 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 = 进行分页,通常每页返回10个结果。因此,如果你把start = 20,你就会从20到30 https://www.google.es/search?q=stackoverflow&start=20

雅虎每页还会返回10个结果,并使用分页& b = 。 b = 1是第一页,b = 11 de second,依此类推。示例:https://search.yahoo.com/search?p=stackoverflow&b=11

我希望这可以帮到你。