webmagic爬取网页数据,【分页爬取内容】见上一篇博文https://segmentfault.com/a/1190000020005655
webmagic的官方文档见: http://webmagic.io/docs/zh/ 可查阅根据不同选择器 获取节点信息等内容
网页内容爬取根据页面生成方式基本上可通过以下方法爬取:
一.静态页面【最常见的】,能通过webmagic的常规方法直接爬取数据
二.一些动态生成网页,需要在爬虫程序里使用浏览器驱动将数据渲染到页面上之后再爬取
三.从js请求中能获取数据的网页,可直接构造http请求获取数据
下文将罗列针对这三种爬取方式的webmagic使用,文章较长,可根据你的需要【爬取方式】取用
一. 静态页面爬取
示例:
import com.boe.mps.jrj.dataas.entity.BigDeposit;
import org.joda.time.DateTime;
import org.springframework.stereotype.Repository;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;
import java.util.ArrayList;
import java.util.List;
/**
* 大额存单爬虫
*/
@Repository
public class BigDepositProcessor implements PageProcessor{
private static Site site = Site.me().setRetryTimes(3).setSleepTime(100);
@Override
public Site getSite() {
return site;
}
@Override
public void process(Page page) {
// 数据更新时间
String updateTime = DateTime.now().toString(DateUtils.DATE_FORMAT_LONG_FULL);
// 获取数据节点
List nodes = page.getHtml().$(".ebdp-pc4promote-circularcontainer-wrapper").nodes();
List list = new ArrayList<>();
for (int i = 0; i < nodes.size(); i++) {
BigDeposit bigDeposit = new BigDeposit();
// 根据xpth获取table列表中的td节点
List table = page.getHtml().xpath("//*[@id=circularcontainer"+i+"]/div[2]/table/tbody/tr/td").nodes();
bigDeposit.setItemName(page.getHtml().xpath("//*[@id=circularcontainer"+i+"]/div[1]/span[1]/span/text()").get());
bigDeposit.setItemRate(page.getHtml().xpath("//*[@id=circularcontainer"+i+"]/div[2]/table/tbody/tr/td[2]/a/text()").get());
bigDeposit.setUpdateTime(updateTime);
if (table.size()<=7){
bigDeposit.setStartDepositPrice(page.getHtml().xpath("//*[@id=circularcontainer"+i+"]/div[2]/table/tbody/tr/td[4]/text()").get());
bigDeposit.setGrading(page.getHtml().xpath("//*[@id=circularcontainer"+i+"]/div[2]/table/tbody/tr/td[6]/text()").get());
}else {
bigDeposit.setStartDepositPrice(page.getHtml().xpath("//*[@id=circularcontainer"+i+"]/div[2]/table/tbody/tr/td[5]/text()").get());
bigDeposit.setGrading(page.getHtml().xpath("//*[@id=circularcontainer"+i+"]/div[2]/table/tbody/tr/td[7]/text()").get());
}
list.add(bigDeposit);
}
page.putField("bigDeposit",list);
//打印爬取的内容
list.forEach(e->{
System.out.println(e);
});
}
// 爬虫测试方法
public static void main(String[] args) {
// 爬虫爬取路径
String bigdeposit="https://mybank.icbc.com.cn/servlet/ICBCBaseReqServletNoSession?dse_operationName=per_accountQueryFixedProductsOutOp&cmd=0&NormalOrBooking=0&IN_CURRFLAG=&IN_APPID=02&IN_SAVETYPE=&IN_BIGFLAG=1&JJGFLAG=0&Area_code=1001";
//爬虫构造,将爬取结果打印到控制台上
Spider.create(new BigDepositProcessor()).addPipeline(new ConsolePipeline()).addUrl(bigdeposit).thread(5).run();
}
}
/**
*BigDeposit的实体类
*/
@Data
public class BigDeposit {
private Long id;
/**产品名称*/
private String itemName;
/**产品利率%*/
private String itemRate;
/**起存金额(元)*/
private String startDepositPrice;
/**交易级差*/