一.爬取京东的商品图片、名字、价格
1.主要是分析京东的网页数据是怎么构成的,然后可能存在懒加载,注意找懒加载的与显示的图片的区别在哪儿。
2.京东还通过了请求把价格通过APi返回的,也要注意寻找接口。
3.然后就是解析json数据,一般返回的不是规范的json数据,在通过String.subString()来截取字符串.
1.返回json数据
/**
* 返回json字符串
*/
public static String toJSon(String url){
//然后就是模拟ajax请求,当然了,根据规律,需要将"datasku"的属性值替换下面链接中的"133537397"和"0000000000"值
try {
Document
document1=Jsoup.connect(url)
.ignoreContentType(true)
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.get();
//打印出模拟ajax请求返回的数据,一个json格式的数据,对它进行解析就可以了
return document1.text();
} catch (IOException e) {
e.printStackTrace();
System.out.println("解析成json失败");
}
return null;
}
2.爬取京东数据
//爬取京东的数据
@Test
public void TestJD(){
List<Goods> goodsList=new ArrayList<>();
try {
Document document = Jsoup.connect("https://coll.jd.com/list.html?sub=46533&page=1&JL=6_0_0").get();
Element plist = document.getElementById("plist");
Elements elementsByClass = plist.getElementsByClass("j-sku-item");
//商品价格是通过另一个API返回的json数ju
String str="";//获取链接商品ID并拼接
for (Element element:elementsByClass){
//获取商品的id去模拟查询数据
String attr = element.attr("data-sku");
str=str+"J_"+attr+",";
}
//京东价格的接口
String url="https://p.3.cn/prices/mgets?callback=jQuery4183730&ext=11101100&type=1&area=22_2005_2006_0&skuIds="+str+"&pdbp=0&pdtk=&pdpin=&pin=&pduid=831434432&source=list_pc_front&_=1587381670567";
String priceJson = JsoupTool.toJSon(url);//自定义的方法 获取json的数据 格式有问题
String json = priceJson.substring(priceJson.indexOf("["), priceJson.length() - 2);
JSONArray array=new JSONArray().fromObject(json);//格式好的 json对象都放在这里面的
//获取数据
int i=0;
for (Element element:elementsByClass){
Goods good=new Goods();
//获取图片地址与商品名字
Element imgdiv = element.getElementsByClass("p-img").get(0);
Element img = imgdiv.getElementsByTag("img").get(0);
//名字
String name = img.attr("alt");
good.setTitle(name);
//图片地址
String src = img.absUrl("src");//获取图片地址
//京东用了懒加载机制 后面的图片地址是data-lazy-img
String data_lazy_img = img.absUrl("data-lazy-img");
if(src != ""){
good.setImage(src);
}
if(data_lazy_img != ""){
good.setImage(data_lazy_img);
}
//获取价格
JSONObject object = array.getJSONObject(i);//第i个
good.setPricemin(object.getString("p"));//给低价格赋值
good.setPricemax(object.getString("m"));//给高价格赋值
i++;
goodsList.add(good);
}
} catch (IOException e) {
e.printStackTrace();
}
for (Goods goods:goodsList){
System.out.println(goods);
}
}