Jump to content



Photo

WebRequest and WebResponse has issues


  • Please log in to reply
10 replies to this topic

#1 Complete

Complete

    Neowinian

  • Joined: 07-January 06

Posted 24 October 2012 - 07:43

WebRequest and WebResponse has issues

I wrote a C# program that uses WebRequest and WebResponse to perform a simple web crawler. I discovered something about web sites. Web browsers such as IE and FireFox offer the capacity to view the HTML source code. But it seems that html code that is sent to the browser is one thing and what the browser interprets and displays is something else. For example, if you run a google search in IE and run the same google search in FireFox, the content that you can see when you view the source in IE will NOT have the hyperlinks and content from the search results, but you can see the html hyperlinks and content from the search results when you view the source in FireFox. So my question is this. How do you specialise the WebRequest and WebResponse to show the content after it is processed by the browser instead of before?


#2 +Nik L

Nik L

    Where's my pants?

  • Tech Issues Solved: 2
  • Joined: 14-January 03

Posted 24 October 2012 - 08:13

I am not sure you understand what you're saying...

#3 ZakO

ZakO

    Neowinian

  • Tech Issues Solved: 2
  • Joined: 21-September 07
  • Location: Finland

Posted 24 October 2012 - 09:11

It's not an 'issue', it's by design. It's not the responsibility of WebRequest/WebResponse to execute client-side scripts, no content loaded by XHR requests will be returned, just the original HTML document. I believe if you want to return the HTML after it's been modified by a client-side script you would need to use a full web browser control rather than a WebRequest.

#4 Eric

Eric

    Neowinian Senior

  • Tech Issues Solved: 12
  • Joined: 02-August 06
  • Location: Greenville, SC

Posted 25 October 2012 - 14:49

*WebResponse and *WebRequest only retrieve and send data. You'll have to either parse it yourself or run it through the WebBrowser control to get the final rendered result.

#5 OP Complete

Complete

    Neowinian

  • Joined: 07-January 06

Posted 28 October 2012 - 05:50

I think I will have to use the WebBrowser class instead.

How do I expose the LoadCompleted method in the WebBrowser class in WPF C#?

I am trying to write a C# program in wpf that retrieves the content of a web page.

The first thing I tried was to try the WebRequest and WebResponse classes. This did not provide the actual displayed content. WebResponse reveils the HTML code that is sent to the browser. But I discovered that, while the page is being loaded by the browser, javascript can change what content is finally displayed in the browser.

So I decided to use the WebBrowser class.

Immediately I found that there are two WebBrowser classes. Thee is the one that is documented for WinForms and there is another that is documented for WPF. I need to understand the one documented for WPF. What I think I neeed to know what to do is to retrieve code after the "LoadCompleted" method is caused. But I do not know how to this and I cannot find any example demonstrating how this is done.

#6 Eric

Eric

    Neowinian Senior

  • Tech Issues Solved: 12
  • Joined: 02-August 06
  • Location: Greenville, SC

Posted 28 October 2012 - 14:36

In whatever class you're hosting the control in (Page, Window, etc) you need to add a handler. You can either put it in the class's initialization routine as
myBrowser.LoadCompleted += WebBrowser_LoadCompleted
or put it in the XAML in the WebBrowser declaration.
<WebBrowser Name="myBrowser" LoadCompleted="WebBrowser_LoadCompleted"/>


#7 OP Complete

Complete

    Neowinian

  • Joined: 07-January 06

Posted 30 October 2012 - 12:05

I am getting close to solving this and having a working bit of code. As things stand right now, the call back function for LoadCompleted is not called with the code is stepped through.

Why doesn't this call back function get called?
Basically here is the code surrounding the declaratoini callback method:
webbrowser1 = new WebBrowser();
webbrowser1.LoadCompleted +=webbrowser1_LoadCompleted;
webbrowser1.Navigate(new Uri([url="http://www.google.com"]http://www.google.com[/url]"));
Should there be something more or are they in the wrong order?
The method, webbrowser1_LoadCompleted, is never called. I have put breakpoints in the callback method and the running program never reaches this method:
		 void webbrowser1_LoadCompleted(object sender, NavigationEventArgs e)
		{
			.
			.
			.
		}
I must be missing a reference. I do not know what one I am missing. Can you offer a suggestion?

By the way, that [url] block above is placed there by the editor on this forum, it is not how my code actually looks like

#8 Eric

Eric

    Neowinian Senior

  • Tech Issues Solved: 12
  • Joined: 02-August 06
  • Location: Greenville, SC

Posted 31 October 2012 - 14:11

I tested it with the following:
WebBrowser b = new WebBrowser();
b.Loaded += b_Loaded;
b.Navigated += b_Navigated;
b.LoadCompleted += b_LoadCompleted;
b.Navigate(http://microsoft.com);


It seems to fire those three events in that order: Loaded, Navigated, then LoadCompleted. LoadCompleted doesn't fire until the entire page's content is completely downloaded.

Yeah, the code tags are dumb. There should be quotes around the Uri string.

#9 OP Complete

Complete

    Neowinian

  • Joined: 07-January 06

Posted 07 November 2012 - 07:47

I tested it with the following:

WebBrowser b = new WebBrowser();
b.Loaded += b_Loaded;
b.Navigated += b_Navigated;
b.LoadCompleted += b_LoadCompleted;
b.Navigate(http://microsoft.com);


It seems to fire those three events in that order: Loaded, Navigated, then LoadCompleted. LoadCompleted doesn't fire until the entire page's content is completely downloaded.

Yeah, the code tags are dumb. There should be quotes around the Uri string.


I am close. It works but, at the same time it does not completly come through. When I use a google search page as a test. all the methods you mention are called, but the HTMLDocument I extract when these methods are fired contain the HTML from the home page of google.

Also, if I put breakpoints on these methods, at watch the output to see if the WebBroswer class loads the google results page, it does not. The page is blank until the program is idle.

What do you think?

#10 sathenzar

sathenzar

    Neowinian

  • Joined: 12-June 06

Posted 09 November 2012 - 16:58

If I am not mistaken it is because google uses ajax to load div content to show the results as you type and the load completed just will pull the html document that was originally loaded. If I use ajax requests and they change div content and then go to view source in any browser it will just show my original document.

#11 OP Complete

Complete

    Neowinian

  • Joined: 07-January 06

Posted 09 November 2012 - 21:09

using a few other methods and some "jigglery pokery" I finally got to the point where I could extract the HTMLDocument