原文链接:点击打开链接
crawler4j是一个开源爬虫框架(https://github.com/yasserg/crawler4j),
我们可以使用它进行爬虫。以爬取 http://www.nibaku.com 这个网站为例,展示如何使用crawler4j+jsoup 爬取网名昵称。
1. crawler4j
(1) 引入maven 仓库
<dependency>
<groupId>edu.uci.ics</groupId>
<artifactId>crawler4j</artifactId>
<version>4.4.0</version>
</dependency>
(2) 编写WebCrawler子类。主要实现2个方法shouldVisit和visit,shouldVisit规定了要爬取那些链接,visit规定了爬取的内容。
package crawler;
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;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Set;
import java.util.regex.Pattern;
/**
* Created by kaiscript on 2018/3/14.
*/
public class MyCrawler extends WebCrawler {
StringBuilder sb = new StringBuilder();
PrintWriter writer = new PrintWriter("E:/Coding/robotName.txt","UTF-8");
/**
* 正则表达式匹配指定的后缀文件
*/
private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg" + "|png|mp3|mp4|zip|gz))$");
public MyCrawler() throws FileNotFoundException, UnsupportedEncodingException {
}
/**
* 这个方法主要是决定哪些url我们需要抓取,返回true表示是我们需要的,返回false表示不是我们需要的Url
* 第一个参数referringPage封装了当前爬取的页面信息 第二个参数url封装了当前爬取的页面url信息
* 在这个例子中,我们指定爬虫忽略具有css,js,git,...扩展名的url,只接受以“http://www.ics.uci.edu/”开头的url。
* 在这种情况下,我们不需要referringPage参数来做出决定。
*/
@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
String href = url.getURL().toLowerCase();// 得到小写的url
return !FILTERS.matcher(href).matches() // 正则匹配,过滤掉我们不需要的后缀文件
&& href.startsWith("http://www.nibaku.com") && href.contains("wangming");//
}
/**
* 当一个页面被提取并准备好被你的程序处理时,这个函数被调用。
*/
@Override
public void visit(Page page) {
String url = page.getWebURL().getURL();// 获取url
System.out.println("URL: " + url);
if (page.getParseData() instanceof HtmlParseData) {// 判断是否是html数据
HtmlParseData htmlParseData = (HtmlParseData) page.getParseData(); 强制类型转换,获取html数据对象
String text = htmlParseData.getText();//获取页面纯文本(无html标签)
Set<WebURL> links = htmlParseData.getOutgoingUrls();// 获取页面输出链接
String html = htmlParseData.getHtml();
Document doc = Jsoup.parse(html, "UTF-8");
Elements elements = doc.select("#content");
for (Element element : elements) {
Elements p = element.select("p");
for (Element e : p) {
System.out.println(e.html());
sb.append(e.html()).append("\r\n");
}
}
writer.print(sb.toString());
writer.flush();
}
}
}
2.jsoup
(1)引入maven仓库
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.2</version>
</dependency>
(2) 分析网页html结构
随便拿这个网站的某个url (http://www.nibaku.com/wangming/2669431.html)进行分析
可以发现,昵称都在id=content的标签里面,并且每个p标签里面就是一个昵称。
这时,我们就可以结合jsoup来对html内容进行提取。
(3)visit方法里利用jsoup对html内容进行提取
Document doc = Jsoup.parse(html, "UTF-8");
Elements elements = doc.select("#content");//获取 id=content的元素
for (Element element : elements) {
Elements p = element.select("p"); //拿到p标签集合 ,进行遍历输出
for (Element e : p) {
System.out.println(e.html());
sb.append(e.html()).append("\r\n");
}
}
详细的jsoup api可参照
http://www.open-open.com/jsoup/
3.大功告成
如果喜欢本文,扫一扫关注下吧。公众号回复 Java 获取我个人收集的电子书籍。