java爬虫 京东_java爬虫webmagic 案例爬取动态(ajax+js) 网站京东售价格

本文介绍了一个使用Java爬虫WebMagic爬取京东动态加载(AJAX+JS)网页,获取手机ID、名称及价格的案例。通过创建PageProcessor,解析HTML并利用XPath提取数据,同时构造请求价格的URL,再使用另一个PageProcessor处理返回的JSON数据,将结果存储到Map中。整个过程涉及到页面链接匹配、数据提取、JSON解析等技术。
摘要由CSDN通过智能技术生成

爬取京东手机ID与名称

爬取京东手机ID与价格

组织json

为啥没合并在一起,原因:其中有个组织价格URL的过程

项目采用maven管理

工程pom.xml文件见下一个博文

package org.study.WebMagicStudy;

import java.util.HashMap;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;

import us.codecraft.webmagic.Page;

import us.codecraft.webmagic.Site;

import us.codecraft.webmagic.Spider;

import us.codecraft.webmagic.pipeline.FilePipeline;

import us.codecraft.webmagic.processor.PageProcessor;

public class JDAjaxProcessor implements PageProcessor {

public static final String URL_LIST = "http://list\\.jd\\.com/list\\.html\\?cat=9987,653,655&page=\\d+\\&go=0\\&JL=6_0_0";

//用于存储{key:手机ID,value:手机名称}

static Map map = new HashMap();

static Set uri = new HashSet();

public static void main(String[] args) {

String list = "http://list.jd.com/list.html?cat=9987,653,655&page=1&go=0&JL=6_0_0";

Spider.create(new JDAjaxProcessor()).addUrl(list)

.addPipeline(new FilePipeline("D:\\webmagic\\"))

.run();

for (String s : map.values()) {

System.out.println(s);

}

System.out.println("map-->" + map.size());

System.out.println(map.get("10274956063"));

}

private Site site = Site.me().setRetryTimes(3).setSleepTime(100);

public Site getSite() {

return site;

}

public void process(Page page) {

if (page.getUrl().regex(URL_LIST).match()) {

//   page.setSkip(true);

page.putField("id",page.getHtml().xpath("//div[@class='p-focus']/a/@data-sku").all());

page.putField("name",page.getHtml().xpath("//div[@class='p-name']/a/em/text()").all());

List ids = (List) page.getResultItems().get("id");

List name = (List) page.getResultItems().get("name");

String makerUrl = makerUrl(ids);

//   System.out.println("价格连接" + makerUrl);

//key:id,value:price

Map running = JDJsonPreocessor.running(makerUrl);

for (int i = 0; i 

String price = running.get("J_"+ids.get(i));

map.put(ids.get(i), name.get(i) +"\t"+ price);

}

page.addTargetRequests(page.getHtml().links().regex(URL_LIST).all());

}

}

public String makerUrl(List ids){

StringBuffer sb = new StringBuffer();

for (String id : ids) {

sb.append("J_"+id+",");

}

String substring = sb.substring(0, sb.length()-1);

return "http://p.3.cn/prices/mgets?skuIds="+substring+"&callback=result";

}

public void writeFile(){

}

}

package org.study.WebMagicStudy;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import us.codecraft.webmagic.Page;

import us.codecraft.webmagic.Site;

import us.codecraft.webmagic.Spider;

import us.codecraft.webmagic.processor.PageProcessor;

/**

* Hello world!

*

*/

public class JDJsonPreocessor implements PageProcessor {

static Map maps = new HashMap();

public static Map running(String url) {

Spider.create(new JDJsonPreocessor()).addUrl(url).run();

return maps;

}

private Site site = Site.me().setRetryTimes(3).setSleepTime(100);

public Site getSite() {

return site;

}

public void process(Page page) {

page.setSkip(true);

String text = page.getRawText();

int begin = text.indexOf("[");

int end = text.indexOf("]");

String substring = text.substring(begin, end + 1);

String jsonName = "result";

String json = "{\"" + jsonName + "\":" + substring + "}";

Map map = JsonUtil.jsonToMap(json);

List> list = (List>) map.get(jsonName);

for (Map map1 : list) {

String key = map1.get("id").toString();

String value = map1.get("p").toString();

maps.put(key, value);

}

}

}

package org.study.WebMagicStudy;

import java.util.List;

import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.ObjectMapper;

/**

* json 工具类

*

*/

public class JsonUtil {

/**

* 转换json 字符串为map

* @param jsonStr

* @return

*/

@SuppressWarnings("unchecked")

public static Map jsonToMap(String jsonStr){

ObjectMapper om = new ObjectMapper();

Map map = null;

try {

map = om.readValue(jsonStr, Map.class);

} catch (Exception e) {

e.printStackTrace();

}

return map;

}

/**

* 将一个map转换成JSON对象

* @param param

* @return

*/

public static String mapToJson(Map m) {

ObjectMapper om = new ObjectMapper();

String json="";

try {

json = om.writeValueAsString(m);

} catch (Exception e) {

e.printStackTrace();

}

return json;

}

/**

* 将一个list转换成json串,转换后格式

* [{key:'value'},{key:'value'},{key:'value'}...]

* @param param

* @return

*/

public static String listToJson(List> list) {

ObjectMapper om = new ObjectMapper();

String json = "";

try {

json = om.writeValueAsString(list);

} catch (JsonProcessingException e) {

e.printStackTrace();

}

//System.out.println(json);

return json;

}

/**

* 将一个array类型的json串转换成list

* @param jsonStr

* @return

*/

@SuppressWarnings("unchecked")

public static List> jsonToList(String jsonStr){

ObjectMapper om = new ObjectMapper();

List> list = null;

try {

list = om.readValue(jsonStr, List.class);

} catch (Exception e) {

e.printStackTrace();

}

return list;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值