Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 29455|Відповідь: 11

[Вихідний код Java] Java-версія веб-краулера

[Копіювати посилання]
Опубліковано 30.11.2014 16:56:56 | | | |
[mw_shl_code=java,true]/**
* @author Jack.Wang
*
*/
імпорт java.io.BufferedReader;
імпорт java.io.InputStreamReader;
імпорт java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

Пошук веб-краулерів
public class SearchCrawler реалізує Runnable {

/*
  * disallowListCache cache robot не дозволяє шукати URL. Протокол Robot встановлює robots.txt файл у кореневій директорії вебсайту,
  * Вказує, які сторінки сайту доступні для пошуку з обмеженим пошуком.
  * Пошукова програма повинна пропускати ці ділянки під час пошуку, ось приклад robots.txt:
  * # robots.txt для http://somehost.com/ User-agent:
  * Заборонено: /cgi-bin/
  * Заборонено: /реєстрація # Заборонити роботів на сторінці реєстрації
  * Заборони: /login
  */

private HashMap<String, ArrayList<String>> disallowListCache = новий HashMap<рядок, ArrayList<String>>();
<String> ArrayList errorList = новий ArrayList<String>(); Повідомлення про помилку
<String> Результат ArrayList = новий ArrayList<String>(); Результати пошуку
String startUrl; Відправна точка для пошуку
int maxUrl; Максимальна кількість оброблених URL
String searchString; Рядки для пошуку
булева відмінкаЧутлива = хибна; Чи варто враховувати регітри
булева межаHost = хибна; Чи варто шукати в межах обмеженого хоста

public SearchCrawler(String startUrl, int maxUrl, String searchString) {
  this.startUrl = startUrl;
  this.maxUrl = maxUrl;
  this.searchString = searchString;
}

public<String> ArrayList getResult() {
  результат повернення;
}

публічний запуск() { // Почати пошукову тему
  crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}

Визначити форматування URL
private URL verifyUrl(String url) {
  Обробляються лише HTTP-URL.
  if (!url.toLowerCase().startsWith("http://"))
   return null;
  URL verifiedUrl = null;
  try {
   verifiedURL = новий URL(url);
  } catch (Виняток e) {
   return null;
  }
  повернути verifiedUrl;
}

Визначає, чи дозволяє робот доступ до заданої URL.
private boolean isRobotAllowed(URL urlToCheck) {
  String host = urlToCheck.getHost().toLowerCase(); Візьміть хоста, який дає RUL
  System.out.println("host="+host);

  Отримайте кеш URL, які ваш хост не дозволяє шукати
  <String> ArrayList disallowList = disallowListCache.get(host);

  Якщо у вас ще немає кешу, завантажте і кешуйте його.
  якщо (disallowList == null) {
   disallowList = новий <String>ArrayList();
   try {
    URL robotsFileUrl = новий URL("http://" + хост + "/robots.txt");
    BufferedReader = новий BufferedReader(
      новий InputStreamReader(robotsFileUrl.openStream()));

    Прочитайте файл робота, щоб створити список шляхів, до яких не дозволено звертатися.
    Струнна лінія;
    тоді як ((лінія = reader.readLine()) != null) {
     if (line.indexOf("Disallow:") == 0) {// Чи містить він "Disallow:"
      String disallowPath = line.substring("Disallow:"
        .довжина()); Знайдіть шлях до забороненого доступу

      Перевірте наявність анотувань.
      int commentIndex = disallowPath.indexOf("#");
      якщо (commentIndex != -1) {
       disallowPath = disallowPath.substring(0,
         commentIndex); Видалити коментар
      }

      disallowPath = disallowPath.trim();
      disallowList.add(disallowPath);
     }
    }

    Кеш-шляхи, до яких цей хост не має доступу.
    disallowListCache.put (host, disallowList);
   } catch (Виняток e) {
    Повернення True; У кореневій директорії сайту немає robots.txt файлів, і він повертає true
   }
  }

  String file = urlToCheck.getFile();
  System.out.println("Файл getFile()="+file);
  для (int i = 0; я < disallowList.size(); i++) {
   String disallow = disallowList.get(i);
   if (file.startsWith(disallow)) {
    повернення хибно;
   }
  }

  Повернення True;
}

private String downloadPage(URL pageUrl) {
  try {
   Відкрийте з'єднання з URL для читання.
   BufferedReader = новий BufferedReader(новий InputStreamReader(
     pageUrl.openStream()));

   Прочитай сторінку в буфері.
   Струнна лінія;
   StringBuffer pageBuffer = новий StringBuffer();
   тоді як ((лінія = reader.readLine()) != null) {
    pageBuffer.append(line);
   }

   return pageBuffer.toString();
  } catch (Виняток e) {
  }

  return null;
}

Видаліть "www" з URL
private String removeWwwFromUrl(String url) {
  int index = url.indexOf("://www.");
  якщо (індекс != -1) {
   повернути url.substring(0, index + 3) + url.substring(index + 7);
  }

  Return (url);
}

Проаналізуйте сторінку і знайдіть посилання
private<String> ArrayList retrieveLinks(URL pageUrl, String pageContents,
   HashSet crawledList, boolean limitHost) {
  Скомпілюйте патерн відповідності зв'язку з регулярними виразами.
  Шаблон p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]",
    Pattern.CASE_INSENSITIVE);
  Matcher m = p.matcher(pageContents);

  <String> ArrayList linkList = новий ArrayList<String>();
  тоді як (m.find()) {
   Зв'язок рядка = m.group(1).trim();

   якщо (link.length() < 1) {
    продовжити;
   }

   Пропустіть посилання на цю сторінку.
   if (link.charAt(0) == '#') {
    продовжити;
   }

   if (link.indexOf("mailto:") != -1) {
    продовжити;
   }

   if (link.toLowerCase().indexOf("javascript") != -1) {
    продовжити;
   }

   якщо (link.indexOf("://") == -1) {
    if (link.charAt(0) == '/') {// обслуговується абсолютно
     посилання = "http://" + pageUrl.getHost() + ":"
       + pageUrl.getPort() + посилання;
    } else {
     String file = pageUrl.getFile();
     if (file.indexOf('/') == -1) {// обробляє відносні адреси
      посилання = "http://" + pageUrl.getHost() + ":"
        + pageUrl.getPort() + "/" + посилання;
     } else {
      Шлях до рядка = file.substring(0,
        file.lastIndexOf('/') + 1);
      посилання = "http://" + pageUrl.getHost() + ":"
        + pageUrl.getPort() + шлях + посилання;
     }
    }
   }

   int index = link.indexOf('#');
   якщо (індекс != -1) {
    link = link.substring(0, індекс);
   }

   link = removeWwwFromUrl(посилання);

   URL verifiedLink = verifyUrl(link);
   якщо (verifiedLink == null) {
    продовжити;
   }

   /* Якщо ви обмежуєте хостинг, виключайте ті URL, які не відповідають критеріям */
   якщо (limitHost
     && !pageUrl.getHost().toLowerCase().equals(
       verifiedLink.getHost().toLowerCase())) {
    продовжити;
   }

   Пропускайте ті посилання, які вже оброблені.
   якщо (crawledList.contains(link)) {
    продовжити;
   }

   linkList.add(посилання);
  }

  return (linkList);
}

