2011-03-03 23 views
5

Estoy tratando de programar una búsqueda simple en google a través de C# que ejecutaría una consulta de mi elección y recuperaría los primeros 50 enlaces. Después de buscar a fondo una herramienta similar \ API correcta, me di cuenta de que la mayoría de ellos están obsoletos. Mi primer intento fue crear una "simple HttpWebRequest" y escanear la WebResponse recibida para "href =" que resultó no ser nada gratificante (redundancia) y muy frustrante. Tengo una API de Google, pero no estoy seguro de cómo usarla para este propósito, aunque sé que hay un límite de 1000 por día.obtener enlaces de una búsqueda en google en C#

Gil

+0

Tengo un proyecto que envía una solicitud a google y analiza la respuesta. Tenemos que reescribir el módulo de análisis varias veces al año para seguir los cambios en el marcado de Google. Apesta. Aunque normalmente toma solo un par de horas arreglar el código de análisis. – Snowbear

+0

@Snowbear, ¿está usando el paquete HtmlAgility para analizar? –

+0

@Shiv, no, es una especie de parte heredada, que todavía usa expresiones regulares. Gracias, por mencionar eso, me gustaría ver que la próxima vez volveremos a escribir esa pesadilla. – Snowbear

Respuesta

5

Aquí está trabajando código .. obviamente, tendrá que añadir la forma adecuada y unos controles sencillos ...

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=", "")); 
        } 
       } 
      } 
     } 
    } 
} 
Cuestiones relacionadas