Skocz do zawartości

Jak wyświetlić wyniki wyszukiwarki internetowej z linkami w programie WPF?


Czarnowłosy

Recommended Posts

Cześć,
chcę stworzyć program wyświetlający wyniki wyszukiwania internetowego z aktywnymi linkami, jak DuckDuckGo. Używam przeglądarki PhantomJS bez interfejsu. Pobieram dane z rezultatów wyszukiwarki Qwant Lite.

Teraz na okienku aplikacji wypisanych jest tylko kilka rezultatów (tytuły, adresy URL i opisy stron) bez odnośników. Podam przykład:

Cytat

 

Microsoft ułatwia przejście z Windows 7 na Windows 10 - tytuł strony

https://www.komputerswiat.pl/[...]ndows-7-na-windows-10/d756zxe - adres URL
Windows 7 to system operacyjny, który wkrótce zostanie porzucony. Wsparcie zakończy się w styczniu 2020 roku. Microsoft zdaje sobie sprawę z tego, że pod kontrolą "siódemki" pracują ... - opis strony

 

Zauważyłem, że są pokazywane wszystkie skopiowane z Qwant Lite tytuły bez właściwości PropertyUrl. Ta właściwość określa, do jakiej strony trafi użytkownik po kliknięciu lewym przyciskiem myszy w tytuł. Tytuły nie są jednak odnośnikami do jakiejkolwiek strony.

Jak wyświetlić wszystkie rezultaty wyszukiwarki z linkami?

bool search_end = false, page_se = false;
byte page = 0; // Numer rezultatu

while (!search_end)
{
    try
    {
        while (!page_se)
        {
            try
            {
                Run title = new Run(phantomDriver.FindElements(By.ClassName("result")).ElementAt(page).FindElement(By.ClassName("title")).Text); // Tytuł strony
                Hyperlink hyperlink = new Hyperlink(title)
                {
                    NavigateUri = new Uri(phantomDriver.FindElements(By.ClassName("result")).ElementAt(page).FindElement(By.ClassName("url")).Text)
                };
                Results.Inlines.Add(hyperlink); // Results - Nazwa elementu TextBlock | Dodawanie linku
                Results.Text += Environment.NewLine;
                Results.Text += phantomDriver.FindElements(By.ClassName("result")).ElementAt(page).FindElement(By.ClassName("url")).Text + Environment.NewLine; // Dodawanie adresu URL
                Results.Text += phantomDriver.FindElements(By.ClassName("result")).ElementAt(page).FindElement(By.ClassName("desc")).Text + Environment.NewLine + Environment.NewLine; // Dodawanie opisu
                ++page; // Pobieranie danych z następnego wyniku
            }
            catch
            {
                page_se = true; // Koniec kopiowania informacji z obecnej strony wyszukiwarki
            }
        }
        phantomDriver.FindElement(By.ClassName("next")).Click(); // Przejście do następnej strony
        page = 0;
    }
    catch // Zamknięcie przeglądarki
    {
        phantomDriver.Quit();
        search_end = true;
    }
}

 

Link do komentarza
Udostępnij na innych stronach

  • 1 month later...

Firmy jak Google czy inne wyszukiwarki chronią się przed tym co chcesz osiągnąć, zrobisz za dużo zapytań to ci zablokują sesję, do tego typu rzeczy powinno się używać API danej usługi, ale wątpię czy ją udostępniają, bo to dla nich źródło zarobku, a ty chcesz to obchodzić.

Możesz próbować parsowania strony, klikania na dalsze wyniki, ale moim zdaniem na dłuższą metę Cię zablokują.

 

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...