(一)案例
package org.pc.webmagic;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.model.ConsolePageModelPipeline;
import us.codecraft.webmagic.model.OOSpider;
import us.codecraft.webmagic.model.annotation.ExtractBy;
import us.codecraft.webmagic.model.annotation.ExtractByUrl;
import us.codecraft.webmagic.model.annotation.HelpUrl;
import us.codecraft.webmagic.model.annotation.TargetUrl;
/**
* TargetUrl是我們最終要抓取的URL,最終想要的數據都來自這裏
* HelpUrl則是爲了發現這個最終URL,我們需要訪問的頁面
* 例:對於博客頁,HelpUrl是列表頁,TargetUrl是文章頁;
* 對於電商網站,HelpUrl是分類列表,TargetUrl是商品詳情
* TargetUrl中的自定義正則表達式:
* 將URL中常用的字符.默認做了轉義,變成了\.
* 將"*"替換成了".*",直接使用可表示通配符。(例如:
* https://github.com/*在這裏是一個合法的表達式,它表示https://github.com/下的所有URL。)
* 屬性 sourceRegion:這個參數是一個XPath表達式,指定了這個URL從哪裏得到——不在sourceRegion的URL不會被抽取
* @author 鹹魚
* @date 2018/12/30 9:42
*/
@TargetUrl("https://github.com/\\w+/\\w+")
@HelpUrl("https://github.com/\\w+")
public class GithubRepo {
/**
* 默認抽取規則是XPath,若需其他類型抽取規則,則可通過 Type 屬性指定
*/
@ExtractBy(value = "//h1[@class='entry-title public']/strong/a/text()", notNull = true)
private String name;
/**
* 註解@ExtractByUrl:從URL中抽取
*/
@ExtractByUrl("https://github\\.com/(\\w+)/.*")
private String author;
@ExtractBy("//div[@id='readme']/tidyText()")
private String readme;
public static void main(String[] args) {
/**
* 註解模式的入口是OOSpider,它繼承了Spider類
* public static OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class... pageModels);
* PageModelPipeline:註解模式下,處理結果的類叫做PageModelPipeline,通過實現它,你可以自定義自己的結果處理方式
* PageModelPipeline與Model類是對應的,多個Model可以對應一個PageModelPipeline。除了創建時,
* 你還可以通過 public OOSpider addPageModel(PageModelPipeline pageModelPipeline, Class... pageModels)
* 方法,在添加一個PageModelPipeline的同時,可以添加多個pageModels。
*/
OOSpider.create(Site.me().setSleepTime(1000),
new ConsolePageModelPipeline(), GithubRepo.class)
.addUrl("https://github.com/code4craft")
.thread(5)
.run();
}
}
(二)知識要點
1、@TargetUrl:TargetUrl是我們最終要抓取的URL,最終想要的數據都來自這裏
(1)TargetUrl中的自定義正則表達式:
- 將URL中常用的字符
.
默認做了轉義,變成了\.
,例:http://blog\\.sina\\.com\\.cn/s/blog_\\w+\\.html
來匹配http://blog.sina.com.cn/s/articlelist_1487828712_0_1.html
- 將
"*"
替換成了".*"
,直接使用可表示通配符,例:https://github.com/*在這裏是一個合法的表達式,它表示https://github.com/下的所有URL
(2)屬性 sourceRegion
這個參數是一個XPath表達式,指定了這個URL從哪裏得到——不在sourceRegion的URL不會被抽取。
2、@HelpUrl:HelpUrl則是爲了發現這個最終URL,我們需要訪問的頁面
- 對於博客頁,HelpUrl是列表頁,TargetUrl是文章頁;
- 對於電商網站,HelpUrl是分類列表,TargetUrl是商品詳情。
3、@ExtractBy:默認抽取規則是XPath,若需其他類型抽取規則,則可通過 Type 屬性指定
4、@ExtractByUrl:從URL中抽取目標元素
5、OOSpider:註解模式的入口是OOSpider,它繼承了Spider類
public static OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class... pageModels);
參數PageModelPipeline
:註解模式下,處理結果的類叫做PageModelPipeline,通過實現它,你可以自定義自己的結果處理方式。ageModelPipeline與Model類是對應的,多個Model可以對應一個PageModelPipeline。除了創建時,你還可以通過 public OOSpider addPageModel(PageModelPipeline pageModelPipeline, Class… pageModels)方法,在添加一個PageModelPipeline的同時,可以添加多個pageModels。