«Шагаем» по интеренту

в 23:00, , рубрики: Песочница, метки: , , , ,

Здравствуйте. Меня зовут Алексей Набережный и я веб разработчик, который тесно «переплетен» с такими языками, как С#, Java. Многие все понимают, что такие поисковые сервисы как Яндекс и Google не ищут вам информацию динамично. То есть другими словами: «все уже давно в базе». Отсюда и выходят такие термины: поисковой индекс, ручной режим и тому подобное. Но сейчас я попробую не рассказывать о таких простых вещах. Будем говорить о заполнении этой базы данных автоматизировано, то есть так, чтобы и видеть происходящие, и заносить себе на компьютер (ftp сервер) информацию о сайтах.

image

Что мы будем делать:

  • Робот-паук
  • Обработчик

Теория

Немного никакой теории, которая будет отражать суть происходящего. В интернете мы каждый день переходим по новым ссылкам, но сомневаюсь, что кто-нибудь задумывается о таких вещах, как сканирование интернета. Да, именно в этом и заключается суть этой публикации. Грубо — мы загружаем страницу и видим все: ее ссылки, «title», контент. Допустим, что сохранили всю нужную нам информацию и добавляем в стек новые сайты, которые нужно посетить, предварительно посмотрев «на бывшие» для возможного удаления. Кстати, тут может возникнуть идея рекурсии, потому что это самый простой вариант, но опыт показывает, что именно такая реализация не проходит. Остается стек…

Работаем

Итак, приступим. Писать будем на языке C#, которых идеально подходит для таких целей. Придумывать свой велосипед не будем. Поэтому просто воспользуемся таким компонентом, как WebBrowser. Он полностью заменит наш двухколесный bike.

Создадим класс:

using System;
using System.Collections.Generic;
using System.Web;
using  mshtml; //Библиотека для скачивания картинок из document #нужно 
namespace TestProject
{
  static public class Work // Для логирования
	{
		static private ListBox loger = null;
		static public void SetLoger(ListBox control) {
			loger = control;
			return;
		}
		
		static public int CountLoger() {
			
			return loger.Items.Count;
		}
		static public void NullLoger() {
			loger.Items.Clear();
			return;
		}
		static public void WriteLine(String str) {
			if(!(loger == null))
				loger.Items.Add(str);
		}
	}
	
	public class WebWork
	{
		private bool begin = false; // для будущего таймера
		private List<string> links = new List<string>();// лист ссылок
		private List<String> list = new List<string>(); // просто <Восклицание>лист</Восклицание>. Сохранение истории
                public string url;
		WebBrowser web = null;
                public WebWork()
		{
			web = new WebBrowser();
			web.ScriptErrorsSuppressed = true; //Избавление от нудных ошибок скриптов
			web.DocumentCompleted += WebBrowserCompleted;
		}
        }
}

Основное мы будем писать именно здесь. Так, теперь добавляем метод, который будет посылать запрос.

public void Change(String url) {
		this.url = url;
		web.Navigate(url);//переход	
}

Все теперь самое главное. Загружаем. Ищем. Добавляем в стек:

void WebBrowserCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
		{
	
			begin = true;
			
			if(list.Contains(web.Url.ToString())) {
				return;
			}
			Work.WriteLine("Begin to parse this site ( " + this.site + " )");
			this.logo = web.Document.Title;
			this.title = this.logo;
			if(Work.check_title(this.logo)) { // проверка на простоту
				this.logo = this.site;	
			}
			list.Add(web.Url.ToString());
			HtmlElementCollection linkA = web.Document.GetElementsByTagName("a");
			links.Clear();
			foreach(HtmlElement a in linkA) {
				if(a.GetAttribute("href") != "")
					links.Add(a.GetAttribute("href"));
			}
			
			linklib = new Link(this.links , this.site); // класс, который принимает все ссылки
			
			Work.WriteLine("Finish parse links ( " + this.site + " )" );
			
			Img images = null;
			if(web.Document.GetElementsByTagName("a").Count != 0) {
				System.Drawing.Bitmap f = Work.GetHeader(web.Document); // Взять логотип
				images = new Img(f);
			}
			Work.WriteLine("Finish parse image ( " + this.site + " )" );
			Work.WriteLine("Finish ( " + this.site + " )" );
			
                        begin = false;
			ExClass.End_Parse(logo , linklib , images , title); // Это может быть в любом другом месте.
		}
static public void End_Parse(String site, Link link , Img img , String title) {
			resource = link;
			images = img;
			Work.WriteLine("ADD:");
			for(int i = 0; i < resource.Len(); i++) {
				if((resource.Item(i)!="")&&(!(AllUrl.Contains(resource.Item(i))))) {
					AllUrl.Add(resource.Item(i));
					Work.WriteLine((i+1).ToString() + " : " + resource.Item(i));
				}
			}
			Work.WriteLine("____________________________");
			if(Work.CountLoger() > 100) {
				Work.NullLoger(); // по желанию
			}
			
			String title_min = title.ToLower();
			StreamWriter wr = new StreamWriter("data\" + title_min + "-DESCRIPTION.txt");
			wr.WriteLine("URL : " + work.url);
			wr.WriteLine("TITLE : " + title);
			wr.Close();
			if(img != null) img.GetImage().Save(title_min + ".jpg");
		}

! Этот магический класс Work могу предоставить.

Почти конец

Остались самые интересные печеньки. Это начать наши «похождения» с какой-то точки:

		static private List<String> AllUrl = new List<String>(); // Это и есть основной стек

WebWork work = new WebWork();
Work.SetLoger(listBox1);
Work.WriteLine("Start... ( http://any )");
work.Change("http://any");

void TickTack(object sender, EventArgs e) // Так как WebBrowserCompleted - событие, то нужно мониторить. Криво, но работает
	{	
		if((work.begin == false)&&(AllUrl.Count > count)) {
			Work.WriteLine((count+1).ToString() + " : Start ( " + AllUrl[count] + " ) ");
			work.Change(AllUrl[count]);
			count++;
		}
	}

Замечания

Все было написано давно, поэтому скажите, где присутствует:

  • Неправильный комментарий
  • Очень-очень глупое название
  • Что-то кривое

Завершение

Все, код с комментариями написан. Правда, очень многие методы не определены при вас, но это пример, так что прошу кидать шапками понять. И это не помешает вам создавать yandex.ru, google.com.

Возможно, этот метод неправильный, неполноценный, но это входило в часть моего проекта и очень мне помогло. Потому что через два дня я уже имел много информации о различных страницах.

Надеюсь, ваш паук не зайдет на какие-либо «плохие» сайты. Удачи.


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js