@SuppressWarnings("unchecked")
	public List<WebCrawler> load() {

		List<WebCrawler> crawlers = new ArrayList<WebCrawler>();
		SAXReader reader = new SAXReader();
		try {
			InputStream is = this.getClass().getClassLoader().getResourceAsStream(DEFAULT_CONFIG_FILE);
			document = reader.read(is);
			Element root = document.getRootElement();
			for (Iterator<Element> i = root.elementIterator(); i.hasNext();) {
				Element taskElement = i.next();
				String name = taskElement.elementText("name");
				long delay = Long.parseLong(taskElement.elementText("delay"));
				String url = taskElement.elementText("url");
				String parserName = taskElement.elementText("parser").trim();
				String defaultCharset = taskElement.elementText("charset");
				String pageNoStr = taskElement.elementText("max_page");
				String crawlerName = taskElement.elementText("crawler");
				String nextPageRegex = taskElement.elementText("next_page_key");
				String extractLinksElementId = taskElement.elementText("extract_links_elementId");
				Class<Parser> c = (Class<Parser>)Class.forName(parserName);
				Parser parser = c.newInstance();

				if (parser == null) {
					throw new IllegalArgumentException("parser must not be null!");
				}

				int maxPageNo = 1;

				if (StringUtils.isNotEmpty(pageNoStr)) {
					maxPageNo = Integer.parseInt(pageNoStr);
				}

				CrawlerConfig config = new CrawlerConfig(name, defaultCharset, url, delay, maxPageNo, nextPageRegex,
						extractLinksElementId, parserName, crawlerName, parser);
				WebCrawler crawler = null;

				//get WebCrawler instance throw reflection
				if (StringUtils.isBlank(crawlerName)) {
					crawler = new DefaultWebCrawler(config);
				} else {
					crawler = (WebCrawler)Reflections.constructorNewInstance(crawlerName,
							new Class[] { CrawlerConfig.class }, new CrawlerConfig[] { config });
				}
				crawlers.add(crawler);
			}
		} catch (Throwable e) {
			logger.error(e.getMessage(),e);
		}

		return crawlers;
	}