几十行代码实现Java爬虫,结合jsoup爬取网名昵称

原文链接:点击打开链接


crawler4j是一个开源爬虫框架(https://github.com/yasserg/crawler4j),

我们可以使用它进行爬虫。以爬取 http://www.nibaku.com 这个网站为例,展示如何使用crawler4j+jsoup 爬取网名昵称。

1. crawler4j

(1) 引入maven 仓库

    
        edu.uci.ics
        crawler4j
        4.4.0
    

(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 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仓库



    org.jsoup
    jsoup
    1.7.2


(2) 分析网页html结构

随便拿这个网站的某个url (http://www.nibaku.com/wangming/2669431.html)进行分析

几十行代码实现Java爬虫,结合jsoup爬取网名昵称_第1张图片


可以发现,昵称都在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爬虫,结合jsoup爬取网名昵称_第2张图片

如果喜欢本文,扫一扫关注下吧。公众号回复 Java 获取我个人收集的电子书籍。

几十行代码实现Java爬虫,结合jsoup爬取网名昵称_第3张图片


你可能感兴趣的:(java)