2012-05-04 16 views
8

मैं एक सरल वेब क्रॉलर बनाया है, लेकिन मैं प्रत्यावर्तन समारोह जोड़ना चाहते हैं ताकि हर पेज खोला जाता है कि मैं इस पेज में यूआरएल प्राप्त कर सकते हैं, लेकिन मैं पता नहीं कैसे मैं ऐसा कर सकते हैं है और मैं भी चाहता हूँ बनाने के लिए धागे शामिल करने के लिए यह तेजी से यहाँ यह मेरे कोड हैसी # में सरल वेब क्रॉलर

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; 
     } 
+0

अच्छी तरह से स्कॉप्ड प्रश्न के रूप में बंद करने के लिए वोट दें। कृपया "सी # में वेब क्रॉलर" के लिए खोज और आप अधिक लक्षित होने के सवाल को परिष्कृत करने पर विचार करें। –

+0

आप निश्चित रूप से प्रत्यावर्तन का उपयोग करने के रूप में आप स्थानीय stack.You पर इंटरनेट के राज्य धारण करने के लिए एक ढेर इस्तेमाल कर सकते हैं के रूप में टॉम सुझाव में सक्षम नहीं होगा नहीं करना चाहती है, लेकिन आप जिस क्रम में आप के लिए AbsoluteUris जोड़ने रिवर्स चाहिए क्रॉल, और ढेर की प्रकृति आप पृष्ठ के नीचे से रेंगने और आप एक क्रॉलर आप पुनः प्राप्ति व्यवहार को यथासंभव एक ब्राउज़र से मेल करने की जरूरत है लिखने के लिए जा रहे हैं होगा। एक कतार एक बेहतर विकल्प है। एक प्राथमिकता क्यूई एक बेहतर भी है। –

+0

PriorityQueue https://svn.arachnode.net/svn/arachnodenet/trunk/Structures/PriorityQueue.cs उपयोगकर्ता नाम/पासवर्ड: सार्वजनिक/सार्वजनिक –

उत्तर

8

मैं अपने 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 इसे इंगित करने के लिए (मेरा गलत टाइप)।

+0

एचटीएमएल पार्सिंग के लिए regexes का उपयोग कर की समस्या से बचना लेकिन वह काफ़ी मेल करने के लिए विफल रहता है। –

+1

regexLink यहाँ क्या है? – SLearner

+0

regex regex होना चाहिए लिंक, धन्यवाद @shashlearner –

2

निम्नलिखित एक जवाब/सिफारिश भी शामिल है।

मेरा मानना ​​है कि आपको के बजाय dataGridView का उपयोग करना चाहिए, जब आप इसे GUI में देखते हैं तो यह लिंक (यूआरएल) को देखना आसान होता है।

आप को बदल सकता है:

textBox3.Text = Links; 

को
dataGridView.DataSource = Links; 
प्रश्न के लिए

अब, आप शामिल नहीं किया है:

using System. "'s" 

हैं, इस्तेमाल किया गया के रूप में यह हो सकता है जो सराहना की अगर मैं उन्हें प्राप्त कर सकता हूं क्योंकि इसे समझ नहीं सकता है।

0

एक डिजाइन दृष्टिकोण से, मैं कुछ webcrawlers लिखा है। मूल रूप से आप एक स्टैक डेटा संरचना का उपयोग कर गहराई पहली खोज को कार्यान्वित करना चाहते हैं। आप ब्रेडथ फर्स्ट सर्च का भी उपयोग कर सकते हैं, लेकिन आप संभवतः स्टैक मेमोरी के मुद्दों में आ जाएंगे। सौभाग्य।

+2

मुझे लगता है कि ओपी अधिक जानकारी मांग रहा है। –

7

मैं 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")); 
+2

वाह! यह कुछ सुंदर सीधा वाक्यविन्यास है। क्या यह बहुप्रचारित है? जो भी मामला है, पचाने में बहुत आसान है- जावास्क्रिप्ट की तरह बहुत कुछ दिखता है। – FredTheWebGuy

संबंधित मुद्दे