Вопрос по c#, web-crawler – Простой веб-сканер в C #

10

Я создал простой веб-сканер, но я хочу добавить функцию рекурсии, чтобы на каждой открытой странице я мог получить 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;
        }
Посмотрите здесь:neelbhatt40.wordpress.com/2016/07/19/webcrawler-in-c-net Neel
PriorityQueuesvn.arachnode.net/svn/arachnodenet/trunk/Structures/…  Имя пользователя / Пароль: Public / Public arachnode.net
Проголосуйте, чтобы закрыть вопрос. Пожалуйста, рассмотрите возможность поиска & quot; веб-сканера в C # & quot; и уточнение вашего вопроса, чтобы быть более целенаправленным. Alexei Levenkov
Вы определенно не хотите использовать рекурсию, поскольку вы не сможете удерживать состояние Интернета в локальном стеке. Можно использовать стек, как предложил Том, но вам следует изменить порядок, в котором вы добавляете AbsoluteUris, чтобы сканируется, иначе природа стека заставит вас сканировать в нижней части страницы, и если вы собираетесь написать сканер, вам нужно, чтобы поведение поиска соответствовало браузеру как можно ближе. Очередь - лучший выбор. A PriorityQueue еще лучше. arachnode.net

Ваш Ответ

4   ответа
8

чтобы получить новые ссылки с просканированной страницы:

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

Updated

Исправлено: регулярное выражение должно быть regexLink. Спасибо @shashlearner за указание на это (мой опечатка).

Избегать проблемы использования регулярных выражений для разбора HTML, но это не совсем подходит.
Error: User Rate Limit Exceeded
regex должен быть regexLink, спасибо @shashlearner за то, что указал на это
Что такое regexLink здесь?
0

я написал несколько веб-сканеров. По сути, вы хотите реализовать поиск в глубину с использованием структуры данных стека. Вы также можете использовать поиск по ширине, но, скорее всего, у вас возникнут проблемы со стековой памятью. Удачи.

Error: User Rate Limit Exceeded
7

Реактивное расширение.

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"));
Вот Это Да! Это довольно простой синтаксис. Это многопоточность? В любом случае, очень легко переварить - очень похоже на javascript.
2

Я считаю, что вы должны использоватьdataGridView вместоtextBox поскольку, когда вы смотрите на это в графическом интерфейсе, легче увидеть найденные ссылки (URL).

Вы можете изменить:

textBox3.Text = Links;

в

 dataGridView.DataSource = Links;  

Теперь к вопросу, вы не включили:

using System.  "'s"

какие из них использовались, и было бы признательно, если бы я мог получить их так, как не могу понять.

Похожие вопросы