如何用java中的webmagic爬取網頁

說到爬蟲,大家第一個想到的肯定是python的scrapyd爬蟲。但是大家不知道吧,我們的java也有相應的爬蟲工具。今天就給大家介紹一下我們java的爬蟲工具。

我們今天要介紹的爬蟲工具,名字叫做webmagic,webmagic的架構圖如下所示:

image

如圖所示,它主要分爲四個部分:

  • Downloader(頁面下載)
  • PageProcessor(頁面分析及鏈接抽取)
  • Scheduler(URL管理)
  • Pipeline(後續處理和持久化)

webmagic的用法其實很簡單,複雜的部分webmagic都替我們封裝好了,接下來開始我們爬蟲歷程。

1.首先引入webmagic的依賴

<!--webmagic依賴開始-->
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.6.1</version>
        </dependency>

        <dependency>
            <groupId>us.codecraft</groupId>
            <version>0.6.1</version>
            <artifactId>webmagic-extension</artifactId>
        </dependency>

        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-selenium</artifactId>
            <version>0.6.1</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!--webmagic依賴結束-->

2.創建PageProcessor,用來處理網頁數據

/**
 * @author linzhiqiang
 */
public class CsdnBlogProcessor implements PageProcessor {
    private Site site = Site
            .me()
            .setDomain("csdn.net")
            .setSleepTime(3000)
            .setUserAgent(
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");

    @Override
    public void process(Page page) {
        System.out.println("html:"+page.getHtml());
    }

    @Override
    public Site getSite() {
        return site;
    }
}

site中放置爬取的網站域名、cookie、請求頭等信息。 process用來處理爬取到的網頁數據,處理完的數據可以通過page.putField(),再通過Pipeline獲取存儲到數據庫。

3.創建Pipeline,存儲處理好的網頁數據

public class CsdnPipeline implements Pipeline {
    @Override
    public void process(ResultItems resultItems, Task task) {
        //文章題目
        String title = resultItems.get("title");
        //文章內容
        String context = resultItems.get("context");
        System.out.println("title:" + title);
        System.out.println("context:" + context);
    }
}

在process中通過resultItems來獲取PageProcessor存儲的page數據,最後我們可以將數據存儲到redis、數據庫、文件等地方。

4.利用Scheduler調度爬取任務

public class RedisScheduler extends DuplicateRemovedScheduler implements
        MonitorableScheduler, DuplicateRemover {
    @Override
    public int getLeftRequestsCount(Task task) {
        return 0;
    }

    @Override
    public boolean isDuplicate(Request request, Task task) {
        return false;
    }

    @Override
    public void resetDuplicateCheck(Task task) {
    }

    @Override
    public int getTotalRequestsCount(Task task) {
        return 0;
    }

    private int num = 0;

    @Override
    public Request poll(Task task) {
        Request request = new Request("http://my.oschina.net/flashsword/blog/180623");
        return request;
    }
}

我們可以將我們要爬蟲的任務,添加到Scheduler中,然後按照順序一一爬取。

5.啓動爬蟲程序,開始爬取數據

    public static void main(String[] args) {
        RedisScheduler redisScheduler = new RedisScheduler();
        Spider.create(new CsdnBlogProcessor())
                .setScheduler(redisScheduler)
                .addPipeline(new CsdnPipeline())
                .thread(1)
                .run();
    }

從打印結果中,我們可以看到我們已經成功爬取到數據了。

image

官方文檔:http://webmagic.io/

想要更多幹貨、技術猛料的孩子,快點拿起手機掃碼關注我,我在這裏等你哦~

林老師帶你學編程https://wolzq.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章