天天看點

基于WebMagic爬蟲

基于WebMagic爬蟲

一、WebMagic簡介

WebMagic是一個簡單靈活的爬蟲架構。基于WebMagic,你可以快速開發出一個高效、易維護的爬蟲。

特性:

1. 簡單的API,可快速上手

2. 子產品化的結構,可輕松擴充

3. 提供多線程和分布式支援

  • 項目位址:http://webmagic.io/
  • API中文位址:http://webmagic.io/docs/zh/

二、示列代碼

  • 1) Maven依賴
<!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-core -->
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-core</artifactId>
    <version>0.5.3</version>
</dependency>

<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-extension</artifactId>
    <version>0.5.3</version>
</dependency>
           
  • 2) Java代碼

爬取位址:http://blog.csdn.net/zhengyong15984285623 下面所有該使用者發表的文章标題和建立時間

package crawl.webmagic.csdn;

import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;

import java.util.List;

/**
 * csdn 爬取控制
 */
public class CsdnProcessor implements PageProcessor {

    public static Logger       logger   = LoggerFactory.getLogger(CsdnProcessor.class);

    private Site               site     = Site.me().setSleepTime().setCycleRetryTimes();

    /**
     * csdn uri 字尾
     */
    public static final String CSDN_URI = "zhengyong15984285623";

    @Override
    public void process(Page page) {
        List pagenation = page.getHtml().links().regex("/" + CSDN_URI + "/article/list/\\d*").all();
        page.addTargetRequests(pagenation);
        // 文章清單頁面隻捕捉每篇文章url,并将其加入爬取隊列
        if (CollectionUtils.isNotEmpty(pagenation)) {
            List<String> titleList = page.getHtml().xpath("//div[@id='article_list']/div[@class=list_item]").all();
            for (String titleHtml : titleList) {
                page.addTargetRequests(new Html(titleHtml).links().regex("/" + CSDN_URI
                                                                         + "/article/details/\\d*").all());
            }
            page.setSkip(true);
        } else { // csdn具體文章頁面
            String title = page.getHtml().xpath("//div[@class=article_title]/h1/span/a/text()").toString();
            String createTime = page.getHtml().xpath("//div[@class=article_r]/span[@class=link_postdate]/text()").toString();
            page.putField("title", title);
            page.putField("createTime", createTime);
        }
    }

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

}
           
package crawl.webmagic.csdn;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;

/**
 * 基于webmagic爬取csdn
 */
public class CsdnMain {

    public static Logger logger = LoggerFactory.getLogger(CsdnMain.class);

