#

C#, WPF: WebScraping mit Remote WebBrowser Control
 
Das folgende Beispiel steuert einen Webbrowser zu einer Webseite, setzt einen Wert und liest das Ergebnis an einer anderen Stelle aus.
Im Beispiel handelt es sich um die Google Translate Webseite, welche mit dynamischen Daten zur Laufzeit arbeitet.
Das heißt, die Seite wird nicht mit einem klassischen Post-Webform übertragen, sondern die Daten werden während der Laufzeit mit Get zu Google übertragen und das Ergebnis wird in dem Result-Element angezeigt.
Ein einfacher Webclient kann hier keine Arbeit ausführen, da Webrequest und Webclient nur Strings und Streams lesen.
 
Die Handhabung des WebBrowsers unter WPF ist sehr einfach.
Schritt 1: man steuert den Webbrowser mit .navigate(URL) zu einer Webseite
Schritt 2: man ermittelt das webbroser.document als HTML-Document.
Schritt 3: dann sucht man ein Element im Document und weist diesem einen InnerText zu
Schritt 4: nach einer kurzen Wartezeit ermittelt man das Ergebnis-Feld und liest auch hier den InnerText aus.
 
 
Schritt 0: Definieren eines lokalen HTMLDocuments

//< locals >
mshtml.HTMLDocument doc;
//</ locals >

 
Schritt 1: Ansteuern einer Webseite

String sURL = "http://translate.google.com?hl=en#de/en/";
ctlBrowser.Navigate(sURL);

 
Schritt 2: Ermitteln und übernehmen des Browser Dokuments

//*set and get Translation
doc= (mshtml.HTMLDocument)ctlBrowser.Document;

 
Schritt 3: Setzen eines Wertes
Action ist nicht nötig

private void set_Translation()
{
//-------------------< set_Translation() >-------------------
//*textarea id=source
mshtml.IHTMLElement textArea_Source = doc.getElementById("source");
 
textArea_Source.innerText = "Mein Name ist Raimund Popp";
 
//-------------------</ get_Results() >-------------------
}

 
Schritt 4: Lesen des Ergebnisses

private void get_Translation()
{
//-------------------< set_Translation() >-------------------
//*textarea id=result_box
mshtml.IHTMLElement textArea_Result = doc.getElementById("result_box");
if (textArea_Result != null)
{
String sResult = textArea_Result.innerText;
MessageBox.Show("Result=" + sResult);
}
//-------------------</ get_Results() >-------------------
}

 
 
Betrifft: Windows, WPF, WebBrowser Control, Ajax, WebClient

 
 
 
Als Video Anleitung

 
 
 
C# Code des Beispiels

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
//----< Namespaces >----
//using HtmlAgilityPack;
//----</ Namespaces >----
 
namespace Browser
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
//< locals >
mshtml.HTMLDocument doc;
//</ locals >
 
#region ====< Form >====
public MainWindow()
{
InitializeComponent();
}
#endregion ====</ Form >====
 
#region =====< Buttons >====
private void btnStart_Click(object sender, RoutedEventArgs e)
{
//-------------------< btnStart_Click() >-------------------
//*opens website
String sURL = "http://translate.google.com?hl=en#de/en/";
ctlBrowser.Navigate(sURL);

//-------------------</ btnStart_Click() >-------------------
}
 
private async void btnTranslate_Click(object sender, RoutedEventArgs e)
{
// -------------------< btnTranslate_Click() > -------------------
//*set and get Translation
doc= (mshtml.HTMLDocument)ctlBrowser.Document;
set_Translation();
//----< wait 1 second >----
await Task.Delay(1000);
//----</ wait 1 second >----
 
//----< wait doc.complete >----
DateTime dtStart = DateTime.Now;
while (doc.readyState != "complete")
{
if ((DateTime.Now- dtStart).Seconds > 5) break;
await Task.Delay(1);
}
//----</ wait doc.complete >----
 
get_Translation();
//-------------------</ btnTranslate_Click() >-------------------
}
#endregion =====</ Buttons >====
 
private void set_Translation()
{
//-------------------< set_Translation() >-------------------
//*textarea id=source
mshtml.IHTMLElement textArea_Source = doc.getElementById("source");
 
textArea_Source.innerText = "Mein Name ist Raimund Popp";
 
//-------------------</ get_Results() >-------------------
}
 
private void get_Translation()
{
//-------------------< set_Translation() >-------------------
//*textarea id=result_box
mshtml.IHTMLElement textArea_Result = doc.getElementById("result_box");
if (textArea_Result != null)
{
String sResult = textArea_Result.innerText;
MessageBox.Show("Result=" + sResult);
}
//-------------------</ get_Results() >-------------------
}
 
 
}
}
 

 
 
Xaml Code des WebBrowser Beispiels

<Window x:Class="Browser.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Browser"
mc:Ignorable="d"
Title="MainWindow" Height="627.2" Width="1165.8">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="46*"/>
<RowDefinition Height="275*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal">
<Button x:Name="btnStart" Width="73" Click="btnStart_Click" >
<TextBlock>Goto<LineBreak></LineBreak>Website</TextBlock>
</Button>
<Button x:Name="btnTranslate" Content="Translate" Width="73" Click="btnTranslate_Click" />
</StackPanel>
 
<WebBrowser Name="ctlBrowser" Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
 
 
</Grid>
</Window>
 

 
Mobile

.

0123movie.net