1:爬虫:crawler4j ;
参考资料:http://blog.csdn.net/longzuyuan/article/details/8894912
http://blog.csdn.net/sadfishsc/article/details/20614105
参考书籍:自己动手写网络爬虫 --罗刚
2:搜索服务器:solr4.10 ;
3:多线程处理
参考书籍:java并发编程实战
参考相关jdk api:http://www.yq1012.com/api/,堵塞队列BlockingQueue<E> 类
业务:爬取国内部分招聘网站的职位信息。。当爬虫线程抓取到的页面数据到一定量时或者一定时间内。提交给搜索引擎solr(提高
索引性能)。循环爬行操作。。从而实现更高的资源利用率。。思路:N个线程爬虫作为Producer,提交搜索引擎作为Consumer。
部分爬虫相关代码:
package crawler;
import edu.uci.ics.crawler4j.crawler.CrawlConfig;
import edu.uci.ics.crawler4j.crawler.CrawlController;
import edu.uci.ics.crawler4j.fetcher.PageFetcher;
import edu.uci.ics.crawler4j.robotstxt.RobotstxtConfig;
import edu.uci.ics.crawler4j.robotstxt.RobotstxtServer;
public class Crawler4jTest {
public static void main(String[] args) {
try {
String crawlStorageFolder = "./tmp";
int numberOfCrawlers = 5;
CrawlConfig config = new CrawlConfig();
// 文明请求web:确保我们不发送超过1每秒请求数(1000毫秒之间的请求)。
config.setPolitenessDelay(1000);
// 深度,即从入口URL开始算,URL是第几层。如入口A是1,从A中找到了B,B中又有C,则B是2,C是3
config.setMaxDepthOfCrawling(5);
//设置最大的抓取页面数。默认值为1,页面的数量不限
config.setMaxPagesToFetch(50);
// 如果需要代理服务器的话
//config.setProxyHost("proxyserver.example.com"); //设置代理域名
//config.setProxyPort(8080);//端口
// 如果代理服务器需要认证
//config.setProxyUsername(username); config.getProxyPassword(password); //设置代理
/*
* 此配置参数可以用来设置你的爬行是可恢复的(这意味着可以从先前中断/恢复爬行)
* 注意:如果启用恢复特征,想开始一个新的抓取,你需要删除的内容手动rootfolder。
*/
config.setResumableCrawling(false);
config.setCrawlStorageFolder(crawlStorageFolder);
PageFetcher pageFetcher = new PageFetcher(config);
RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
controller.getCrawlersLocalData();
controller.addSeed("http://www.lagou.com");
CommitConsumer consumer=new CommitConsumer();
new Thread(consumer).start();
controller.start(WomiCrawler.class, numberOfCrawlers);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package crawler;
import java.util.regex.Pattern;
import org.apache.solr.common.SolrInputDocument;
import edu.uci.ics.crawler4j.crawler.Page;
import edu.uci.ics.crawler4j.crawler.WebCrawler;
import edu.uci.ics.crawler4j.parser.HtmlParseData;
import edu.uci.ics.crawler4j.url.WebURL;
public class WomiCrawler extends WebCrawler{
private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|bmp|gif|jpe?g" + "|png|tiff?|mid|mp2|mp3|mp4"
+ "|wav|avi|mov|mpeg|ram|m4v|pdf" + "|rm|smil|wmv|swf|wma|zip|rar|gz))$");
//页面前缀
private final static String URL_PREFIX = "http://www.lagou.com/jobs/";
/**
* shouldVisit是判断当前的URL是否已经应该被爬取(访问)
*/
@Override
public boolean shouldVisit(WebURL url) {
String href = url.getURL().toLowerCase();
return !FILTERS.matcher(href).matches() && href.startsWith(URL_PREFIX);
}
/**
* visit则是爬取该URL所指向的页面的数据,其传入的参数即是对该web页面全部数据的封装对象Page。
*/
@Override
public void visit(Page page) {
try {
SolrInputDocument doc=new SolrInputDocument();
int docid = page.getWebURL().getDocid();
String url = page.getWebURL().getURL();
String parentUrl = page.getWebURL().getParentUrl();
String anchor = page.getWebURL().getAnchor();
doc.addField("id", docid+"");
doc.addField("url", url+"");
doc.addField("host", url+"");
doc.addField("title", anchor+"");
doc.addField("author", anchor+"");
System.out.println("Docid: " + docid);
System.out.println("URL: " + url);
System.out.println("Parent page: " + parentUrl);
System.out.println("anchor: " + anchor);
if (page.getParseData() instanceof HtmlParseData) {
HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
String text = htmlParseData.getText();
doc.addField("content", text);
}
Lock lock = Lock.getInstance();
lock.lstDocument.add(doc);
lock.num++;
System.out.println("爬虫次数: num ==" + lock.num);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
部分对象锁代码
package crawler;
import java.util.concurrent.LinkedBlockingQueue;
import org.apache.solr.common.SolrInputDocument;
public class Lock {
private static Lock lock ;
public static Lock getInstance(){
if(lock==null){
synchronized (Lock.class) {
if(lock==null){
lock=new Lock();
}
}
}
return lock;
}
private Lock(){}
//爬取page数量
public int num = 0;
//提交次数
public int commitNum = 0;
//索引数据集-消费者模式
public LinkedBlockingQueue<SolrInputDocument> lstDocument = new LinkedBlockingQueue<SolrInputDocument>();
}
部分消费者代码:
package crawler;
import java.util.LinkedList;
import java.util.List;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.common.SolrInputDocument;
import search.solr.IndexerUtil;
public class CommitConsumer implements Runnable {
private SolrServer server = IndexerUtil.getHttpSolrServer("crawl");
private List<SolrInputDocument> list=new LinkedList<SolrInputDocument>();
private int commit=0;
public void run() {
try {
SolrInputDocument doc=null;
while((doc=Lock.getInstance().lstDocument.take())!=null){
list.add(doc);
if(list.size()==5){
commit++;
server.add(list);
server.commit();
list.clear();
System.out.println("提交次数:"+commit);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
分享到:
相关推荐
爬虫搜索,简单的搜索引擎,java爬虫,搜索引擎例子,爬虫demo,java实现互联网内容抓取,搜索引擎大揭密.java爬虫程序。web搜索。爬虫程序。sigar搜索,定时搜索互联网内容信息。
网络爬虫+搜索引擎 可以根据用户指定URL地址、抓取用户需要的网页信息 C#源码
垂直搜索引擎网络爬虫的研究与实现.pdf垂直搜索引擎网络爬虫的研究与实现.pdf垂直搜索引擎网络爬虫的研究与实现.pdf垂直搜索引擎网络爬虫的研究与实现.pdf
网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放...
JAVA基于网络爬虫的搜索引擎设计与实现.pdf
搜索引擎爬虫 可以下载到指定的目录 支持多线程
Java搜索引擎的实现-网络爬虫.pdf
垂直搜索引擎爬虫系统的研究与实现 论文 PDF
基于java 实现类似于搜索引擎的东西,值得一看。 用网络爬虫抓取网页的url资源。
该爬虫代码可将一个多页面含有多条文件的下载地址截取到,然后将下载地址放到linux系统里在控制台输入一条命令就可以进行批量下载(还可以直接调用浏览器的接口直接下载,这个可以自行修改),代码有注释具体目的...
通过python爬虫批量下载PDF文件,当前代码使用下载人教版学生教材举例; 其中涉及到批量下载、文件重命名、正则表达式等具体应用
搜索引擎中网络爬虫的研究 论文 武汉理工大学硕士学位论文 第1章引言 1.1选题背景 人类社会的发展离不开知识的获取与发现,进入互联网时代以后,信息出现 了飞速地增长,对于网络上不断涌现的各种信息,人们的接受...
搜索引擎中主题爬虫 来自CNKI
搜索引擎中爬虫设计,对研究网络爬虫的设计方法和一些爬虫的相关概念有很好的知道作用
本文首先详细介绍了基于英特网的搜索引擎的系统结构,然后具体阐述了如何设计并实现搜索引擎的搜索器——网络爬虫。 多线程网络爬虫程序是从指定的Web页面中按照宽度优先算法进行解析、搜索,并把搜索到的每条URL...
搜索工具 爬虫搜索,简单的搜索引擎,java
node.js实现爬虫批量下载图片 node_spider_download-img
java网络爬虫搜索引擎java网络爬虫搜索引擎java网络爬虫搜索引擎java网络爬虫搜索引擎java网络爬虫搜索引擎
C# 网络爬虫 搜索引擎