us.codecraft
webmagic-core
0.7.3
us.codecraft
webmagic-extension
0.7.3
/**
* 网络爬虫工具
*
* @author sunyiran
* @date 2018-09-11
*/
public class WebMagicUtils {
/**
* 抓取csdn文章标题
* @param beginUrl
* @param urlReg
* @param xpath
* @return
*/
public Map> getCsdnInfo(String beginUrl, String urlReg, Map xpath) {
Map> map = new HashMap<>();
//是否结束抓取
AtomicBoolean end = new AtomicBoolean(false);
//定义抓取规则
PageProcessor processor = new PageProcessor() {
@Override
public void process(Page page) {
page.addTargetRequests(page.getHtml().links().regex(urlReg).all());
//lambda遍历map集合
xpath.forEach((x, y) -> {
//根据xpath语法解析页面元素
Selectable selectable = page.getHtml().xpath(y);
//如果不再获取
if (selectable.get() == null) {
end.set(true);
} else {
//如果元素已经开始存入map则在value中追加内容,否则新建
if(map.containsKey(x)) {
map.get(x).addAll(selectable.all());
}else {
map.put(x, selectable.all());
}
}
});
}
@Override
public Site getSite() {
return Site.me().setRetryTimes(3).setSleepTime(100);
}
};
//开启线程抓取信息
for (int i = 1; end.get() != true; i++) {
Spider.create(processor).addUrl(beginUrl+i).addPipeline
(new ConsolePipeline()).thread(5).run();
}
return map;
}
public static void main(String[] args) {
Map map = new HashMap<>();
map.put("title","//h4/a/text()");
WebMagicUtils webMagicUtils = new WebMagicUtils();
Map> info = webMagicUtils.getCsdnInfo("https://blog.csdn.net/qq_35813653/article/list/",
"https://blog.csdn" +
".net/qq_35813653/article/list/\\d", map);
System.out.println(info.get("title").size());
}
}
在本文章发布前,我的博客总计三页,共49篇。如上,在抓取第四页时结束抓取,共获得49篇文章的文章名。
信息存储数据结构
package com.example.common.entity;
import lombok.Data;
/**
* @author sunyiran
* @date 2018-09-11
*/
@Data
public class House {
private Long id;
/**
* 详情地址
*/
private String itemUrl;
/**
* 拍卖状态
*/
private String status;
/**
* 房屋地址
*/
private String title;
/**
* 房屋图片
*/
private String picUrl;
/** */
private Long initialPrice;
/**
* 成交价
*/
private Long currentPrice;
/**
* 评估价格
*/
private Long consultPrice;
/**
* 等待报价
*/
private Long marketPrice;
/**
* 是否结束拍卖
*/
private boolean sellOff;
/**
* 开始时间
*/
private Long start;
/**
* 结束时间
*/
private Long end;
/**
* 距离开始时间
*/
private Long timeToStart;
/**
* 距离结束时间
*/
private Long timeToEnd;
/**
* 围观人数
*/
private Long viewerCount;
/**
* 竞价次数
*/
private Long bidCount;
/**
* 设置提醒人数
*/
private Long delayCount;
/**
* 报名人数
*/
private Long applyCount;
/**
* xmpp协议号
*/
private String xmppVersion;
/**
* 是否限购
*/
private Long buyRestrictions;
/**
* 是否支持贷款
*/
private int supportLoans;
/**
* 是否支持公积金
*/
private int supportOrgLoan;
}
工具类
package com.example.common.utils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.common.entity.House;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* 网络爬虫工具
*
* @author sunyiran
* @date 2018-09-11
*/
public class WebMagicUtils {
/**
* 抓取
* @param beginUrl 指定开始抓取的页面
* @param linkReg 获取页面下满足要求的链接
* @param xpath 指定抓取的内容
* @return
*/
public Map> getInfo(String beginUrl, String linkReg, Map xpath) {
Map> map = new HashMap<>();
//是否结束抓取
AtomicBoolean end = new AtomicBoolean(false);
//定义抓取规则
PageProcessor processor = new PageProcessor() {
@Override
public void process(Page page) {
if(linkReg != null) {
page.addTargetRequests(page.getHtml().links().regex(linkReg).all());
}
//lambda遍历map集合
xpath.forEach((x, y) -> {
//根据xpath语法解析页面元素
Selectable selectable = page.getHtml().xpath(y);
//如果不再获取
Map parseObject = JSONObject.parseObject(selectable.get(), Map.class);
if (selectable.get() == null) {
end.set(true);
} else if (parseObject.get("data").toString().equals("[]")) {
end.set(true);
}else {
//如果元素已经开始存入map则在value中追加内容,否则新建
if(map.containsKey(x)) {
map.get(x).addAll(selectable.all());
}else {
map.put(x, selectable.all());
}
}
});
}
@Override
public Site getSite() {
return Site.me().setRetryTimes(3).setSleepTime(100);
}
};
//开启线程抓取信息
for (int i = 1; !end.get(); i++) {
Spider.create(processor).addUrl(beginUrl+i).addPipeline
(new ConsolePipeline()).thread(5).run();
}
return map;
}
public static void main(String[] args) {
Map map = new HashMap<>();
map.put("content","//script[@id='sf-item-list-data']/html()");
WebMagicUtils webMagicUtils = new WebMagicUtils();
Map> info = webMagicUtils.getInfo("https://sf.taobao" +
".com/list/50025969.htm?spm=a213w.7398504.pagination.2.543235d6w5wPsh&auction_start_seg=-1" +
"&page=",
null, map);
Object o = JSONObject.parseObject(info.get("content").get(0), Map.class).get("data");
List houses = JSONArray.parseArray(o.toString(), House.class);
System.out.println(houses);
}
}
测试结果