概述
使用动态模型编和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&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&id=11">
<description><![CDATA[<p>抓取网页中的所有连接,即<a href=.../>。</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("href")}"></ExecutorLog>
</RunAction>
<Document url="ognl:element.absUrl("href")">
<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模型框架里。
最后
以上就是直率丝袜为你收集整理的使用动态模型编和JSoup编写网络爬虫使用动态模型编和JSoup编写网络爬虫的全部内容,希望文章能够帮你解决使用动态模型编和JSoup编写网络爬虫使用动态模型编和JSoup编写网络爬虫所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复