C#中的简单网络爬虫

我已经创建了一个简单的网络爬虫,但我想添加递归函数,以便打开的每个页面都可以获取此页面中的url,但我不知道我该怎么做,我还想包含线程来制作它在这里更快,这是我的代码

namespace Crawler { public partial class Form1 : Form { String Rstring; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { WebRequest myWebRequest; WebResponse myWebResponse; String URL = textBox1.Text; myWebRequest = WebRequest.Create(URL); myWebResponse = myWebRequest.GetResponse();//Returns a response from an Internet resource Stream streamResponse = myWebResponse.GetResponseStream();//return the data stream from the internet //and save it in the stream StreamReader sreader = new StreamReader(streamResponse);//reads the data stream Rstring = sreader.ReadToEnd();//reads it to the end String Links = GetContent(Rstring);//gets the links only textBox2.Text = Rstring; textBox3.Text = Links; streamResponse.Close(); sreader.Close(); myWebResponse.Close(); } private String GetContent(String Rstring) { String sString=""; HTMLDocument d = new HTMLDocument(); IHTMLDocument2 doc = (IHTMLDocument2)d; doc.write(Rstring); IHTMLElementCollection L = doc.links; foreach (IHTMLElement links in L) { sString += links.getAttribute("href", 0); sString += "/n"; } return sString; } 

我修复了你的GetContent方法,如下所示,从抓取页面获取新链接:

 public ISet GetNewLinks(string content) { Regex regexLink = new Regex("(?<= newLinks = new HashSet(); foreach (var match in regexLink.Matches(content)) { if (!newLinks.Contains(match.ToString())) newLinks.Add(match.ToString()); } return newLinks; } 

更新

修复:正则表达式应该是regexLink。 感谢@shashlearner指出这一点(我的错误)。

我使用Reactive Extension创建了类似的东西。

https://github.com/Misterhex/WebCrawler

我希望它可以帮助你。

 Crawler crawler = new Crawler(); IObservable observable = crawler.Crawl(new Uri("http://www.codinghorror.com/")); observable.Subscribe(onNext: Console.WriteLine, onCompleted: () => Console.WriteLine("Crawling completed")); 

以下包括答案/建议。

我相信您应该使用dataGridView而不是textBox因为当您在GUI中查看它时,更容易看到找到的链接(URL)。

你可以改变:

 textBox3.Text = Links; 

  dataGridView.DataSource = Links; 

现在提出问题,你没有包括:

 using System. "'s" 

哪些被使用,因为如果我能得到它们将无法理解它将是值得赞赏的。

从设计的角度来看,我写了几个webcrawler。 基本上,您希望使用堆栈数据结构实现深度优先搜索。 您也可以使用广度优先搜索,但您可能会遇到堆栈内存问题。 祝好运。