Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / web crawler on pure Java? / 13 сообщений из 13, страница 1 из 1
04.06.2014, 15:18
    #38661557
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
Здравствуйте, нужно написать тестовое задание, а я что-то в примерах встречаю только работу с библиотеками-парсерами.

Подскажите из чего начать, где почитать, как это вообще делать с помощью только того что предлагает jdk?
Краткая суть - нужно полезть на веб страничку и оттуда достать все url, потому взять эти url и опять полезть в них и так пока не наберется первая 1000 урлов.

Спасибо.
...
Рейтинг: 0 / 0
04.06.2014, 15:31
    #38661575
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
Парсить, скорее всего, удобно через State Machine
Вот тут толково описано
http://wickedsource.org/2013/11/19/state-machine-with-java/
А вот пример гуглиться с пол пинка.
https://www.google.com/search?q=HTMLLinkExtractor.java
...
Рейтинг: 0 / 0
04.06.2014, 15:33
    #38661577
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
_webdev_,

1. Гуглишь regexp на предмет url (можешь с добавкой href=) и как из java считать страничку.
2. Придумываешь мапу в которой по нормализованному url сохраняется ее текст. И очередь страничек на анализ.
3. Считываешь первую страничку. Вытаскиваешь ссылки.
4. Нормализуешь их (большие-маленькие прибавка от первоначальной страницы)
5. Если в мапе пусто - загружаешь страничку по url, записываешь в мапу и ставишь в очередь на анализ.
6. goto 2
...
Рейтинг: 0 / 0
04.06.2014, 16:42
    #38661665
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
спасибо, почитаю и попробую.
...
Рейтинг: 0 / 0
04.06.2014, 17:01
    #38661699
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
_webdev_Здравствуйте, нужно написать тестовое задание, а я что-то в примерах встречаю только работу с библиотеками-парсерами.

Подскажите из чего начать, где почитать, как это вообще делать с помощью только того что предлагает jdk?
Краткая суть - нужно полезть на веб страничку и оттуда достать все url, потому взять эти url и опять полезть в них и так пока не наберется первая 1000 урлов.

Спасибо.
По поводу 1000 урлов.

Тут регулировка нужна. Например делать больше "поиск в ширину" чем в глубину. И фильтровать
ссылки повторы чтобы краулер повторно не бегал в те узлы где уже побывал. Плюс урлы должны
быть селективны. Например урл документа и урл того-же самого документа с printview=yes нужно
нормализовывать и игнорить. Плюс фильтровал урлы на картинки. Плюс фильтровать урлы на баннерные
сети. Да много еще чего накрутить.

Плюс эмулировать jscript по возможности.
...
Рейтинг: 0 / 0
04.06.2014, 23:00
    #38661994
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
mayton,

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

авторPlease send us the Java source code for a crawler which
- fetches the content for a given start URL
- extracts the links from the content.
- goes on to crawl the extracted links (back to step 1)
- the crawler should stop after 1000 found URLs

Please use only stuff which is already provided by the JDK.


ну и вот, если кому будет интересно мой примитивный crawler с коленки.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
package de.visualmeta;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Possible to do a lot safer and cleaner, but proceeded from the problem
 * statement. And it is not very concretized in some moments.
 * 
 * @author JDev
 *
 */
public class Crawler {