    public static void main(String[] args) {

        Spider.create(new CsdnProcessor())
              // 從url開始抓
              .addUrl("http://blog.csdn.net/" + CsdnProcessor.CSDN_URI)
              // 設定Scheduler,使用File來管理URL隊列
              // .setScheduler(new FileCacheQueueScheduler("/Users/zhengyong/queue"))
              // 設定Pipeline,将結果以console方式輸出到控制台
              .addPipeline(new ConsolePipeline())
              // 開啟5個線程同時執行
              .thread()
              // 啟動爬蟲
              .run();
    }
}
           
  • 3) 運作結果
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   google guava Joiner 示列 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   elastic-job 建構 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   Google Guava Cache 示列 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   CountDownLatch使用 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   ElasticSearch-學習筆記 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   kafka  版本 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   git配置使用者名和郵箱 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   java身份證格式強校驗 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   jdk動态代理例子 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   spring ioc 源碼解析(二) 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   圖解https 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   spring ioc 源碼解析(一) 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   ClassPathXmlApplicationContext 源碼解析 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   ThreadPoolExecutor源碼分析 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   JVM底層又是如何實作synchronized 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   jstat檢視記憶體 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   ThreadPoolExecutor 分析 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   java中volatile關鍵字的含義 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   mysql 行鎖 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   設計模式 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   mysql 優化 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   mysql 事務級别 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   https用戶端證書.p12maven打包後tomcat啟動不正确 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   java NIO詳解 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   jvm學習 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   redis持久化機制 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   redis配置說明 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   dobbo配置 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   mac 下安裝wget 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   logback.xml檔案配置 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   linux 啟動或停止jar shell腳本 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   mac下安裝redis 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   google guava 測試 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   spring batch + spring boot 配置 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   google工具包 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   redis指令學習筆記 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   mybatis 批量插入oracle與mysql 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   linux項目釋出常見指令 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   http方式調用webservice 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   http post請求 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   mac 配置maven環境變量 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   本地git上傳至遠端git倉庫 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   http get請求 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   maven 送出oracle jar 包 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   mybatis foreach 熟悉 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   maven 利用axis2插件配置webservice 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   使用 git 進行項目同步開發步驟 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   MQ開啟密碼通路平台服務步驟 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   mac 檔案顯示與隐藏 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   jvm 記憶體回收finalize如何在垃圾清除前工作原理 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   maven項目修改jsp代碼不用打包就能運作 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   觀察者模式 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   postgre循環插入模拟資料 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   事件通知 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   maven批處理指令 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   java反射 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   CAS單點登入配置 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   maven學習筆記 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2 表單标簽屬性 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   cas單點登入 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2 資料标簽 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2注解 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2 控制标簽 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   集合操作 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   異步線程池 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   字元串大寫字母轉下劃線 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   OGNL 中的集合操作 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2中的資料校驗檔案配置方法 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   nginx 配置說明 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   使用BlockingQueue建立生産者消費者模式 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   spring mvc 線程安全問題說明 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   [解決異常] spring batch 報錯 ORA-: 無法連續通路此事務處理 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   linux操作oracle指令 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   memcache檢視資料指令 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   Python學習指南 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2結果類型 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2攔截器 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2輸出國際資訊 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   Action通路Servlet API 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2攔截器配置 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2标簽 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   日志 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   快速排序算法 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   教育訓練總結 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   struts2常量配置 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流之 配置設定任務給一個"組的成員"GroupTask 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流之"事件處理Event" 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流之"分支聚合Join-Fork" 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流之"自定義活動Custom" 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    CheckBox 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流之Decision流程決策(判斷活動執行方向) 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    RadioGroup 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    EditText 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    TextView 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    絕對定位布局管理器 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    布局管理器的嵌套 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    Button 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    相對布局管理器 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    表格布局管理器 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   Activity 初步 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    線性布局管理器 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    架構布局管理器 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   Android項目檔案夾解析 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   AndroidManifest.xml解析 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   main.xml解析 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流之根據流程變量配置設定任務Task 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流之狀态活動State 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流的流轉Transition 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流管理方法擴充 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流管理 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流執行變量Variable 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   -jbpm工作流實作 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   向字元串對象中追加replaceAll方法 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   擷取登入使用者IP位址 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   根據tree檔案菜單的path,拼接檔案夾路徑 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   EasyUI的from表單,根據皮膚變換 改變表單顔色 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   初試.net使用ajax調用背景方法 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   myelipse 版本破解 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   .net 如何連接配接mysql 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   集合按某個屬性排序 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   EasyUI+Struts2整合KindEditor 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   kaptcha驗證碼使用配置 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   定時器-----每天定時删除臨時檔案 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   html5繪圖鋪滿整個螢幕 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   canvas像素化video 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   .net 當GridView編輯狀态擷取新值時,往往擷取的是修改前的值。 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   HTML5 之 notifications 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   Html5 之 Google地圖 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   CSS3 動畫之animation 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   CSS3 過渡之transition 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   CSS3 D 轉換 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   CSS3 D 轉換 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   CSS3 border-radius 屬性 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   html5視訊播放 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   CSS3 border-image 屬性 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   CSS3 box-shadow 屬性 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   html5之繪圖闆 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   html5中canvas基本應用 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   html5之canvas動畫 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   easyui扁平Json生成樹形菜單 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    AutoCompleteTextView 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:   easyui動态建立一個dialog 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    Dialog 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    ScrollView 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    ListView 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    DatePicker 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    ImageView 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    TimePicker 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    ImageButton 
createTime: -- :
get page: http://blog.csdn.net/zhengyong15984285623/article/details/
title:    Spinner 
createTime: -- :
           

三、 注意事項

WebMagic使用log4j列印日志

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration>

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="%d - %c -%-4r [%t] %-5p %x - %m%n" />
        </layout>

        <!--限制輸出級别-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMax" value="ERROR"/>
            <param name="LevelMin" value="TRACE"/>
        </filter>
    </appender>

    <appender name="FILE" class="org.apache.log4j.FileAppender">
        <param name="File" value="/Users/zhengyong/log/crawl.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="%d - %c -%-4r [%t] %-5p %x - %m%n" />
        </layout>
    </appender>

    <root>
        <priority value="info" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>


</log4j:configuration>
           

Java中main方法使用

import org.apache.log4j.xml.DOMConfigurator;

DOMConfigurator.configure("/Users/zhengyong/crawl/log4j.xml");//加載.xml檔案