簡単なWebクローラーを作成しましたが、開いたすべてのページでこのページの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<string> GetNewLinks(string content)
{
Regex regexLink = new Regex("(?<=<a\\s*?href=(?:'|\"))[^'\"]*?(?=(?:'|\"))");
ISet<string> newLinks = new HashSet<string>();
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"
どれが使われたかわかりませんが、入手できれば幸いです。
設計の観点から、いくつかのWebクローラーを作成しました。基本的には、スタックデータ構造を使用して深さ優先検索を実装します。幅優先検索も使用できますが、スタックメモリの問題が発生する可能性があります。幸運を。