基于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檔案