WebCollector爬取百度搜索引擎

本文介绍了一个使用Java实现的百度搜索引擎爬虫实例。该爬虫能够针对特定关键词抓取百度搜索结果页面,并进一步爬取结果链接的内容。文章详细展示了如何构造搜索请求URL、设置爬虫参数、解析页面数据及抓取外部链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package test;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.ram.RamCrawler;

public class BaiduEngine extends RamCrawler {

	public BaiduEngine(String keyword, int maxPageNum) {
		for (int pageNum = 0; pageNum < maxPageNum; pageNum++) {
			String url = createBaiduUrl(keyword, pageNum);
			CrawlDatum datum = new CrawlDatum(url)
					.putMetaData("keyword", keyword)
					.putMetaData("pageNum", pageNum + "")
					.putMetaData("pageType", "searchEngine")
					.putMetaData("depth", "1");
			addSeed(datum);
		}
	}

	private String createBaiduUrl(String keyword, int pageNum) {
		int first = pageNum * 10;
		try {
			keyword = URLEncoder.encode(keyword, "utf-8");
		} catch (UnsupportedEncodingException e) {

			e.printStackTrace();
		}
		return String.format("http://www.baidu.com/s?wd=%s&pn=%d", keyword,first);
	}

	public static void main(String[] args) throws Exception {
        //爬取搜索关键字“网络爬虫”结果的前3页
		BaiduEngine crawler = new BaiduEngine("网络爬虫", 3);
		//设置重试次数
		crawler.setRetry(3);
		//设置访问间隔
		crawler.setVisitInterval(500);
		//设置重试间隔
		crawler.setRetryInterval(1000);
		//设置爬取深度
		crawler.start(2);
	}

	@Override
	public void visit(Page page, CrawlDatums next) {
		String keyword = page.getMetaData("keyword");
		String pageType = page.getMetaData("pageType");
		int depth = Integer.valueOf(page.getMetaData("depth"));
		if (pageType.equals("searchEngine")) {
			int pageNum = Integer.valueOf(page.getMetaData("pageNum"));
			System.out.println("成功抓取关键词" + keyword + "的第" + pageNum + "页搜索结果");
			Elements results = page.select("h3.t>a");
			for (int rank = 0; rank < results.size(); rank++) {
				Element result = results.get(rank);
				CrawlDatum datum = new CrawlDatum(result.attr("abs:href"))
						.putMetaData("keyword", keyword)
						.putMetaData("pageNum", pageNum + "")
						.putMetaData("rank", rank + "")
						.putMetaData("pageType", "outlink")
						.putMetaData("depth", (depth + 1) + "")
						.putMetaData("refer", page.getUrl());
				next.add(datum);
			}

		} else if (pageType.equals("outlink")) {
			int pageNum = Integer.valueOf(page.getMetaData("pageNum"));
			int rank = Integer.valueOf(page.getMetaData("rank"));
			String refer = page.getMetaData("refer");

			String line = String.format(
					"第%s页第%s个结果:%s(%s字节)\tdepth=%s\trefer=%s", pageNum,
					rank + 1, page.getDoc().title(), page.getContent().length,
					depth, refer);
			System.out.println(line);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值