百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

SeimiCrawler+SeimiAgent完美解决动态页面渲染Ajax抓取问题

myzbx 2025-10-23 08:34 4 浏览

前言

曾几何时,动态页面(ajax,内部js二次渲染等等)信息提取一直都是爬虫开发者的心痛点,一句话,实在没有合适的工具。尤其在Java里面,像htmlunit这种工具都算得上解析动态页面的神器了,但是他依然不够完备,达不到浏览器级的解析效果,遇到稍微复杂点的页面就不行了。在经历的各种痛与恨后,笔者决定干脆开发一款专为应对抓取,监控,以及测试这类场景使用的动态页面渲染处理服务器。要达到浏览器级的效果,那必须基于浏览器内核来开发,幸运的是我们有开源的webkit,更为幸运的是我们有对开发者更为友好的QtWebkit。所以SeimiAgent就这样诞生了。

SeimiAgent是基于QtWebkit开发的可在服务器端后台运行的一个webkit服务,可以通过SeimiAgent提供的http接口向SeimiAgent发送一个load请求(需求加载的URL以及对这个页面接受的渲染时间或是使用什么代理等参数),通过SeimiAgent去加载并渲染想要处理的动态页面,然后将渲染好的页面直接返给调用方进行后续处理,所以运行的SeimiAgent服务是与语言无关的,任何一种语言或框架都可以通过SeimiAgent提供的标准http接口来获取服务。SeimiAgent的加载渲染环境都是通用浏览器级的,所以不用担心他对动态页面的处理能力。目前SeimiAgent只支持返回渲染好的HTML文档,后续会增加图像快照已经PDF的支持,方便更为多样化的使用需求。

使用演示

SeimiCrawler是一个敏捷的,独立部署的,支持分布式的Java爬虫框架,希望能在最大程度上降低新手开发一个可用性高且性能不差的爬虫系统的门槛,以及提升开发爬虫系统的开发效率。在SeimiCrawler的世界里,绝大多数人只需关心去写抓取的业务逻辑就够了,其余的Seimi帮你搞定。设计思想上SeimiCrawler受Python的爬虫框架Scrapy启发很大,同时融合了Java语言本身特点与Spring的特性,并希望在国内更方便且普遍的使用更有效率的XPath解析HTML,所以SeimiCrawler默认的HTML解析器是JsoupXpath(独立扩展项目,非jsoup自带),默认解析提取HTML数据工作均使用XPath来完成(当然,数据处理亦可以自行选择其他解析器)。

整合使用

部署SeimiAgent

下载解压缩就不表了,上面的动态图中也有演示,下载地址可以到SeimiAgent主页找到。进到SeimiAgent的bin目录,执行:

./SeimiAgent -p 8000

这是启动SeimiAgent服务并监听8000端口。接下来实际上就可以使用任何语言通过http请求发送加载页面的请求,然后得到渲染后的结果。当然我们这里是要介绍SeimiCrawler是如何整合使用SeimiAgent的。

SeimiCrawler配置

SeimiCrawler在v0.3.0版本中已经内置支持了SeimiAgent,只需要开发者配置好SeimiAgent的地址和端口,然后在生成具体Request时选择是否要提交给SeimiAgent,并且指定如何递交。直接上个完整例子在注释中说明吧:

package cn.wanghaomiao.crawlers;

import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;

/**
 * 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
 * @author 汪浩淼 et.tw@163.com
 * @since 2016/4/14.
 */
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{

    /**
     * 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
     */
    @Value("${seimiAgentHost}")
    private String seimiAgentHost;

    //SeimiAgent监听的端口好,如上文中的8000
    @Value("${seimiAgentPort}")
    private int seimiAgentPort;

    @Override
    public String startUrls {
        return new String{"https://www.baidu.com"};
    }

    @Override
    public String seiAgentHost {
        return this.seimiAgentHost;
    }

    @Override
    public int seimiAgentPort {
        return this.seimiAgentPort;
    }

    @Override
    public void start(Response response) {
        Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
 .useSeimiAgent
 // 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
 //.setSeimiAgentUseCookie(true)
 // 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
 .setSeimiAgentRenderTime(5000);
        push(seimiAgentReq);
    }

    /**
     * 获取搜易贷首页总成交额
     * @param response
     */
    public void getTotalTransactions(Response response){
        JXDocument doc = response.document;
        try {
 String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text"),"");
 logger.info("Final Res:{}",trans);
        } catch (Exception e) {
 e.printStackTrace;
        }
    }
}

配置文件seimi.properties

seimiAgentHost=127.0.0.1
seimiAgentPort=8000

启动

public class Boot {
    public static void main(String[] args){
        Seimi s = new Seimi;
        s.start("seimiagent");
    }
}

SeimiCrawler启动后就可以看到你想要的搜易贷交易总额了。

完整的Demo地址

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...