	private final String LINK_PATTERN= "\\(?\\b(http://|www[.])[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|]";
	private Pattern linkPattern = Pattern.compile(LINK_PATTERN, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

	private final String START_URL = "http://google.com/";

	private int linksArrayCounter = 0;

	private ArrayList<String> links = new ArrayList<String>();
	private int step = 0;

	public Crawler() {

		// I understand that there is a possible recursion.
		while (true) {
			if (links.isEmpty()) {
				parseLinksFromHtml(START_URL);
			} else if (linksArrayCounter < links.size()) {
				parseLinksFromHtml(links.get(linksArrayCounter));
				linksArrayCounter++;
			} else {
				linksArrayCounter = 0;
			}
			step++;
		}
	}

	private void parseLinksFromHtml(String stringUrl) {

		URL url;
		InputStream inputStream = null;
		BufferedReader bReader;
		String line;

		StringBuilder stringBuilder = new StringBuilder();

		try {
			url = new URL(stringUrl);
			inputStream = url.openStream();
			bReader = new BufferedReader(new InputStreamReader(inputStream));

			while ((line = bReader.readLine()) != null) {
				stringBuilder.append(line);
			}

			Matcher pageMatcher = linkPattern.matcher(stringBuilder.toString());

			while (pageMatcher.find()) {
				links.add(pageMatcher.group());
				if (links.size() >= 1000) {
					for (int i = 0; i < links.size(); i++) {
						System.out.println(i + 1 + "> " + links.get(i));
					}
					System.out.println("\n -------------------------------------\n Parsed 1000 links in " + step
							+ " steps \n -------------------------------------\n");
					System.exit(0);
				}
			}
		} catch (MalformedURLException muException) {
			muException.printStackTrace();
			linksArrayCounter++;
		} catch (IOException ioException) {
			ioException.printStackTrace();
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException ioException) {
			}
		}
	}

	public static void main(String[] args) {

		new Crawler();
	}
}
...
Рейтинг: 0 / 0
05.06.2014, 00:37
    #38662054
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
_webdev_,

while (true) без break внутри - нечитаемо
тот же самый system.exit(0) и у вас finally не выполнится.
поиск/добавление ссылок и их распечатка в stoud перемешаны
regexp какой-то слишком, можно было бы самому написать, и для 90% случаев подошел бы.
я не нашел проверки на однаковые ссылки при добавлении (вместо списка сделать множество как вариант)
вместо списка возможно было бы сделать более лаконично через очередь.
...
Рейтинг: 0 / 0
05.06.2014, 01:07
    #38662071
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
no56892_webdev_,

while (true) без break внутри - нечитаемо
тот же самый system.exit(0) и у вас finally не выполнится.
поиск/добавление ссылок и их распечатка в stoud перемешаны
regexp какой-то слишком, можно было бы самому написать, и для 90% случаев подошел бы.
я не нашел проверки на однаковые ссылки при добавлении (вместо списка сделать множество как вариант)
вместо списка возможно было бы сделать более лаконично через очередь.

интересные замечания.

- да, и куда вы предложите его всунуть? Он по ходу никогда не сработает.
- вот это правильно подметили перенес System.exit(0); в finally.
- распечатку вынес в finally. также
- вынужден согласиться, сейчас некогда самому кумекать, да и пишу я их редко, так что пришлось бы посидеть немножко.
- Множество? Не сориентируете на нужную структуру данных? HashSet, TreeSet? Где-то читал о разнице, но уже и не вспомню.
- вы имеете в виду queue? Чем же она лаконичней?

Спасибо.
...
Рейтинг: 0 / 0
05.06.2014, 01:10
    #38662072
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
regexp какой-то странный. Зачем там "www." непонятно.
...
Рейтинг: 0 / 0
05.06.2014, 09:26
    #38662194
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
maytonregexp какой-то странный. Зачем там "www." непонятно. - написал выше, чтоб сейас колдовать regexp нету времени, нашел на просторах такой. ))))
...
Рейтинг: 0 / 0
05.06.2014, 10:37
    #38662272
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
у Шилдта целая глава посвящена веб-краулеру http://www.jamesholmes.com/TheArtOfJava/ Там можно скачать как текст так и исходники
...
Рейтинг: 0 / 0
05.06.2014, 10:47
    #38662286
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
...
Рейтинг: 0 / 0
05.06.2014, 11:14
    #38662330
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
web crawler on pure Java?
забыл нику Шилдта целая глава посвящена веб-краулеру http://www.jamesholmes.com/TheArtOfJava/ Там можно скачать как текст так и исходники
fixxer Пример из книги Algorithms of the Intelligent Web (есть перевод ) - спасибо большое, но это небольшое тестовое задание, которое мне нужно отправить на фирму, и не думаю, что это будет хороший ход, скопировать или хотя бы частично скопировать из книги. Что придумал, то придумал.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / web crawler on pure Java? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]