webmagicフレームワーク:http://webmagic.io/
WebMagic構造を分けDownloader
、PageProcessor
、Scheduler
、Pipeline
四つの成分
PageProcessorは、設定ページ要素爬虫類及びリンク発見抽出される3つの部分に分割されています。
Pipeline
コンポーネントのは、カスタムパイプラインを実装してみましょう、結果を格納するために使用、結果はファイル、データベースおよび一連の機能を保存するために達成することができ
自分の時間と研究カザフスタンへの機能の多くは、ここでは繰り返しません。
します。https://www.cnblogs.com/loaderman/テーマに直接以下、私はデータのブログのホームページを登ります
見て、ソースコードを表示するホーム:
最初のステップ:Mavenの設定は参照webmagic:http://webmagic.io/docs/zh/posts/ch2-install/with-maven.html
ステップ2:文書に従ってエンコード直接戦闘:
定義されたエンティティクラス
パブリック クラスLoadermanModel {
プライベート文字列のタイトル。
プライベート文字列detailUrl。
プライベート文字列の内容。
プライベート文字列の日付。
パブリックLoadermanModel(){
}
公共LoadermanModel(文字列のタイトル文字列detailUrl、文字列のコンテンツ、文字列の日付){
この .TITLE = タイトル。
この .detailUrl = detailUrl。
この .content = コンテンツ;
この .date = 日付。
}
パブリック文字列あるgetTitle(){
戻りタイトル。
}
公共 ボイドのsetTitle(文字列のタイトル){
この .TITLE = タイトル。
}
パブリック文字列getDetailUrl(){
戻りdetailUrlと、
}
公共 ボイドsetDetailUrl(文字列detailUrl){
この .detailUrl = detailUrl。
}
パブリック文字列のgetContent(){
戻り含量;
}
公共 ボイドのsetContent(文字列コンテンツ){
この .content = コンテンツ。
}
パブリック文字列のgetDate(){
リターン日付;
}
公共 ボイドのsetdate(文字列日){
この .date = 日付。
}
}
カスタムPageProcessor
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.ArrayList;
import java.util.List;
public class LoadermanPageProcessor implements PageProcessor {
// 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
private Site site = Site.me().setRetryTimes(5).setUserAgent("User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0");
@Override
public void process(Page page) {
List<String> pageItemList = page.getHtml().xpath("//div[@class='post']").all();
ArrayList<LoadermanModel> list = new ArrayList<>();
for (int i = 0; i < pageItemList.size(); i++) {
Html html = Html.create(pageItemList.get(i));
LoadermanModel loadermanModel=new LoadermanModel();
loadermanModel.setTitle(html.xpath("//a[@class='postTitle2']/text()").toString() );
loadermanModel.setDetailUrl(html.xpath("//a[@class='postTitle2']").links().toString());
loadermanModel.setContent(html.xpath("//div[@class='c_b_p_desc']/text()").toString() );
loadermanModel.setDate(html.xpath("//p[@class='postfoot']/text()").toString() );
list.add(loadermanModel);
}
page.putField("data", list);
if (page.getResultItems().get("data") == null) {
//skip this page
page.setSkip(true);
}
}
@Override
public Site getSite() {
return site;
}
}
自定义Pipeline,,对爬取后的数据提取和处理
import com.alibaba.fastjson.JSON;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline;
import us.codecraft.webmagic.utils.FilePersistentBase;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class LoadermanlPipeline extends FilePersistentBase implements Pipeline {
public LoadermanlPipeline(String path) {
this.setPath(path);
}
public void process(ResultItems resultItems, Task task) {
String path = "LoadermanlPipelineGetData";
try {
PrintWriter printWriter = new PrintWriter(new FileWriter(this.getFile(path+ ".json")));
printWriter.write(JSON.toJSONString(resultItems.get("data")));
printWriter.close();
} catch (IOException var5) {
}
}
}
开启爬虫:
Spider.create(new LoadermanPageProcessor()) .addUrl("https://www.cnblogs.com/loaderman/") //自定义Pipeline,保存json文件到本地 .addPipeline(new LoadermanlPipeline("D:\\loaderman\\")) //开启5个线程抓取 .thread(5) //启动爬虫 .run();
效果如下:
搞定!