Click here to Skip to main content
11,790,613 members (61,975 online)
Click here to Skip to main content

A Web Spider Library in C#

, 18 Sep 2007 CPOL 195.1K 12.8K 165
Rate this:
Please Sign up or sign in to vote.
An article about a spider library to grab websites and store them locally

Sample Image - ZetaWebSpider.png

Don't fear, it's just a web spider Wink | ;-)


Today, while looking through some older code, I came across a set of classes I wrote at the beginning of this year for a customer project.

The classes implement a basic web spider (also called "web robot" or "web crawler") to grab web pages (including resources like images and CSS), download them locally and adjust any resource hyperlinks to point to the locally downloaded resources.

While this article is not a full-featured article with detailed explanations as I usually like to write, I still want to put the code online with this short article. Maybe some reader can still take some ideas from this code and use it as a starting point for his own project.


The classes allow for synchronous as well as asynchronous download of the web pages, allowing multiple options to be specified like hyperlink-depth to follow and proxy settings.

The downloaded resources get their own new file names, based on the hash code of the original URL. I did this for simplifications (for me as the programmer).

To parse a document, I am using the SGMLReader DLL from the GotDotNet website.

Also, since I didn't need it for the project I wrote, the library does not care about "robots.txt" or throttling or other features.

Using the Code

The download for this article contains the library ("WebSpider") and a testing console application ("WebSpiderTest"). The testing application is rather short and should be rather easy to understand.

Basically, you do create an instance of the WebSiteDownloaderOptions class, configure several parameters, create an instance of the WebSiteDownloader class, optionally connect event handlers and then tell the instance to either start synchronously or asynchronously processing the given URL.


  • 2007-09-17: Fixed several issues
  • 2006-09-10: Initial release of the article


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Uwe Keim
Chief Technology Officer Zeta Producer Desktop CMS
Germany Germany
Uwe does programming since 1989 with experiences in Assembler, C++, MFC and lots of web- and database stuff and now uses ASP.NET and C# extensively, too. He has also teached programming to students at the local university.

In his free time, he does climbing, running and mountain biking. Recently he became a father of a cute boy.

Some cool, free software from us:

German Developer Community  
Free Test Management Software - Intuitive, competitive, Test Plans. Download now!  
Homepage erstellen - Intuitive, very easy to use. Download now!  
Send large Files online for free by Email

You may also be interested in...

Comments and Discussions

QuestionYou can also find another workaround here Pin
Winston Gubantes5-Mar-14 4:56
memberWinston Gubantes5-Mar-14 4:56 
Generaldoesn't work correctly in indexof: based sites Pin
Arpit sharma2-Apr-11 4:27
memberArpit sharma2-Apr-11 4:27 
GeneralProblem In SGML Pin
Arpit sharma27-Dec-10 4:23
memberArpit sharma27-Dec-10 4:23 
GeneralIssue following links Pin
StubbsPKS26-Oct-10 6:07
memberStubbsPKS26-Oct-10 6:07 
First let me say that this webspider is wonderful.

One issue that I am facing is that many of the links I am searching for are of the format:

<a href="javascript:if(confirm(''))window.location=''" tppabs="" target="_blank" class="STYLE13">Link Text</a>

This gets converted into H341DC.html (or the like), but that file obviously does not exist. This causes my parser that I run over the captured files to then tell me I have a broken link.

I am at a loss where I should look to try and change this behavior. I am currently poking around any references to LinkElements, but I haven't really turned anything up yet.
AnswerRe: Issue following links Pin
StubbsPKS26-Oct-10 7:31
memberStubbsPKS26-Oct-10 7:31 
GeneralRe: Issue following links Pin
Uwe Keim26-Oct-10 8:41
mvpUwe Keim26-Oct-10 8:41 
GeneralMy vote of 2 Pin
daveauld19-Jun-10 23:51
memberdaveauld19-Jun-10 23:51 
GeneralRe: My vote of 2 Pin
Kevin Yochum9-Aug-10 7:59
memberKevin Yochum9-Aug-10 7:59 
GeneralRe: My vote of 2 Pin
Uwe Keim9-Aug-10 19:39
mvpUwe Keim9-Aug-10 19:39 
General3k Pin 0:03 0:03 
General.STATE File Pin
Member 441033831-Oct-09 11:46
memberMember 441033831-Oct-09 11:46 
GeneralMy vote of 1 Pin
babakzawari20-Oct-09 0:23
memberbabakzawari20-Oct-09 0:23 
GeneralWeb Spider Issue Pin
Member 4747242-Sep-09 22:17
memberMember 4747242-Sep-09 22:17 
GeneralRe: Web Spider Issue Pin
Uwe Keim2-Sep-09 22:29
sitebuilderUwe Keim2-Sep-09 22:29 
Generalxml site map Pin
Rohit_kakria10-Aug-09 1:51
memberRohit_kakria10-Aug-09 1:51 
GeneralJust Links [modified] Pin
Sosyopat30-Jul-09 10:18
memberSosyopat30-Jul-09 10:18 
GeneralRe: Just Links Pin
Uwe Keim30-Jul-09 19:22
sitebuilderUwe Keim30-Jul-09 19:22 
GeneralThe remote server returned an error: (403) Forbidden Pin
kakakkakka21-Jul-09 1:00
memberkakakkakka21-Jul-09 1:00 
GeneralRe: The remote server returned an error: (403) Forbidden Pin
Uwe Keim21-Jul-09 1:20
sitebuilderUwe Keim21-Jul-09 1:20 
Generalquestion plz Pin
naroqueen22-May-09 19:22
membernaroqueen22-May-09 19:22 
Generalnice spider and nice code Pin
psyhf21-Mar-09 20:03
memberpsyhf21-Mar-09 20:03 
QuestionI am getting an unhandled exception while running the test project Pin
Member 47118243-Jun-08 9:47
memberMember 47118243-Jun-08 9:47 
GeneralException Running Test Pin
cornix430-Apr-08 9:49
membercornix430-Apr-08 9:49 
Generalso good Pin
okzhuce28-Apr-08 20:18
memberokzhuce28-Apr-08 20:18 
GeneralRe: so good Pin
Uwe Keim28-Apr-08 20:43
sitebuilderUwe Keim28-Apr-08 20:43 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.1509028.1 | Last Updated 19 Sep 2007
Article Copyright 2006 by Uwe Keim
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid