使用动态模型编和JSoup编写网络爬虫

使用动态模型编和JSoup编写网络爬虫

1.JSoup模型

    动态模型适合把各种技术和应用包装成模型,然后通过模型可以快速使用这些技术和应用,XWorker把JSoup简单封装成了模型,本文将简单介绍一下JSoup模型。

2.封装思路

    JSoup是一个Java API,用于处理HTML,它提供了大量的相关方法,把JSoup封装成模型的难点在于如何封装这些方法。

    XWorker的思路是HTML是一个树形结构的数据,因此JSoup模型也采用了树形的结构。比如Element节点下有AllElements节点,而AllElements节点就是对JSoup的Element.getAllElements()方法的封装,在AllElements节点下又可以添加其它节点来处理Elements或单个Element。

2.1.脚本和动作

    模型通常是死板的,即模型是对特有的功能的封装。在动态模型里常常使用脚本和动作来解决模型的死板问题。通常模型和脚本动作等结合在一起,既可以通过模型简单快速的使用功能,也可以通过脚本实现特殊的需求,比如未模型化的功能等。

3.示例

    在线示例https://www.xworker.org/rap?app=xworker.example.ExampleRWT&key=jsoup,下面的示例可以在在线示例中找到和运行。

3.1.简单示例

     下面的示例打印了XWorker的主页中的所有元素,通过模型可以快速获取Document和遍历所有Element,通过脚本可以实现自定义的内容。

<?xml version="1.0" encoding="utf-8"?>
 
<Document name="AllElements" descriptors="xworker.org.jsoup.DocumentActions/@Document"
     url="https://www.xworker.org/do?sc=xworker.app.orgweb.web.Index&amp;id=11">
    <description><![CDATA[<p>浏览文档的全部元素。</p>
]]></description>
    <AllElements interpretationType="">
        <ListIterator>
            <Groovy name="printLog">
                <code><![CDATA[import xworker.lang.executor.Executor;
 
def TAG = "AllElements";
Executor.info(TAG, element.tagName() + ":" + element.text());]]></code>
            </Groovy>
        </ListIterator>
    </AllElements>
</Document>

3.2.遍历打开页面中的链接

     通过ElementsByTag选择标签a的元素,然后通过ListIterator遍历,最后通过Document打开链接。

<?xml version="1.0" encoding="utf-8"?>
 
<Document name="GrabLinks" descriptors="xworker.org.jsoup.DocumentActions/@Document" url="https://www.xworker.org/do?sc=xworker.app.orgweb.web.Index&amp;id=11">
    <description><![CDATA[<p>抓取网页中的所有连接,即&lt;a href=.../&gt;。</p>
]]></description>
    <ElementsByTag tagName="a">
        <ListIterator>
            <RunAction>
                <ExecutorLog name="log" descriptors="xworker.lang.executor.ExecutorActions/@Log"
                     executorService="var:executorService" tag="GrabLinks" message="template:开始抓取:${element.absUrl(&quot;href&quot;)}"></ExecutorLog>
            </RunAction>
            <Document url="ognl:element.absUrl(&quot;href&quot;)">
                <RunAction>
                    <ExecutorLog name="log" descriptors="xworker.lang.executor.ExecutorActions/@Log"
                         executorService="var:executorService" tag="GrabLinks" message="template:URL已抓取:${document.title()}"></ExecutorLog>
                </RunAction>
            </Document>
        </ListIterator>
    </ElementsByTag>
</Document>

3.3.提交表单

    在本示例里获取所有表单(示例界面只有一个表单),然后设置表单中的name和password输入框的值,最后通过Post提交并打印提交后的网页的内容。

<?xml version="1.0" encoding="utf-8"?>
 
<Document name="FormSubmit" descriptors="xworker.org.jsoup.DocumentActions/@Document" url="https://www.xworker.org/do?sc=xworker.example.web.login.LoginExample">
    <description><![CDATA[<p>首先抓取登录页面,然后填入用户名和密码并提交,最后在日志中输出表单提交后返回的界面。</p>
]]></description>
    <AllElements>
        <Forms interpretationType="">
            <Iterator>
                <Groovy name="setFormValue">
                    <code><![CDATA[import xworker.lang.executor.Executor;
 
def TAG = "FormSubmit";
for(element in form.elements()){
     if(element.attr("name") == "name"){
         element.val("admin");
     }else if(element.attr("name") == "password"){
         element.val("admin");
     }
     Executor.info(TAG, element.attr("name") + "=" + element.val());
}]]></code>
                </Groovy>
                <Submit>
                    <Post>
                        <RunAction descriptors="xworker.org.jsoup.Commons/@RunAction">
                            <ExecutorLog name="log" descriptors="xworker.lang.executor.ExecutorActions/@Log"
                                 executorService="var:executorService" tag="FormSubmit"
                                 message="template:表单已提交:${document?string}"></ExecutorLog>
                        </RunAction>
                    </Post>
                </Submit>
            </Iterator>
        </Forms>
    </AllElements>
</Document>

4.总结

    通过本文可以知道像JSoup这样的API也是可以封装成模型的。在本文里并没有编辑JSoup模型的例子,但实际使用时会发现相对于编写Java代码,通过模型调用JSoup要简单和方便的多,并且通过脚本还可以实现模型本身没有实现的功能。

     目前XWorker只是初步封装了JSoup模型,后续可能会编写更多的相关模型,比如可能会实现断点续传下载大文件等等,另外第三方的模型也可以加入到JSoup模型框架里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值