说完以上这些,就到了修改xml模板的环节了。
目录
xml模板的作用
一 2种模板的作用
1.app.xml 是用来配置采集的频道的信息。内容包括频道名称,请求链接,请求方式,请求头等。
2.对返回的新闻列表和返回的详情页的处理。
TemplateParser是模板解析器,会解析模板里的规则。AppCrawler是一个抽象类,具有一个解析器对象,在AppCrawler类里,解析出的规则会被赋值给对应的变量,requestList是请求新闻列表方法,会用到模板规则里的链接。
模板规则解析这部分暂时不会涉及到。
3.要做的就是继承AppCrawler类,根据需要重写requestList,requestDetail,processArticle这三个方法。
4.程序启动后会先解析模板
模板的作用相当于是 数据的初始化。
举个例子: 频道对应的变量就是appChannelInfo
二 app模板的配置
1.app.xml该文件名规定不许更改。其余模板名称可以更改
2.每个频道的http请求都需要配置
3.需要说明一下,在http请求的标签中 heder标签中的key为请求头的名称,value则为相应的值
<http method="GET">
<header key="" value="" />
</http>
4.template.xml文件的配置,在这里先提一下,因为在app.xml的模板中,每个频道最后都要解析到下一级模板中。解析的顺序和源码中编写顺序一致。
5.配置时的详细问题
pageNo=${变量名}
<变量名 from="1" to="3" increment="1" />
6.其余元素名称意义如下表
元素名称 | 说明 | 备注 |
app | 配置文件根元素。一个app中可以有多个channel。 |
|
site | app的站点信息,包含siteName、logo以及app的pc网址。 CDATA中保存着站点网址信息。 | siteName必须保持唯一 |
channel | app的频道信息,包含channelName,以及采集方式、抽取模板等信息。 CDATA中保存着频道的网址信息。 | channelName必须保持唯一; 频道网址信息必须存在确切确。 |
listPage | 频道列表页翻页配置 |
|
next | 翻页时,url中的参数变化范围。从from值,以increment值为步进,增加到to值。 max值是最大翻页次数,如果达到此值无条件停止翻页。 |
|
http | 请求发送方式 | get和post不区分大小写 |
header | 自定义的http header,key为header名称,value为header值 | 此值是固定的,每次请求都会有此信息 |
template | 频道信息抽取模板,name可以随便写,parent中写模板的相对于app.xml文件的路径。 一个channel可以有多个template | parent如果不为空,则其指定的抽取模板必须存在 |
将app.xml文件配置代码列出:
<app>
<!-- 站点信息,webSiteId会根据siteName计算,因此siteName要保持唯一性 -->
<!-- 站名命名规则 xxxx-手机客户端 -->
<site siteName="云南通-手机客户端" logo="browse/images/beijingTime.png" ignore="false">
<![CDATA[ http://apiparty.xinhuaapp.com ]]>
</site>
<!-- 频道信息,channelId会根据channelName计算。如果一个频道有多个列表入口页,可配置多个channel,保持channelName相同即可 -->
<!-- 可用ignore属性控制某个频道是否需要被采集 -->
<channel channelName="推荐" ignore="false">
<![CDATA[ https://apiparty.xinhuaapp.com/Service/IndexSvr.svc/GetIndexPage?modilarId=115228&pageNo=${cstart}&styleId=340&appId=136&appKey=d0779&projectId=1 ]]>
<!-- 列表翻页配置信息 -->
<listPage>
<!-- 翻页配置信息,元素名称为url中需要变换的参数,其值必须为数字 -->
<next max="3">
<cstart from="1" to="3" increment="1" />
</next>
<!-- http请求配置信息,method值为get或post,大小写无关 -->
<http method="GET">
<header key="token"
value="aee38189576a7179b817d5d979204af02832fe36ebed8347bbce21c74e7cba870fd561667a8602f3dfa43af324c1dd2938a8a37615f86d84ce84f0af13b0de811560132750312" />
<header key="random" value="999" />
</http>
</listPage>
<!-- 抓取的模板信息,name随便写,可继承parent路径模板的所有配置 -->
<template parent="/template2.xml" />
<template parent="/template22.xml" />
</channel>
</app>
三:template.xml的配置
将postman获取的json,使用jsonpath和xpath,进行数据定位。
一般来讲,能够采集的都采集上.
标题 作者 来源 时间 正文 图片链接 摘要
jsonpath教程:https://blog.csdn.net/myself8202/article/details/80724968
xpath教程: https://blog.csdn.net/u013332124/article/details/80621638
jsonpath校验地址:http://jsonpath.com/
示例配置代码如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- 模板信息,name随便写。可继承parent路径模板的所有配置。parent为空时,忽略 -->
<template parent=""
processor="com.公司.newsappcrawler.apps.yunnantong.YunnantongCrawler">
<!-- 列表页信息提取模板配置 -->
<list type="json">
<![CDATA[ $.Data.IndexContent[*]]]>
<articleUrl type="json">
<![CDATA[ $.Id ]]>
</articleUrl>
<title type="json">
<![CDATA[ $.Title ]]>
</title>
<source type="json">
<![CDATA[ $.Source ]]>
</source>
<abstractText type="json">
<![CDATA[ $.summary ]]>
</abstractText>
<commentCount type="json">
<![CDATA[ $.comment_count ]]>
</commentCount>
<commentUrl type="default">
<![CDATA[ null ]]>
</commentUrl>
<imageUrls type="json">
<![CDATA[ $.ImgUrls ]]>
</imageUrls>
<tag type="json" format="">
<![CDATA[ $.Tags ]]>
</tag>
</list>
<!-- 详情页信息提取模板配置 -->
<article type="json">
<![CDATA[ $.Data.Detail ]]>
<detailUrl type='json'>
<![CDATA[ $.DetailUrl]]>
</detailUrl>
<source type="html">
<![CDATA[ //span[@class='source']/text()]]>
</source>
<publishTime type="json" format="yyyy-MM-dd HH:mm:ss">
<![CDATA[ $.IssueTime ]]>
</publishTime>
</article>
<!-- 评论页信息提取模板配置,评论页只有列表页 -->
<comment type="json">
</comment>
</template>