动态网页抓取( 如何来突破这个梗获取我们急需的数据?(二))
优采云 发布时间: 2022-02-17 16:04动态网页抓取(
如何来突破这个梗获取我们急需的数据?(二))
Java爬虫Jsoup+httpclient获取动态生成的数据
前面我们详细聊过Jsoup,发现这个东西其实是一样的。只要是可以访问的静态资源页面,就可以直接用它来获取你需要的数据。详情跳转到Jsoup爬虫详解,不过很多时候网站为了防止数据被恶意爬取,做了很多掩饰,比如加密、动态加载等。这给我们写的爬虫程序造成了很大的麻烦,那么我们如何突破这个梗,得到我们急需的数据,
下面我们将详细说明如何获取
String startPage="https://item.jd.com/11476104681.html";
Document document = Jsoup.connect(startPage).userAgent
("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/52.0.2743.116 Safari/537.36").get();
这时候整个页面的数据其实已经获取到了,但是商品价格是通过回调函数获取然后填充的,所以这就需要我们编写爬虫非常耐心的找到价格数据的回调接口,我们直接访问这个界面就可以直接得到价格。下面是一个演示:
从这个截图可以看出,他传递的只是一个静态资源页面,完全没有价格参数,那么价格是怎么来的,继续找这个界面:
你会发现这个界面里面有很多参数是拼接在一起的,那么我们要做的就是分析一下所有参数是否有用
https://p.3.cn/prices/mgets?callback=jQuery9734926&type=1&area=1&pdtk=
pduid=14930020970791835891856&pdpin=jd_6738608ee8eed&pdbp=0&skuIds=J_11476104681&source=item-pc
可以尝试删除一些参数,发现这个接口需要的参数其实很简单:
https://p.3.cn/prices/mgets?callback=jQuery9734926&type=1&area=1&skuIds=J_11476104681&source=item-pc
看到这个你兴奋吗?您实际上可以更改其他一些京东产品ID,以获取当前价格和最高价格。我不知道价格是多少。我们需要做的就是编写一个Httpclient来模拟请求接口。
String doGet = HttpUtils.doGet("https://p.3.cn/prices/mgets?callback=jQuery9734926&type=1&area=1&skuIds=J_"+"11476104681"+"&source=item-pc", null);
System.out.println(doGet);
结果是这样的:
jQuery9734926([{"id":"J_11476104681","p":"880.00","m":"980.00","op":"980.00"}]);
至于后者,你直接解析JSON字符串,那么你想要的数据就是GET。
注意
这是对回调请求的数据的重新请求。这只是对之前动态获取商品价格的补充。在这种情况下,价格本身不是通过主链接带到页面的,而是在加载过程中由异步请求填充的。有时候数据是带过来的,但是我们用相关的JS处理还是拿不到。这时候,我们就不得不通过其他方式来获取数据了,后面会讲到。