当前位置:   article > 正文

使用动态模型编和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,通过脚本可以实现自定义的内容。

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

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

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

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

3.3.提交表单

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Document name="FormSubmit" descriptors="xworker.org.jsoup.DocumentActions/@Document" url="https://www.xworker.org/do?sc=xworker.example.web.login.LoginExample">
  3. <description><![CDATA[<p>首先抓取登录页面,然后填入用户名和密码并提交,最后在日志中输出表单提交后返回的界面。</p>
  4. ]]></description>
  5. <AllElements>
  6. <Forms interpretationType="">
  7. <Iterator>
  8. <Groovy name="setFormValue">
  9. <code><![CDATA[import xworker.lang.executor.Executor;
  10. def TAG = "FormSubmit";
  11. for(element in form.elements()){
  12. if(element.attr("name") == "name"){
  13. element.val("admin");
  14. }else if(element.attr("name") == "password"){
  15. element.val("admin");
  16. }
  17. Executor.info(TAG, element.attr("name") + "=" + element.val());
  18. }]]></code>
  19. </Groovy>
  20. <Submit>
  21. <Post>
  22. <RunAction descriptors="xworker.org.jsoup.Commons/@RunAction">
  23. <ExecutorLog name="log" descriptors="xworker.lang.executor.ExecutorActions/@Log"
  24. executorService="var:executorService" tag="FormSubmit"
  25. message="template:表单已提交:${document?string}"></ExecutorLog>
  26. </RunAction>
  27. </Post>
  28. </Submit>
  29. </Iterator>
  30. </Forms>
  31. </AllElements>
  32. </Document>

4.总结

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/368758
推荐阅读
相关标签
  

闽ICP备14008679号