Пошукайте вміст завантаженої веб-сторінки, щоб визначити, чи є на сторінці певний рядок пошуку

private boolean searchStringMatches(String pageContents,
   String searchString, boolean caseSensitive) {
  Пошук рядківВміст = сторінкаЗміст;
  if (!caseSensitive) {// якщо нечутливий до регістру
   searchContents = pageContents.toLowerCase();
  }

  Патерн p = Pattern.compile("[\\s]+");
  String[] терміни = p.split(searchString);
  для (int i = 0; I < терміни.довжина; i++) {
   якщо (caseSensitive) {
    if (searchContents.indexOf(терміни)) == -1) {
     повернення хибно;
    }
   } else {
    if (searchContents.indexOf(терміни).toLowerCase()) == -1) {
     повернення хибно;
    }
   }
  }

  Повернення True;
}

Виконайте фактичну операцію пошуку
public<String> ArrayList crawl(String startUrl, int maxUrls,
   String searchString, boolean limithost, boolean caseSensitive) {

  <String> HashSet crawledList = новий HashSet<String>();
  LinkedHashSet<String> toCrawlList = новий <String>LinkedHashSet();

  якщо (maxUrls < 1) {
   errorList.add ("Значення недійсних максимальних URL-адресів.");
   System.out.println ("Значення недійсних максимальних URL-адресів.");
  }

  якщо (searchString.length() < 1) {
   errorList.add ("Відсутній рядок пошуку.");
   System.out.println ("Відсутній рядок пошуку");
  }

  if (errorList.size() > 0) {
   System.out.println("err!!");
   return errorList;
  }

  Перенесіть www з початкової URL
  startUrl = removeWwwFromUrl(startUrl);

  toCrawlList.add (startUrl);
  тоді як (toCrawlList.size() > 0) {

   якщо (maxUrls != -1) {
    if (crawledList.size() == maxUrls) {
     перерва;
    }
   }

   Знайдіть URL внизу списку.
   String url = toCrawlList.iterator().next();

   Видаліть URL зі списку для сканування.
   toCrawlList.remove(url);

   Перетворіть URL рядка на об'єкт URL.
   URL verifiedUrl = verifyUrl(url);

   Пропускайте URL, якщо роботам заборонено до нього заходити.
   if (!isRobotAllowed(verifiedUrl)) {
    продовжити;
   }

   Додайте оброблені URL до crawledList
   crawledList.add(url);
   String pageContents = downloadPage(verifiedUrl);

   якщо (pageContents != null && pageContents.length() > 0) {
    Отримайте дійсне посилання зі сторінки
    <String> ArrayList links = retrieveLinks(verifiedUrl,
      pageContents, crawledList, limitHost);

    toCrawlList.addAll(посилання);

    якщо (searchStringMatches(pageContents, searchString,
      caseSensitive)) {
     result.add(url);
     System.out.println(url);
    }
   }

  }
  результат повернення;
}

