summaryrefslogtreecommitdiff
path: root/htroot
diff options
context:
space:
mode:
authorMichael Peter Christen <mc@yacy.net>2012-10-10 02:02:17 +0200
committerMichael Peter Christen <mc@yacy.net>2012-10-10 02:02:17 +0200
commitabebb3b124759439ac8ac46604fb71a64efbdafe (patch)
tree8efec2bcf1e81005af68476c25c1591032a65b5d /htroot
parent941873fba47c966023961686a4dc88f9d935f23e (diff)
added a crawl start checker which makes a simple analysis on the list of
all given urls: shows if the url can be loaded and if there is a robots and/or a sitemap.
Diffstat (limited to 'htroot')
-rw-r--r--htroot/CrawlCheck_p.html74
-rw-r--r--htroot/CrawlCheck_p.java132
-rw-r--r--htroot/Crawler_p.java6
-rw-r--r--htroot/env/templates/submenuIndexCreate.template8
4 files changed, 214 insertions, 6 deletions
diff --git a/htroot/CrawlCheck_p.html b/htroot/CrawlCheck_p.html
new file mode 100644
index 000000000..7635f54aa
--- /dev/null
+++ b/htroot/CrawlCheck_p.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
+ <head>
+ <title>YaCy '#[clientname]#': Crawl Start</title>
+ #%env/templates/metas.template%#
+ <script type="text/javascript" src="/js/ajax.js"></script>
+ <script type="text/javascript" src="/js/IndexCreate.js"></script>
+ <script type="text/javascript">
+ function check(key){
+ document.getElementById(key).checked = 'checked';
+ }
+ </script>
+ <style type="text/css">
+ .nobr {
+ white-space: nowrap;
+ }
+ </style>
+ </head>
+ <body id="IndexCreate">
+
+<div id="api"></div>
+
+ #%env/templates/header.template%#
+ #%env/templates/submenuIndexCreate.template%#
+ <h2>Crawl Check</h2>
+
+ <p>This pages gives you an analysis about the possible success for a web crawl on given addresses.</p>
+
+ <fieldset>
+ <legend>
+ <label>Crawl Check</label>
+ </legend>
+ <form id="CrawlCheck" method="post" action="CrawlCheck_p.html" enctype="multipart/form-data" accept-charset="UTF-8">
+ <dl>
+ <dt><label>List of possible crawl start URLs</label></dt>
+ <dd>
+ <textarea name="crawlingURLs" id="crawlingURLs" cols="80" rows="15" size="80">#[starturls]#</textarea>
+ </dd>
+ <dt></dt>
+ <dd><input type="submit" name="crawlcheck" value="Check given urls" class="submitready"/>
+ </dd>
+ </dl>
+
+ </form>
+ </fieldset>
+
+
+ #(table)#::
+ <fieldset><legend>Analysis</legend>
+ <table border="0" cellpadding="2" cellspacing="2" style="float:left">
+ <tr>
+ <th align="left" width="600" class="listing">URL</th>
+ <th align="right" width="80" class="listing">Access</th>
+ <th align="right" width="80" class="listing">Robots</th>
+ <th align="right" width="80" class="listing">Crawl-Delay</th>
+ <th align="right" width="200" class="listing">Sitemap</th>
+ </tr>
+ #{list}#
+ <tr class="TableCell#(dark)#Light::Dark::Summary#(/dark)#">
+ <td align="left" nowrap class="listing"><a href="#[url]#" class="listing">#[url]#</a></td>
+ <td align="right" nowrap class="listing">#[access]#</td>
+ <td align="right" nowrap class="listing">#[robots]#</td>
+ <td align="right" nowrap class="listing">#[crawldelay]#</td>
+ <td align="right" nowrap class="listing">#[sitemap]#</td>
+ </tr>
+ #{/list}#
+ </table>
+ </fieldset>
+ #(/table)#
+
+
+ #%env/templates/footer.template%#
+ </body>
+</html>
diff --git a/htroot/CrawlCheck_p.java b/htroot/CrawlCheck_p.java
new file mode 100644
index 000000000..3f53425d2
--- /dev/null
+++ b/htroot/CrawlCheck_p.java
@@ -0,0 +1,132 @@
+/**
+ * CrawlCheck_p
+ * Copyright 2012 by Michael Peter Christen
+ * First released 10.10.2011 at http://yacy.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General private
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program in the file lgpl21.txt
+ * If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import net.yacy.cora.federate.yacy.CacheStrategy;
+import net.yacy.cora.protocol.RequestHeader;
+import net.yacy.crawler.data.CrawlQueues;
+import net.yacy.crawler.retrieval.Request;
+import net.yacy.crawler.retrieval.Response;
+import net.yacy.crawler.robots.RobotsTxtEntry;
+import net.yacy.kelondro.data.meta.DigestURI;
+import net.yacy.kelondro.logging.Log;
+import net.yacy.repository.Blacklist.BlacklistType;
+import net.yacy.search.Switchboard;
+import net.yacy.server.serverObjects;
+import net.yacy.server.serverSwitch;
+
+
+public class CrawlCheck_p {
+
+ public static serverObjects respond(@SuppressWarnings("unused") final RequestHeader header, final serverObjects post, final serverSwitch env) {
+ final Switchboard sb = (Switchboard) env;
+ final serverObjects prop = new serverObjects();
+ prop.put("starturls", "");
+ if (post == null) return prop;
+
+ if (post.containsKey("crawlcheck")) {
+
+ // get the list of rootURls for this crawl start
+ Set<DigestURI> rootURLs = new HashSet<DigestURI>();
+ String crawlingStart0 = post.get("crawlingURLs","").trim();
+ String[] rootURLs0 = crawlingStart0.indexOf('\n') > 0 || crawlingStart0.indexOf('\r') > 0 ? crawlingStart0.split("[\\r\\n]+") : crawlingStart0.split(Pattern.quote("|"));
+ for (String crawlingStart: rootURLs0) {
+ if (crawlingStart == null || crawlingStart.length() == 0) continue;
+ // add the prefix http:// if necessary
+ int pos = crawlingStart.indexOf("://",0);
+ if (pos == -1) {
+ if (crawlingStart.startsWith("www")) crawlingStart = "http://" + crawlingStart;
+ if (crawlingStart.startsWith("ftp")) crawlingStart = "ftp://" + crawlingStart;
+ }
+ try {
+ DigestURI crawlingStartURL = new DigestURI(crawlingStart);
+ rootURLs.add(crawlingStartURL);
+ } catch (MalformedURLException e) {
+ Log.logException(e);
+ }
+ }
+
+ if (rootURLs.size() == 0) {
+ prop.put("table", 0);
+ } else {
+ prop.put("table", 1);
+
+ // make a string that is used to fill the starturls field again
+ // and analyze the urls to make the table rows
+ StringBuilder s = new StringBuilder(300);
+ int row = 0;
+ for (DigestURI u: rootURLs) {
+ s.append(u.toNormalform(true, true)).append('\n');
+ prop.put("table_list_" + row + "_url", u.toNormalform(true, true));
+
+ // try to load the robots
+ RobotsTxtEntry robotsEntry;
+ boolean robotsAllowed = true;
+ try {
+ robotsEntry = sb.robots.getEntry(u, sb.peers.myBotIDs());
+ if (robotsEntry == null) {
+ prop.put("table_list_" + row + "_robots", "no robots");
+ prop.put("table_list_" + row + "_crawldelay", CrawlQueues.queuedMinLoadDelay + " ms");
+ prop.put("table_list_" + row + "_sitemap", "");
+ } else {
+ robotsAllowed = !robotsEntry.isDisallowed(u);
+ prop.put("table_list_" + row + "_robots", "robots exist: " + (robotsAllowed ? "crawl allowed" : "url disallowed"));
+ prop.put("table_list_" + row + "_crawldelay", Math.max(CrawlQueues.queuedMinLoadDelay, robotsEntry.getCrawlDelayMillis()) + " ms");
+ prop.put("table_list_" + row + "_sitemap", robotsEntry.getSitemap() == null ? "-" : robotsEntry.getSitemap().toNormalform(true, true));
+ }
+ } catch (final IOException e) {
+ }
+
+ // try to load the url
+ if (robotsAllowed) try {
+ Request request = sb.loader.request(u, true, false);
+ final Response response = sb.loader.load(request, CacheStrategy.NOCACHE, BlacklistType.CRAWLER, CrawlQueues.queuedMinLoadDelay);
+ if (response == null) {
+ prop.put("table_list_" + row + "_access", "no response");
+ } else {
+ if (response.getResponseHeader().getStatusCode() == 200) {
+ prop.put("table_list_" + row + "_access", "200 ok, last-modified = " + response.lastModified());
+ } else {
+ prop.put("table_list_" + row + "_access", response.getResponseHeader().getStatusCode() + " - load failed");
+ }
+ }
+ } catch (final IOException e) {
+ prop.put("table_list_" + row + "_access", "error response: " + e.getMessage());
+ } else {
+ prop.put("table_list_" + row + "_access", "not loaded - prevented by robots.txt");
+ }
+ row++;
+
+ }
+ prop.put("table_list", row);
+ prop.put("starturls", s.toString());
+
+ }
+ }
+
+ return prop;
+ }
+
+}
diff --git a/htroot/Crawler_p.java b/htroot/Crawler_p.java
index a7ee8a840..ba4d81ca0 100644
--- a/htroot/Crawler_p.java
+++ b/htroot/Crawler_p.java
@@ -3,12 +3,6 @@
// first published 18.12.2006 on http://www.anomic.de
// this file was created using the an implementation from IndexCreate_p.java, published 02.12.2004
//
-// This is a part of YaCy, a peer-to-peer based web search engine
-//
-// $LastChangedDate$
-// $LastChangedRevision$
-// $LastChangedBy$
-//
// LICENSE
//
// This program is free software; you can redistribute it and/or modify
diff --git a/htroot/env/templates/submenuIndexCreate.template b/htroot/env/templates/submenuIndexCreate.template
index 6387127b6..78db4173f 100644
--- a/htroot/env/templates/submenuIndexCreate.template
+++ b/htroot/env/templates/submenuIndexCreate.template
@@ -36,4 +36,12 @@
<li><a href="/IndexImportMediawiki_p.html" class="MenuItemLink lock">Dump Reader for <br/>MediaWiki dumps</a></li>
</ul>
</div>
+
+ <div class="SubMenugroup">
+ <h3>Target Analysis</h3>
+ <ul class="SubMenu">
+ <li><a href="/CrawlCheck_p.html" class="MenuItemLink lock">Mass Crawl<br/>Check</a></li>
+ <li><a href="/RegexTest.html" class="MenuItemLink">Regex<br/>Test</a></li>
+ </ul>
+ </div>
</div> \ No newline at end of file