六、學習爬蟲框架WebMagic(二)---使用註解編寫爬蟲
阿新 • • 發佈:2018-12-31
(一)案例
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。