получить ссылки из поиска Google в C # - PullRequest
6 голосов
/ 03 марта 2011

Я пытаюсь запрограммировать простой поиск в Google с помощью C #, который будет выполнять запрос по моему выбору и получать первые 50 ссылок.После тщательного поиска аналогичного инструмента \ правильного API я понял, что большинство из них устарели.Моей первой попыткой было создать «простой запрос HttpWebRequest» и отсканировать полученный WebResponse на предмет «href =», который оказался совсем не полезным (избыточность) и очень расстраивающим.У меня есть Google API, но я не уверен, как его использовать для этой цели, хотя я знаю, что существует ограничение в 1000 в день.

Гил

Ответы [ 2 ]

6 голосов
/ 04 января 2015

Вот рабочий код .. очевидно, вам придется добавить правильную форму и несколько простых элементов управления ...

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=", ""));
                    }
                }
            }
        }
    }
}
1 голос
/ 03 марта 2011

Если вы идете по этому маршруту, вы должны использовать HtmlAgility pack для вашего разбора. Однако лучшим подходом было бы использовать API Google. См. Этот пост Мне нужно знать, какой из моих URL индексируется в Google

Что касается кода для использования пакета HtmlAgility, у меня есть пост в моем блоге. Поиск ссылок на веб-странице

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...