Основна функція
public static void main(String[] args) {
  SearchCrawler crawler = новий SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si");
  Пошук у темі = новий Thread(краулер);
  System.out.println («Почати пошук...»);
  System.out.println("результат:");
  search.start();
  try {
   search.join();
  } catch (InterruptedException e) {
   TODO Автоматично згенерований блок ловлі
   e.printStackTrace();
  }
}
}
[/mw_shl_code]

1.png (100.02 KB, Кількість завантажень: 591)

2.png (72.18 KB, Кількість завантажень: 596)

3.png (188.46 KB, Кількість завантажень: 606)





Попередній:PHP становить 82,2% топ-100W вебсайтів
Наступний:Переглядач веб-вихідного коду Java Edition
Опубліковано 30.11.2014 18:07:24 |
Побачивши новину, що Джек Ма ще за 300 мільйонів до того, щоб наздогнати Лі Ка-шина і стати найбагатшою людиною Азії, я подумки засміявся і швидко перевірив свій рейтинг в Інтернеті, який майже не змінився, і рейтинг залишився приблизно на 1,4 мільярда, тепер я відчув полегшення! Насправді, я теж людина з мріями, з дитинства мріяв, що одного дня поїду на спортивному автомобілі Lamborghini назад до нашого рідного міста в сонцезахисних окулярах, після майже 20 років наполегливої праці, тепер мрія наполовину здійснена, у мене вже є власні сонцезахисні окуляри, лише спортивний автомобіль, мрія ось-ось стане реальністю, і я трохи радію, коли думаю про це!
 Орендодавець| Опубліковано 30.11.2014 18:28:24 |

Павутинний краулер (також відомий як павутинний павук, веббот, частіше називаний павутинним мисливцем у спільноті FOAF) — це програма або скрипт, який автоматично збирає інформацію про Всесвітню павутину відповідно до певних правил. Інші менш поширені назви — мурахи, автоіндекси, емулятори або черв'які.
Опубліковано 30.11.2014 17:40:16 |
Delver_Si Опубліковано 2014-11-30 17:22
Я хочу написати інструмент для вибуху mssql ftp та інших інструментів, але ним нелегко користуватися онлайн

Пиши, я прикрию тебе!  Інструменти для демонтажу зазвичай пишуться у .net, а на Java їх небагато, тож ви можете написати його на Java!
Опубліковано 30.11.2014 17:19:07 |
Я витираю, це гарна лялька для створення інструменту для зламу!
Опубліковано 30.11.2014 17:22:22 |
Я зібрав її першою, хоча зараз вона марна, вірю, що стане в пригоді в майбутньому!
 Орендодавець| Опубліковано 30.11.2014 17:22:42 |
Я хочу написати інструмент для вибуху mssql ftp та інших інструментів, але ним нелегко користуватися онлайн
Опубліковано 30.11.2014 18:08:16 |
Що ти маєш на увазі, я не розумію
 Орендодавець| Опубліковано 30.11.2014 18:32:40 |
Адміністратор опубліковано 2014-11-30 17:40
Пиши, я прикрию тебе!  Інструменти для демонтажу зазвичай пишуться у .net, а на Java їх небагато, тож ви можете написати його на Java!

MSSQL бластер у наборі навіть мій не може стріляти,
 Орендодавець| Опубліковано 30.11.2014 18:33:09 |
Тест опубліковано 2014-11-30 18:07
Побачивши новину, що Джеку Ма ще не вистачає 300 мільйонів, щоб наздогнати Лі Ка-шина і стати найбагатшою людиною в Азії, його серце клацнуло, і він швидко перевірив свій рейтинг в Інтернеті — і на нього це не вплинуло...

Ти ж жилет вебмайстра, так?"
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com