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

原文链接:点击打开链接


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 获取我个人收集的电子书籍。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值