Получить ссылки с поисковых систем в C#
Прежде всего извините за мой сломанный английский
Я хочу сначала написать код для метапоиска. Я пытаюсь использовать Google Bing и Yahoo API, но они были ограничены.
тогда я пытаюсь использовать пакет 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 ответ
Прежде всего, у вас есть более одного вопроса в этой теме. Пожалуйста, напишите тему для каждого вопроса.
В случае с Yahoo " http://yahoo.com/search?q=" недействителен, если вы попробуете http://yahoo.com/search?q=stackru вы не получите страницу результатов. Вы должны найти поисковый URL для каждой поисковой системы. Например, у Yahoo есть: 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=stackru&start=20
Yahoo также возвращает 10 результатов на страницу и использует por pagination & b =. b = 1 - первая страница, b=11 секунд и т. д. Пример: https://search.yahoo.com/search?p=stackru&b=11
Я надеюсь это тебе поможет.