XpathSiteRule.java 序列化书源json的类

参考书源

假设网站是https://www.jx.la/ ,搜索斗破苍穹

1. 填写siteName和baseUrl

siteName中填入笔趣阁jx,将向用户展示这个名字

baseUrl中填入https://www.jx.la/,这个网址在后续爬取的url是相对链接时会按一定规律合并成完整链接。

2. 解析搜索接口

  1. 浏览器抓搜索接口

    在搜索的时候抓一下请求了什么网址,chrome中直接使用开发者工具即可

我们搜索斗破苍穹,抓到搜索网址,以及他的请求参数:siteid=qula&q=斗破苍穹

https://sou.xanbhx.com/search?siteid=qula&q=%E6%96%97%E7%A0%B4%E8%8B%8D%E7%A9%B9

searchUrl中填入网址https://sou.xanbhx.com/search

  1. searchMethod中填入GET/POST方法,这里我们是一个GET方法

  2. 搜索接口的参数,填写searchParam:q={keyword},会被替换成搜索关键词

    1. 如果是GET请求,会拼接成https://sou.xanbhx.com/q=斗破苍穹

      这里GET请求还有其他参数,可以改url,将searchUrl改为https://sou.xanbhx.com/search?siteid=qula&,会拼接成https://sou.xanbhx.com/search?siteid=qula&q=斗破苍穹

    2. 如果是POST请求,会post url地址,且以参数形式上传q=斗破苍穹

  3. 请注意搜索的文本编码,可在searchEncode替换UTF-8/GBK

3. 解析搜索结果

  1. 找到搜索结果集合的Xpath

搜索结果Xpath

如图,每一个搜索结果都是一个<li>,在Chrome中点击元素复制XPath,复制结果第一个li标签的xpath如下

第一个 li
//*[@id="search-main"]/div[1]/ul/li[1]
第二个 li
//*[@id="search-main"]/div[1]/ul/li[2]
所有 li
//*[@id="search-main"]/div[1]/ul/li

我们把li标签的父xpath填入searchBookList,即//*[@id="search-main"]/div[1]/ul/li

很显然,第一个是我们不想要的,从第二个开始取,使用XPath语法即可搞定

//*[@id="search-main"]/div[1]/ul/li[position()>1],更多可参考已有json或和我讨论。

  1. 解析相关信息,如小说名

搜索结果解析

完整xpath
//*[@id="search-main"]/div[1]/ul/li[2]/span[2]/a
相对于这一项结果的xpath
//span[2]/a
小说名(<a>标签内容)的xpath,xpath语法text()为<a>中的内容
.//span[2]/a/text()
小说目录页url的xpath,@href为<a>中的属性
.//span[2]/a/@href

因此,searchBookName=.//span[2]/a/text(),searchBookUrl=.//span[2]/a/@href

同理解析出最新章节、分类、作者、更新时间、状态填入即可。

搜索相关的解析书名、url、作者是必须填的。可选项如最新章节、更新时间、分类、状态、封面图片、字数等,可通过完整XPath填入searchExtraRule

4. 解析章节

  1. 找出章节集合的XPath

catalog_all.png

和搜索结果同样的方法

第一个章节
//*[@id="list"]/dl/dd[0]
第二个章节
//*[@id="list"]/dl/dd[1]
所有章节
//*[@id="list"]/dl/

catalogChapterList=//*[@id="list"]/dl/

然后以相对xpath解析出书名和章节内容url即可

catalogChapterName=.//dd[1]/a/text()

catalogChapterUrl=.//dd[1]/a/@href

  1. 可以追加封面、书籍介绍等元素

    如想要追加一个封面,以绝对xpath设置catalogExtraRule中的imageUrl即可,其他同理

    imageUrl=//*[@id="fmimg"]/img

5. 解析章节内容

content.png

直接把文本的xpath填入chapterLines即可,可以设置文本编码chapterEncodeType

这里是//*[@id="content"]/text()

6. 一些其他配置

除了上面必须要配置的以外,还可以配置一些其他的

cleaner : 删除广告,一行中如果包含这个字段就删除,用|分隔

siteClassify : 用户能看到的站点级别分类,可以按照下载网速、质量决定

ruleUpdateTime : 书源更新时间,是一个13位的时间戳,位数不足可补0

author : 书源作者