java爬虫抓取动态网页(做数据爬虫时如何实现动态网页的解析(一))

优采云 发布时间: 2021-10-03 06:30

  java爬虫抓取动态网页(做数据爬虫时如何实现动态网页的解析(一))

  人们在做数据爬虫的时候一般会遇到这些问题:

  以上问题我们会在接下来的系列数据采集中一一解决,但是今天我们要解决的问题是如何实现动态网页的分析

  随着AJAX技术的不断普及和各种JS框架的出现,现在越来越多的页面由js渲染。对于爬虫来说,这种页面比较烦人:只提取HTML内容往往得不到有效信息。那么如何处理这种页面呢?一般来说,有两种方法

  解决方案1、硒

  Selenium 是一个基于火狐浏览器的开发者工具。结合selenium webdriver,可以实现js的动态渲染,模拟用户在浏览器中的真实操作,达到爬取数据的目的;每次通过selenium调用都会弹出浏览器界面。在浏览器中设置headless进入无界面状态;selenium的主要优点是浏览器页面的动态交互和js脚本的动态渲染。缺点是每次加载一个URL,就相当于打开了一次页面。渲染时间比较长,爬行。效率极低,可用于研究和学习,不适合在生产环境中使用

  2、抓包

  因为js渲染用到的数据是从后端获取的,每个ajax请求对应一个http api接口,所以只要仔细分析网页的ajax请求,找到对应的数据接口,就可以实现数据爬取另外,数据接口比页面更稳定。一般返回的数据结构不会改变;缺点是如果要爬取的页面请求过于复杂,需要一定的分析经验,使用分析工具耐心观察和调试定位。

  为了方便大家在实际生产中应用,这里以第二种方案来说明案例背景的流程

  全面爬取 IconFont 的 svg 图片

  过程再现

  

  图像.png

  

  图像.png

  通过该接口可以获取到具体Icon的svg标签数据。

  

  图像.png

  核心代码

  爬虫的主框架是webmagic,通过重写pageProcesser和pipeline两部分来捕获和存储图标。

  页面分辨率

<p>package com.crawler.icon;

import java.io.IOException;

import java.util.List;

import com.crawler.image.ImageDownloaderUtil;

import us.codecraft.webmagic.Page;

import us.codecraft.webmagic.Site;

import us.codecraft.webmagic.Spider;

import us.codecraft.webmagic.processor.PageProcessor;

public class ImageProcessor implements PageProcessor {

/**

* 网络爬虫相关配置

* 这里设置了重试次数,时间间隔

*/

private Site site = Site.me().setTimeOut(3000);

private static String LIST_URL = "https://www.iconfont.cn/api/collections.json.*";

public Site getSite() {

return site;

}

public void process(Page page) {

// 判断当前页面是用户列表页还是作品列表页

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

List ids = new JsonPathSelector("$.data.lists[*].id").selectList(page.getRawText());

if (CollectionUtils.isNotEmpty(ids)) {

for (String id : ids) {

// 根据获取到的用户Id 拼接处用户作品url并加入到待爬取队列

page.addTargetRequest("https://www.iconfont.cn/api/collection/detail.json?t=1575297168589&ctoken=M70q2zG_eHaf9_UIXc_KQO0e&id=" + id);

}

}

} else {

// 获取用户Icon列表

List items = new JsonPathSelector("$.data.icons[*]").selectList(page.getRawText());

page.putField("items", items);

}

}

public static void main(String[] args) throws IOException {

long startTime = System.currentTimeMillis();

// JsonFilePipeline pipeline = new JsonFilePipeline("d://tmp/icon/");

Spider spider = Spider.create(new IconProcessor()).addPipeline(new IconJsonPipeline("d://tmp/icon"));

//通过URL拼接的方式,采集多页 这里只抓取3页仅供学习

for (int i = 1; i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线