webmagic爬虫讲解

最近因工作需求需要在指定网站上爬取App信息,根据自身需求了解了一下webmagic网络爬虫。

这个爬虫的缺点我就不说了,有点有一下几个:

第一:支持多线程

第二:支持xpath检索

第三:支持正则表达式

第四:支持持久层

第五:支持地址过滤

第六:最关键一点就是上手很快

剩下的大家就在使用中具体体会一下吧。说多了都是泪。下面我把这个具体使用步骤以及用到的一些东西介绍一下。本篇文章只做讨论用,如果说的不对请指教


webmagic环境搭建:

第一步:既然是人家封装好的东东,那么工具jar包导入应该是第一步

需要导入那些jar包那我随便标注一下。



第二步:正常开发

如果碰到什么困难大家可以拿出来 探讨一下。学术无国界,交流无底线是我的宗旨

不胡扯了。下边开始代码讲解


忽然看到代码是不是感觉很蒙圈,如果不蒙圈那就证明你至少有一年工作经验了

package com.energy.gp;
import com.energy.yyb.DAO;
import us.codecraft.webmagic.Spider;
public class MainFest {
public static void main(String[] args) {

/**
* Dao对象是我的数据库持久成类,你如果想保存数据库那你也写一个也成
*/

DAO dao = new DAO();

/**
* webmaigc 主对象创建很简单
* 蜘蛛.创建(new 解析器对象())【Spider.create(new ReDetailPage(dao))】
* addUrl 这个是添加解析地址方法 ,一般在这都是网页内容的入口。我这儿是googleplay的app入口
* addPipeline 使用持久成对象。我这儿是用来保存数据库。所有方法传递了dao对象

*/

Spider.create(new ReDetailPage(dao))
      .addUrl("https://play.google.com/store/apps?hl=en")
      .addPipeline(new ConsolePipeline(dao))
      .thread(50)
      .run();
}
}

/*

*这个是解析器对象。

可以解析网页里面的内容

*

*/

package com.energy.gp;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.energy.yyb.DAO;
import com.energy.yyb.TApp;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
/**
 * 获取类别
 * @author chungong.zhang
 *
 */
public class ReDetailPage implements PageProcessor{
private Site site = Site.me().setRetryTimes(3).setSleepTime(100).setTimeOut(15000);
private DAO dao = null;
public ReDetailPage(DAO dao){
this.dao=dao;
}


    @Override
    public void process(Page page) {
    String name = "";
String ratings="";
String packageName = "";
/**
蓝色的字你们不要管。这是我的业务逻辑
*/
if(QJ.pageInt==0&&QJ.isOk==0){
try {
QJ.pageInt=QJ.pageInt+1;
List<TApp> applist = dao.queryList(TApp.class,QJ.pageInt,1000, "select * from t_app where app_source=?", new Object[]{14});
List<String> requests = new ArrayList<>();
for(TApp app:applist){
requests.add("https://play.google.com/store/apps/details?id="+app.getPakeage()+"&app_id="+app.getId());
}
System.out.println(QJ.pageInt+"  页数");
page.addTargetRequests(requests);
QJ.pageInt=QJ.pageInt+1;
if(null == applist||applist.size()==0){
QJ.isOk=1;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ;
}else{
if(QJ.isOk==0){
List<TApp> applist = null;
try {
applist = dao.queryList(TApp.class,QJ.pageInt,1000, "select * from t_app where app_source=?", new Object[]{14});
List<String> requests = new ArrayList<>();
for(TApp app:applist){
requests.add("https://play.google.com/store/apps/details?id="+app.getPakeage()+"&app_id="+app.getId());
}
System.out.println(QJ.pageInt+"  页数");
page.addTargetRequests(requests);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(null == applist||applist.size()==0){
QJ.isOk=1;
}
}


}
System.out.println(QJ.pageInt+"  页数");
String[] u = page.getUrl().toString().split("&app_id=");
if(null != u&&u.length>1){
page.putField("appId", u[1]);
}


/**

重点说一下面的一句话的意思

取 div class =details-wrapper apps square-cover id-track-partial-impression id-deep-link-item的data-docid属性。返回值是l为list只能说明它可能返回多个对象。这个你可以需要自己斟酌



*/

List<String> pakageList = page.getHtml().xpath("//div[@class='details-wrapper apps square-cover id-track-partial-impression id-deep-link-item']/@data-docid").all();
if(null != pakageList&&pakageList.size()>0){
System.out.println("包名:"+pakageList.get(0));
packageName = pakageList.get(0);
page.putField("packageName", packageName);
}
    if(page.getResultItems().get("packageName")==null){
    //设置skip之后,这个页面的结果不会被Pipeline处理
    page.setSkip(true);
     }
List<String> NameList = page.getHtml().xpath("//div[@class='id-app-title']/text()").all();
if(null != NameList && NameList.size()>0){
System.out.println("名称:"+NameList.get(0));
name=NameList.get(0);
page.putField("name", name);
}
List<String> ratingsList = page.getHtml().xpath("//span[@class='reviews-num']/text()").all();
if(null != ratingsList&&ratingsList.size()>0){
System.out.println("平分:"+ratingsList.get(0));
ratings = ratingsList.get(0);
page.putField("ratings", ratings);
}
QJ.pageInt=QJ.pageInt+1;
 
    }


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

}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值