生成海报3
# 风月读书内置书源说明
如何自行制作并添加书源.
基于面向接口开发的思想,对于书源我设计了如下接口:
// 这个接口位于xyz.fycz.myreader.webapi.crawler.base包下 public interface ReadCrawler { String getSearchLink(); // 书源的搜索url String getCharset(); // 书源的字符编码 String getSearchCharset(); // 书源搜索关键字的字符编码,和书源的字符编码就行 String getNameSpace(); // 书源主页地址 Boolean isPost(); // 是否以post请求搜索 String getContentFormHtml(String html); // 获取书籍内容规则 ArrayList<Chapter> getChaptersFromHtml(String html); // 获取书籍章节列表规则 ConcurrentMultiValueMap<SearchBookBean, Book> getBooksFromSearchHtml(String html); // 搜索书籍规则 }1
2
3
4
5
6
7
8
9
10
11
了解上述接口的方法,我们就可以开始创建书源了
第一步:创建一个书源类实现上述接口,下面以笔趣阁44为例进行说明
// 注意:如果搜索书籍页没有图片、最新章节、书籍简介等信息,可以通过实现BookInfoCrawler接口,从书籍详情页获取 public class BiQuGe44ReadCrawler implements ReadCrawler, BookInfoCrawler { //网站主页地址 public static final String NAME_SPACE = "https://www.wqge.cc"; /* 搜索url,搜索关键词以{key}进行占位 如果是post请求,以“,”分隔url,“,”前是搜索地址,“,”后是请求体,搜索关键词同样以{key}占位 例如:"https://www.9txs.com/search.html,searchkey={key}" */ public static final String NOVEL_SEARCH = "https://www.wqge.cc/modules/article/search.php?searchkey={key}"; // 书源字符编码 public static final String CHARSET = "GBK"; // 书源搜索关键词编码 public static final String SEARCH_CHARSET = "utf-8"; @Override public String getSearchLink() { return NOVEL_SEARCH; } @Override public String getCharset() { return CHARSET; } @Override public String getNameSpace() { return NAME_SPACE; } @Override public Boolean isPost() { return false; } @Override public String getSearchCharset() { return SEARCH_CHARSET; } /** * 从html中获取章节正文 * @param html * @return */ public String getContentFormHtml(String html) { Document doc = Jsoup.parse(html); Element divContent = doc.getElementById("content"); if (divContent != null) { String content = Html.fromHtml(divContent.html()).toString(); char c = 160; String spaec = "" + c; content = content.replace(spaec, " "); return content; } else { return ""; } } /** * 从html中获取章节列表 * * @param html * @return */ public ArrayList<Chapter> getChaptersFromHtml(String html) { ArrayList<Chapter> chapters = new ArrayList<>(); Document doc = Jsoup.parse(html); String readUrl = doc.select("meta[property=og:novel:read_url]").attr("content"); Element divList = doc.getElementById("list"); String lastTile = null; int i = 0; Elements elementsByTag = divList.getElementsByTag("dd"); for (int j = 9; j < elementsByTag.size(); j++) { Element dd = elementsByTag.get(j); Elements as = dd.getElementsByTag("a"); if (as.size() > 0) { Element a = as.get(0); String title = a.text() ; if (!StringHelper.isEmpty(lastTile) && title.equals(lastTile)) { continue; } Chapter chapter = new Chapter(); chapter.setNumber(i++); chapter.setTitle(title); String url = readUrl + a.attr("href"); chapter.setUrl(url); chapters.add(chapter); lastTile = title; } } return chapters; } /** * 从搜索html中得到书列表 * @param html * @return */ public ConcurrentMultiValueMap<SearchBookBean, Book> getBooksFromSearchHtml(String html) { ConcurrentMultiValueMap<SearchBookBean, Book> books = new ConcurrentMultiValueMap<>(); Document doc = Jsoup.parse(html); Elements divs = doc.getElementsByTag("table"); Element div = divs.get(0); Elements elementsByTag = div.getElementsByTag("tr"); for (int i = 1; i < elementsByTag.size(); i++) { Element element = elementsByTag.get(i); Book book = new Book(); Elements info = element.getElementsByTag("td"); book.setName(info.get(0).text()); book.setChapterUrl(NAME_SPACE + info.get(0).getElementsByTag("a").attr("href")); book.setAuthor(info.get(2).text()); book.setNewestChapterTitle(info.get(1).text()); book.setSource(BookSource.biquge44.toString()); // SearchBookBean用于合并相同书籍 SearchBookBean sbb = new SearchBookBean(book.getName(), book.getAuthor()); books.add(sbb, book); } return books; } /** * 获取书籍详细信息 * @param book */ public Book getBookInfo(String html, Book book){ Document doc = Jsoup.parse(html); Element img = doc.getElementById("fmimg"); book.setImgUrl(img.getElementsByTag("img").get(0).attr("src")); Element desc = doc.getElementById("intro"); book.setDesc(desc.getElementsByTag("p").get(0).text()); Element type = doc.getElementsByClass("con_top").get(0); book.setType(type.getElementsByTag("a").get(2).text()); return book; } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
第二步:添加书源到数据库。
BookSource source = new BookSource(); source.setSourceEName("ename");//这是内置书源标识,必填 source.setSourceName(source.text);//设置书源名称 source.setSourceGroup("内置书源");//设置书源分组 source.setEnable(true);//设置书源可用性 source.setSourceUrl("xyz.fycz.myreader.webapi.crawler.read.BiQuGe44ReadCrawler");//这是书源完整类路径,必填 source.setOrderNum(0);//内置书源一般设置排序为0 GreenDaoManager.getDaoSession().getBookSourceDao().insertOrReplace(source);//添加书源进数据库1
2
3
4
5
6
7
8



奶茶
$ 18

全味奶茶
¥ 11
推荐阅读
点击评论