​webmagicJava爬虫框架​

​fastjson 阿里巴巴提供的 json 转为对象的快捷包,里面有下载jar包的地址​

抓取静态网页资源 。实例:抓取李开复博客:标题,内容,发布日期。

public class LiKaiFuBlogReading implements  PageProcessor{

private Site site = Site.me().setRetryTimes(3).setSleepTime(2000);
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static final String startPage = "http://blog.sina.com.cn/s/articlelist_1197161814_0_1.html"; // 目录页
public static void main(String[] args) {
// TODO Auto-generated method stub
Spider.create(new LiKaiFuBlogReading())
.addPipeline(new JsonFilePipeline("C:\\Users\\Root\\Desktop\\Spider")) // 写入到本地的Spider 文件夹里,如果没有就会自动生成。
.addUrl(startPage)
.thread(10)
.run();
}

@Override
public Site getSite() {
return site;
}

@Override
public void process(Page page) {
String url = page.getRequest().getUrl();
if(url.startsWith("http://blog.sina.com.cn/s/articlelist_1197161814_0_1.html")) // 目录页开始
{
// 提取目录列表
List<String> links = page.getHtml().xpath("//span[@class='atc_title']/a/@href").all();
page.addTargetRequests(links);

//然后提取其他列表页地址
links = page.getHtml().xpath("//ul[@class='SG_pages']/li/a/@href").all();
page.addTargetRequests(links);

page.setSkip(true);

}else if(url.startsWith("http://blog.sina.com.cn/s")){
//内容页
// 获取 第一篇 李开复:母亲的十件礼物|悼文 内容 文章标题
// 标题
String title = page.getHtml().xpath("//h1[@class='h1_tit']/text()").get();
// 内容
String content = page.getHtml().xpath("//div[@class='BNE_cont']/allText()").get();
// 时间
String timeAndSource = page.getHtml().xpath("//span[@class='time SG_txtc']/text()").get();


// // 阅读数
// String readingAmount = page.getHtml().xpath("//div[@class='BNE_txtA OL']/span[1]/text()").get();
// //评论数
// String comment = page.getHtml().xpath("//div[@class='BNE_txtA OL']/span[2]/text()").get();


if(title==null && content == null ) // 说明不是第一篇 李开复:母亲的十件礼物|悼文 ,需要重新 get 内容
{
title = page.getHtml().xpath("//div[@class='articalTitle']/h2/text()").get();
content = page.getHtml().xpath("//div[@id='sina_keyword_ad_area2']/allText()").get();
// 抓取样式 : ((2018-01-26 18:24:31)
timeAndSource = page.getHtml().regex("\\d{4}-\\d{2}-\\d{2}\\s\\d+.\\d+.\\d+").toString();


}// 最终保证 不为空
page.putField("CONTENT",content); //置入 文章内容
page.putField("TITLE",title); // 置入文章标题
page.putField("URL", url); // 存入 url
try {
long pubtime = format.parse(timeAndSource).getTime();
page.putField("PUBTIME", pubtime);
} catch (ParseException e) {
e.printStackTrace();
}
page.putField("PUBTIME",timeAndSource); // 置入文章标题
}
}
}

抓取动态网页资源。 需要 fastjson.jar 包。示例,抓取京东手机页:手机名称,价格(是动态抓取的),详情页连接,产品 ID。

public class JingDongMobilePhone implements PageProcessor {

private Site site = Site.me().setRetryTimes(3).setSleepTime(2000);
private static AddJDMoblieInfo addJDMoblieInfo;
// private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//public static final String startPage = "http://list.jd.com/list.html?cat=9987,653,655"; // 京东起始页
public static final String startPage = "http://list.jd.com/list.html?cat=9987,653,655"; // 京东起始页 http://item.jd.com/5089273.html

public static void main(String args[]) {
addJDMoblieInfo = new AddJDMoblieInfo();
Spider spider = Spider.create(new JingDongMobilePhone());
spider.addPipeline(new JsonFilePipeline("C:\\Users\\User\\Desktop\\Spider"));
spider.addUrl(startPage);
spider.thread(100);
spider.run();
}


@Override
public Site getSite() {
// TODO Auto-generated method stub
return site;
}

@Override
public void process(Page page) {
String url = page.getRequest().getUrl();
// System.out.println("请求的url是:"+url);
if(url.startsWith("http://list.jd.com/list.html?cat=9987,653,655")) { // 手机列表页
// 获取手机的所有链接
List<String> links = page.getHtml().xpath("//div[@class='p-img']/a/@href").all();
page.addTargetRequests(links);
// 获取其他列表的信息 下一页的信息
String nextLink = page.getHtml().xpath("//a[@class='pn-next']/@href").get();
nextLink = "http://list.jd.com"+nextLink;
page.addTargetRequest(nextLink); //

page.setSkip(true);
}else if(url.startsWith("http://item.jd.com/")){ // 手机详情页 http://item.jd.com/7437780.html
/**
* 手机信息显示详情页
* 1. 产品名称
* 2. 产品价格
*/

page.putField("shoujiUrl", url);
// 产品 id想·
String skuId = url.replace("http://item.jd.com/", "").replace(".html", "");
page.putField("SKUID", skuId);
// //产品名称
String name = page.getHtml().xpath("//div[@class='sku-name']/text()").get();
page.putField("NAME", name);
String ajaxLink ="http://p.3.cn/prices/mgets?skuIds=J_"+skuId+""; // 此链接是通过 查找页面的请求连接,最后拼接出来的请求,目前来说这种拼接还是需要人工来拼接
page.putField("priceUrl", ajaxLink);
// try {
// addJDMoblieInfo.insertMobileUrlNameSkuId(url, name, skuId);
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
page.addTargetRequest(ajaxLink);
}else if(url.startsWith("http://p.3.cn/prices/mgets?")){

String skuId = url.replace("http://p.3.cn/prices/mgets?skuIds=J_", "");
page.putField("SkuId", skuId);

String json = page.getRawText();
JSONArray jsonArray = JSONArray.parseArray(json);

Price price = jsonArray.getObject(0, Price.class);
String JDPrice = price.getOp();
page.putField("JDPrice", JDPrice);
// try {
// addJDMoblieInfo.insertMobilePrice(skuId, JDPrice); // 这些是添加到数据库的操作
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
}
// 源网页 http://list.jd.com/list.html?cat=9987,653,655&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0&ms=5#J_main
// 接受网页 http://list.jd.com /list.html?cat=9987,653,655&page=4&sort=sort_rank_asc&trans=1&JL=6_0_0

Price.java

public class Price {

private String op;
private String m;
private String id;
private String p;
public String getOp() {
return op;
}
public void setOp(String op) {
this.op = op;
}
public String getM() {
return m;
}
public void setM(String m) {
this.m = m;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getP() {
return p;
}
public void setP(String p) {
this.p = p;
}
}