【发布时间】:2012-05-04 16:32:08
【问题描述】:
我创建了一个简单的网络爬虫,但我想添加递归功能,以便打开的每个页面我都可以获取此页面中的 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;
}
【问题讨论】:
-
投票结束,因为问题范围不大。请考虑搜索“C# 中的网络爬虫”并将您的问题提炼为更有针对性。
-
您绝对不想使用递归,因为您将无法在本地堆栈上保存互联网的状态。您可以按照 Tom 的建议使用 Stack,但您应该反转添加 AbsoluteUris 进行爬取的顺序,否则堆栈的性质将使您从页面底部爬取,如果您要编写爬虫程序,则需要使检索行为尽可能与浏览器匹配.队列是更好的选择。 PriorityQueue 是一个更好的队列。
-
PriorityQueue svn.arachnode.net/svn/arachnodenet/trunk/Structures/… 用户名/密码:公开/公开
标签: c# web-crawler