前端网站源码分享在线抓取工具,web前端整站源码

其实前端网站源码分享在线抓取工具的问题并不复杂,但是又很多的朋友都不太了解web前端整站源码,因此呢,今天小编就来为大家分享前端网站源码分享在线抓取工具的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

前言

用过老版本UC看小说的同学都知道,当年版权问题比较松懈,我们可以再UC搜索不同来源的小说,并且阅读,那么它是怎么做的呢?下面让我们自己实现一个小说线上采集阅读。(说明:仅用于技术学习、研究)

看小说时,最烦的就是有各种广告,这些广告有些是站长放上去的盈利手段,有些是被人恶意注入。在我的上一篇博客中实现了小说采集并保存到本地TXT文件HttpClients+Jsoup抓取笔趣阁小说,并保存到本地TXT文件,这样我们就可以导入手机用手机阅读软件看小说;那么我们这里实现一个可以在线看小说。

话不多说先看效果

首页:

页面很纯净,目前有三种来源

搜索结果页:

三个不同的来源,分页用的是layui的laypage,逻辑分页。(笔趣阁的搜索结果界面没有书本的图片)

翻页效果:

纵横网连简介等都帮我们分词,搞得数据量太大,速度太慢:books.size()<888

书本详情页:

小说阅读页:

上、下一章:

代码与分析

项目是springboot项目,原理非常简单,就是用httpclient构造一个请求头去请求对应的来源链接,用jsoup去解析响应回来的response,

通过jsoup的选择器去找到我们想要的数据,存入实体,放到ModelAndView里面,前端页面用thymeleaf去取值、遍历数据。

但是有一些书是要会员才能看,这种情况下我们需要做模拟登陆才能继续采集,这里只是一个简单的采集,就不做模拟登陆了。

采集过程中碰到的问题:

1、起点中文网采集书本集合时,想要的数据不在页面源码里面

起点中文网很机智,他在html代码了没有直接展示page分页信息的链接

可以看到,httpClient请求回来的response里分页信息标签里面是空的,但用浏览器去请求里面有信息

这是因为httpClient去模拟我们的浏览器访问某个链接,直接响应回这个链接对应的内容,并不会去帮我们触发其他的ajax,而浏览器回去解析响应回来的html,当碰到img、script、link等标签它会帮我们去ajax请求对应的资源。由此推测,page相关的信息,起点中文网是在js代码里面去获取并追加,最后通过network找到它的一些蛛丝马迹

既然他没有写在html里,那我们就自己去创建连接,可以看到html上有当前页跟最大页数

完美

2、笔趣阁查看书本详情,图片防盗链

笔趣阁有一个图片防盗,我们在自己的html引入图片路径时,但当我们把链接用浏览器访问时是可以的

对比一下两边的请求头

首先我们要知道什么事图片防盗链,猛戳这里–>:图片防盗链原理及应对方法;我们直接用大佬的反防盗链方法,并且针对我们的项目改造一下:

<divid=&34;></div>

/**\n*反防盗链\n*/\nfunctionshowImg(parentObj,url){\n//来一个随机数\nvarframeid=&39;+Math.random();\n//放在(父页面)window里面iframe的script标签里面绑定了window.onload,作用:设置iframe的高度、宽度<script>window.onload=function(){parent.document.getElementById(\\&39;+frameid+&39;).height=document.getElementById(\\&39;).height+\\&39;;}<&39;/script>\nwindow.img=&39;&39;?&39;\\&39;;\n//iframe调用parent.img\n$(parentObj).append(&34;&39;&34;javascript:parent.img;&34;0&34;no&39;);\n}\n\nshowImg($(&bookImg&1&pageNo=34;斗破苍穹&34;1&34;34;+i,param);\ni++;\n}\nreturnsrc;\n}\n\n/**\n*采集当前url完整response实体.toString()\n*\n*@paramurlurl\n*@returnresponse实体.toString()\n*/\npublicstaticStringgather(Stringurl,StringrefererUrl){\nStringresult=null;\ntry{\n//创建httpclient对象(这里设置成全局变量,相对于同一个请求session、cookie会跟着携带过去)\nCloseableHttpClienthttpClient=HttpClients.createDefault();\n//创建get方式请求对象\nHttpGethttpGet=newHttpGet(url);\nhttpGet.addHeader(&34;,&34;);\n//包装一下\nhttpGet.addHeader(&34;,&34;);\nhttpGet.addHeader(&34;,refererUrl);\nhttpGet.addHeader(&34;,&34;);\n\n//通过请求对象获取响应对象\nCloseableHttpResponseresponse=httpClient.execute(httpGet);\n//获取结果实体\nif(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){\nresult=EntityUtils.toString(response.getEntity(),&34;);\n}\n\n//释放链接\nresponse.close();\n}\n//这里还可以捕获超时异常,重新连接抓取\ncatch(Exceptione){\nresult=null;\nSystem.err.println(&34;);\ne.printStackTrace();\n}\nreturnresult;\n}\n}

Controller层:

/**\n*BookController层\n*/\n@RestController\n@RequestMapping(&34;)\npublicclassBookContrller{\n\n/**\n*来源集合\n*/\nprivatestaticMap<String,Map<String,String>>source=newHashMap<>();\n\nstatic{\n//笔趣阁\nsource.put(&34;,BookHandler_biquge.biquge);\n\n//纵横中文网\nsource.put(&34;,BookHandler_zongheng.zongheng);\n\n//起点中文网\nsource.put(&34;,BookHandler_qidian.qidian);\n}\n\n/**\n*访问首页\n*/\n@GetMapping(&34;)\npublicModelAndViewindex(){\nreturnnewModelAndView(&34;);\n}\n\n/**\n*搜索书名\n*/\n@GetMapping(&34;)\npublicModelAndViewsearch(Bookbook){\n//结果集\nArrayList<Book>books=newArrayList<>();\n//关键字\nStringkeyWord=book.getBookName();\n//来源\nStringsourceKey=book.getSourceKey();\n\n//获取来源详情\nMap<String,String>src=source.get(sourceKey);\n\n//编码\ntry{\nkeyWord=URLEncoder.encode(keyWord,src.get(&34;));\n}catch(UnsupportedEncodingExceptione){\ne.printStackTrace();\n}\n//searchUrl\nsrc.put(&34;,BookUtil.insertParams(src.get(&34;),keyWord,&34;));\n\n//调用不同的方法\nswitch(sourceKey){\ncase&34;:\nBookHandler_biquge.book_search_biquge(books,src,keyWord);\nbreak;\ncase&34;:\nBookHandler_zongheng.book_search_zongheng(books,src,keyWord);\nbreak;\ncase&34;:\nBookHandler_qidian.book_search_qidian(books,src,keyWord);\nbreak;\ndefault:\n//默认所有都查\nBookHandler_biquge.book_search_biquge(books,src,keyWord);\nBookHandler_zongheng.book_search_zongheng(books,src,keyWord);\nBookHandler_qidian.book_search_qidian(books,src,keyWord);\nbreak;\n}\n\nSystem.out.println(books.size());\nModelAndViewmodelAndView=newModelAndView(&34;,&34;,books);\ntry{\nmodelAndView.addObject(&34;,URLDecoder.decode(keyWord,src.get(&34;)));\n}catch(UnsupportedEncodingExceptione){\ne.printStackTrace();\n}\nmodelAndView.addObject(&34;,sourceKey);\nreturnmodelAndView;\n}\n\n/**\n*访问书本详情\n*/\n@GetMapping(&34;)\npublicModelAndViewdetails(StringsourceKey,StringbookUrl,StringsearchUrl){\nMap<String,String>src=source.get(sourceKey);\nsrc.put(&34;,searchUrl);\nBookbook=newBook();\n//调用不同的方法\nswitch(sourceKey){\ncase&34;:\nbook=BookHandler_biquge.book_details_biquge(src,bookUrl);\nbreak;\ncase&34;:\nbook=BookHandler_zongheng.book_details_zongheng(src,bookUrl);\nbreak;\ncase&34;:\nbook=BookHandler_qidian.book_details_qidian(src,bookUrl);\nbreak;\ndefault:\nbreak;\n}\nreturnnewModelAndView(&34;,&34;,book);\n}\n\n/**\n*访问书本章节\n*/\n@GetMapping(&34;)\npublicModelAndViewread(StringsourceKey,StringchapterUrl,StringrefererUrl){\nMap<String,String>src=source.get(sourceKey);\nBookbook=newBook();\n//调用不同的方法\nswitch(sourceKey){\ncase&34;:\nbook=BookHandler_biquge.book_read_biquge(src,chapterUrl,refererUrl);\nbreak;\ncase&34;:\nbook=BookHandler_zongheng.book_read_zongheng(src,chapterUrl,refererUrl);\nbreak;\ncase&34;:\nbook=BookHandler_qidian.book_read_qidian(src,chapterUrl,refererUrl);\nbreak;\ndefault:\nbreak;\n}\nreturnnewModelAndView(&34;,&34;,book);\n}\n}

三个不同来源的Handler处理器,每个来源都有不同的采集规则:

\nBookHandler_biquge

/**\n*笔趣阁采集规则\n*/\npublicclassBookHandler_biquge{\n\n/**\n*来源信息\n*/\npublicstaticHashMap<String,String>biquge=newHashMap<>();\n\nstatic{\n//笔趣阁\nbiquge.put(&34;,&34;);\nbiquge.put(&34;,&34;);\nbiquge.put(&34;,&34;);\nbiquge.put(&34;,&34;);\nbiquge.put(&34;,&34;);\nbiquge.put(&34;,&1&page=34;);\n}\n\n/**\n*获取searchlist笔趣阁采集规则\n*\n*@parambooks结果集合\n*@paramsrc源目标\n*@paramkeyWord关键字\n*/\npublicstaticvoidbook_search_biquge(ArrayList<Book>books,Map<String,String>src,StringkeyWord){\n//采集术\nStringhtml=BookUtil.gather(src.get(&34;),src.get(&34;));\ntry{\n//解析html格式的字符串成一个Document\nDocumentdoc=Jsoup.parse(html);\n\n//当前页集合\nElementsresultList=doc.select(&nr&34;a&34;href&34;a&34;a&34;a&34;href&34;div.pages>a.ngroup&34;href&34;baseUrl&34;searchUrl&34;searchUrl&34;http&34;baseSearchUrl&34;采集数据操作出错&34;searchUrl&34;meta[property=og:url]&34;content&34;meta[property=og:image]&34;content&34;div34;).text());\n//作者\nbook.setAuthor(doc.select(&34;).attr(&34;));\n//更新时间\nbook.setUpdateDate(doc.select(&34;).attr(&34;));\n//最新章节\nbook.setLatestChapter(doc.select(&34;).attr(&34;));\nbook.setLatestChapterUrl(doc.select(&34;).attr(&34;));\n//类型\nbook.setType(doc.select(&34;).attr(&34;));\n//简介\nbook.setSynopsis(doc.select(&34;).attr(&34;));\n//状态\nbook.setStatus(doc.select(&34;).attr(&34;));\n\n//章节目录\nArrayList<Map<String,String>>chapters=newArrayList<>();\nfor(Elementresult:doc.select(&listdd&34;chapterName&34;a&34;url&34;a&34;href&34;采集数据操作出错&34;http&34;baseUrl&34;div.box_con>div.bookname>h1&34;div.box_con>div34;).remove();\n//当前章节内容\nbook.setNowChapterValue(doc.select(&content&34;div.bottem2a:matches((?i)下一章)&34;div.bottem2a:matches((?i)下一章)&34;href&34;div.bottem2a:matches((?i)上一章)&34;div.bottem2a:matches((?i)上一章)&34;href&34;采集数据操作出错&34;name&34;纵横中文网&34;key&34;zongheng&34;baseUrl&34;http://www.zongheng.com&34;baseSearchUrl&34;http://search.zongheng.com/s&34;UrlEncode&34;UTF-8&34;searchUrl&34;http://search.zongheng.com/s?keyword=2&sort=&34;searchUrl&34;baseUrl&34;div.search-tab>div.search-result-list&34;div.imgboxa&34;href&34;div.imgboximg&34;src&34;h2.tit&34;div.bookinfo>a&34;div.bookinfo>a&34;p&34;div.bookinfo>span&34;div.bookinfo>span&34;div.search_d_pagesize>a.search_d_next&34;href&34;baseUrl&34;searchUrl&34;searchUrl&34;http&34;baseSearchUrl&34;采集数据操作出错&34;searchUrl&34;div.book-img>img&34;src&34;div.book-info>div.book-name&34;div.book-authordiv.au-name&34;div.book-new-chapterdiv.time&34;div.book-new-chapterdiv.tita&34;div.book-new-chapterdiv.tita&34;href&34;div.book-label>a&34;div.book-dec>p&34;div.book-label>a&34;a.all-catalog&34;href&34;ul.chapter-listli&34;chapterName&34;a&34;url&34;a&34;href&34;采集数据操作出错&34;http&34;baseUrl&34;div.title_txtbox&34;div.contentimg&34;div.content&34;div.chap_btnboxa:matches((?i)下一章)&34;div.chap_btnboxa:matches((?i)下一章)&34;href&34;div.chap_btnboxa:matches((?i)上一章)&34;div.chap_btnboxa:matches((?i)上一章)&34;href&34;采集数据操作出错&34;name&34;起点中文网&34;key&34;qidian&34;baseUrl&34;http://www.qidian.com&34;baseSearchUrl&34;https://www.qidian.com/search&34;UrlEncode&34;UTF-8&34;searchUrl&34;https://www.qidian.com/search?kw=2&34;searchUrl&34;baseUrl&34;li.res-book-item&34;div.book-img-boxa&34;href&34;div.book-img-boximg&34;src&34;div.book-mid-info>h4&34;div.book-mid-info>p.author>a&34;div.book-mid-info>p.author>a&34;div.book-mid-info>p.intro&34;div.book-mid-info>p.author>span&34;div.book-mid-info>p.update>span&34;div.book-mid-info>p.update>a&34;div.book-mid-info>p.update>a&34;href&34;div34;).attr(&34;);\n\n//最大页数\nStringpageMax=doc.select(&page-container&34;data-pageMax&34;baseUrl&34;searchUrl&34;searchUrl&34;searchUrl&34;page=&34;page=&34;采集数据操作出错&34;https:&34;searchUrl&34;div.book-img>a34;).attr(&34;);\nimg=&34;+img;\nbook.setImg(img);\n//书名\nbook.setBookName(doc.select(&34;).text());\n//作者\nbook.setAuthor(doc.select(&34;).text());\n//更新时间\nbook.setUpdateDate(doc.select(&34;).text());\n//最新章节\nbook.setLatestChapter(doc.select(&34;).text());\nbook.setLatestChapterUrl(doc.select(&34;).attr(&34;));\n//类型\nbook.setType(doc.select(&34;).first().text());\n//简介\nbook.setSynopsis(doc.select(&34;).text());\n//状态\nbook.setStatus(doc.select(&34;).first().text());\n\n//章节目录\n\n//创建httpclient对象(这里设置成全局变量,相对于同一个请求session、cookie会跟着携带过去)\nBasicCookieStorecookieStore=newBasicCookieStore();\nCloseableHttpClienthttpClient=HttpClients.custom().setDefaultCookieStore(cookieStore).build();\n//创建get方式请求对象\nHttpGethttpGet=newHttpGet(&34;);\nhttpGet.addHeader(&34;,&34;);\n//包装一下\nhttpGet.addHeader(&34;,&34;);\nhttpGet.addHeader(&34;,&34;);\n//通过请求对象获取响应对象\nCloseableHttpResponseresponse=httpClient.execute(httpGet);\n//获得Cookies\nString_csrfToken=&34;;\nList<Cookie>cookies=cookieStore.getCookies();\nfor(inti=0;i<cookies.size();i++){\nif(&34;.equals(cookies.get(i).getName())){\n_csrfToken=cookies.get(i).getValue();\n}\n}\n\n//构造post\nStringbookId=doc.select(&bookImg&34;data-bid&34;https://book.qidian.com/ajax/book/category?_csrfToken=2&34;User-Agent&34;Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3497.100Safari/537.36&34;Connection&34;keep-alive&34;&34;UTF-8&34;data&34;vs&34;cs&34;chapterName&34;cN&34;url&34;https://read.qidian.com/chapter/&34;cU&34;采集数据操作出错&34;http&34;baseUrl&34;h3.j_chapterName&34;div.read-contentimg&34;div.read-content&34;div.chapter-controla:matches((?i)下一章)&34;div.chapter-controla:matches((?i)下一章)&34;href&34;https:&34;div.chapter-controla:matches((?i)上一章)&34;div.chapter-controla:matches((?i)上一章)&34;href&34;https:&34;采集数据操作出错&34;http://www.thymeleaf.org&34;UTF-8&34;stylesheet&34;http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css&bookName{\nwidth:300px;\n}\n\n34;main&34;title&34;form-inline&34;get&34;@{/book/search}&34;form-control&34;source&34;sourceKey&34;&34;biquge&34;zongheng&34;qidian&34;text&34;bookName&34;bookName&34;form-control&34;请输入…&34;btnbtn-info&34;submit&34;http://www.thymeleaf.org&34;UTF-8&34;stylesheet&34;http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css&34;stylesheet&34;http://hanlei.online/Onlineaddress/layui/css/layui.css&428bca1px;\n}\n\n.click-book-detail,.click-book-read{\ncursor:pointer;\ncolor:34;main&34;form-inline&34;get&34;@{/book/search}&34;form-control&34;source&34;sourceKey&34;&34;biquge&34;${sourceKey}==&39;&34;zongheng&34;${sourceKey}==&39;&34;qidian&34;${sourceKey}==&39;&34;text&34;bookName&34;bookName&34;form-control&34;请输入…&34;${keyWord}&34;btnbtn-info&34;submit&34;books&34;page&34;http://libs.baidu.com/jquery/2.1.4/jquery.min.js&34;http://hanlei.online/Onlineaddress/layui/layui.js&34;javascript&39;&34;&34;<divclass=&39;>&34;<imgclass=&39;data-bookurl=&34;+book.bookUrl+&39;data-sourcekey=&34;+book.source.key+&39;data-searchurl=&34;+book.source.searchUrl+&39;src=&34;+book.img+&39;></img>&34;<pclass=&39;data-bookurl=&34;+book.bookUrl+&39;data-sourcekey=&34;+book.source.key+&39;data-searchurl=&34;+book.source.searchUrl+&39;>书名:&34;</p>&34;<p>作者:&34;</p>&34;<p>简介:&34;</p>&34;<pclass=&39;data-chapterurl=&34;+book.latestChapterUrl+&39;data-sourcekey=&34;+book.source.key+&39;data-refererurl=&34;+book.source.refererurl+&39;>最新章节:&34;</p>&34;<p>更新时间:&34;</p>&34;<p>大小:&34;</p>&34;<p>状态:&34;</p>&34;<p>类型:&34;</p>&34;<p>来源:&34;</p>&34;</div><br/>&39;laypage&39;page&39;books&39;<&39;>&39;39;,\n})\n});\n\n$(&34;).on(&34;,&34;,function(even){\nvarbookUrl=$(this).data(&34;);\nvarsearchUrl=$(this).data(&34;);\nvarsourceKey=$(this).data(&34;);\nwindow.location.href=ctx+&34;+sourceKey+&34;+searchUrl+&34;+bookUrl;\n});\n$(&34;).on(&34;,&34;,function(even){\nvarchapterUrl=$(this).data(&34;);\nvarrefererUrl=$(this).data(&34;);\nvarsourceKey=$(this).data(&34;);\nwindow.location.href=ctx+&34;+sourceKey+&34;+refererUrl+&34;+chapterUrl;\n});\n</script>\n</html>

book_details

<!DOCTYPEhtml>\n<!–解决ideathymeleaf表达式模板报红波浪线–>\n<!–suppressALL–>\n<htmlxmlns:th=&34;>\n<head>\n<metacharset=&34;>\n<title>BOOKDETAILS</title>\n<!–新Bootstrap核心CSS文件–>\n<linkrel=&34;href=&34;>\n<linkrel=&34;href=&34;/>\n<style>\nbody{\nbackground-color:antiquewhite;\n}\n\n.main{\nmargin:auto;\nwidth:500px;\nmargin-top:150px;\n}\n\n.book{\nborder-bottom:solid428bca;\n}\n\n.click-book-detail:hover{\ncolor:rgba(150,149,162,0.47);\n}\n\n.click-book-read:hover{\ncolor:rgba(150,149,162,0.47);\n}\n\na{\ncolor:34;main&39;book&34;bookImg&34;${book.bookName}&34;${book.author}&34;${book.synopsis}&34;${book.latestChapterUrl}&34;${book.latestChapter}&34;${book.updateDate}&34;${book.magnitude}&34;${book.status}&34;${book.type}&34;${book.source.name}&34;chapters&34;chapter,iterStat:${book.chapters}&34;click-book-read&34;data-chapterurl=${chapter.url},data-sourcekey=${book.source.key},data-refererurl=${book.bookUrl}&34;${chapter.chapterName}&34;http://libs.baidu.com/jquery/2.1.4/jquery.min.js&34;javascript&39;&39;frameimg&39;&39;\\&39;img\\&39;px\\&39;+&39;<imgsrc=\\&39;+url+&39;+Math.random()+&39;/>&39;<iframeid=&39;+frameid+&34;src=&34;frameBorder=&34;scrolling=&34;></iframe>&34;34;),book.img);\n\n$(&34;).on(&34;,&34;,function(even){\nvarchapterUrl=$(this).data(&34;);\nvarrefererUrl=$(this).data(&34;);\nvarsourceKey=$(this).data(&34;);\nwindow.location.href=ctx+&34;+sourceKey+&34;+refererUrl+&34;+chapterUrl;\n});\n\n</script>\n</html>

book_read

<!DOCTYPEhtml>\n<!–解决ideathymeleaf表达式模板报红波浪线–>\n<!–suppressALL–>\n<htmlxmlns:th=&34;>\n<head>\n<metacharset=&34;>\n<title>BOOKREAD</title>\n<style>\nbody{\nbackground-color:antiquewhite;\n}\n\n.main{\npadding:10px20px;\n}\n\n.click-book-detail,.click-book-read{\ncursor:pointer;\ncolor:34;main&34;${book.nowChapter}&34;${book.nowChapterValue}&34;click-book-readfloat-left&34;data-chapterurl=${book.nextChapterUrl},data-sourcekey=${book.source.key},data-refererurl=${book.nowChapterUrl}&34;${book.nextChapter}&34;click-book-readfloat-left&34;data-chapterurl=${book.prevChapterUrl},data-sourcekey=${book.source.key},data-refererurl=${book.nowChapterUrl}&34;${book.prevChapter}&34;http://libs.baidu.com/jquery/2.1.4/jquery.min.js&34;javascript&39;&34;body&34;click&34;.click-book-read&34;chapterurl&34;refererurl&34;sourcekey&34;/book/read?sourceKey=&34;&refererUrl=&34;&chapterUrl=&34;http://www.thymeleaf.org&34;UTF-8&34;stylesheet&34;http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css&34;stylesheet&34;http://hanlei.online/Onlineaddress/layui/css/layui.css&428bca1px;\n}\n\n.click-book-detail,.click-book-read{\ncursor:pointer;\ncolor:34;main&34;form-inline&34;get&34;@{/book/search}&34;form-control&34;source&34;sourceKey&34;&34;biquge&34;${sourceKey}==&39;&34;zongheng&34;${sourceKey}==&39;&34;qidian&34;${sourceKey}==&39;&34;text&34;bookName&34;bookName&34;form-control&34;请输入…&34;${keyWord}&34;btnbtn-info&34;submit&34;books&34;page&34;http://libs.baidu.com/jquery/2.1.4/jquery.min.js&34;http://hanlei.online/Onlineaddress/layui/layui.js&34;javascript&39;&34;&34;<divclass=&39;>&34;<imgclass=&39;data-bookurl=&34;+book.bookUrl+&39;data-sourcekey=&34;+book.source.key+&39;data-searchurl=&34;+book.source.searchUrl+&39;src=&34;+book.img+&39;></img>&34;<pclass=&39;data-bookurl=&34;+book.bookUrl+&39;data-sourcekey=&34;+book.source.key+&39;data-searchurl=&34;+book.source.searchUrl+&39;>书名:&34;</p>&34;<p>作者:&34;</p>&34;<p>简介:&34;</p>&34;<pclass=&39;data-chapterurl=&34;+book.latestChapterUrl+&39;data-sourcekey=&34;+book.source.key+&39;data-refererurl=&34;+book.source.refererurl+&39;>最新章节:&34;</p>&34;<p>更新时间:&34;</p>&34;<p>大小:&34;</p>&34;<p>状态:&34;</p>&34;<p>类型:&34;</p>&34;<p>来源:&34;</p>&34;</div><br/>&39;laypage&39;page&39;books&39;<&39;>&39;39;,\n})\n});\n\n$(&34;).on(&34;,&34;,function(even){\nvarbookUrl=$(this).data(&34;);\nvarsearchUrl=$(this).data(&34;);\nvarsourceKey=$(this).data(&34;);\nwindow.location.href=ctx+&34;+sourceKey+&34;+searchUrl+&34;+bookUrl;\n});\n$(&34;).on(&34;,&34;,function(even){\nvarchapterUrl=$(this).data(&34;);\nvarrefererUrl=$(this).data(&34;);\nvarsourceKey=$(this).data(&34;);\nwindow.location.href=ctx+&34;+sourceKey+&34;+refererUrl+&34;+chapterUrl;\n});\n</script>\n</html>

解决办法:参考https://blog.csdn.net/xiaoxian8023/article/details/49865335,绕过证书验证

在BookUtil.java中新增方法

/**\n*绕过SSL验证\n*/\nprivatestaticSSLContextcreateIgnoreVerifySSL()throwsNoSuchAlgorithmException,KeyManagementException{\nSSLContextsc=SSLContext.getInstance(&34;);\n\n//实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法\nX509TrustManagertrustManager=newX509TrustManager(){\n@Override\npublicvoidcheckClientTrusted(\njava.security.cert.X509Certificate[]paramArrayOfX509Certificate,\nStringparamString)throwsCertificateException{\n}\n\n@Override\npublicvoidcheckServerTrusted(\njava.security.cert.X509Certificate[]paramArrayOfX509Certificate,\nStringparamString)throwsCertificateException{\n}\n\n@Override\npublicjava.security.cert.X509Certificate[]getAcceptedIssuers(){\nreturnnull;\n}\n};\n\nsc.init(null,newTrustManager[]{trustManager},null);\nreturnsc;\n}

然后在gather方法中改成这样获取httpClient

/**\n*采集当前url完整response实体.toString()\n*\n*@paramurlurl\n*@returnresponse实体.toString()\n*/\npublicstaticStringgather(Stringurl,StringrefererUrl){\nStringresult=null;\ntry{\n//采用绕过验证的方式处理https请求\nSSLContextsslcontext=createIgnoreVerifySSL();\n\n//设置协议http和https对应的处理socket链接工厂的对象\nRegistry<ConnectionSocketFactory>socketFactoryRegistry=RegistryBuilder.<ConnectionSocketFactory>create()\n.register(&34;,PlainConnectionSocketFactory.INSTANCE)\n.register(&34;,newSSLConnectionSocketFactory(sslcontext))\n.build();\nPoolingHttpClientConnectionManagerconnManager=newPoolingHttpClientConnectionManager(socketFactoryRegistry);\nHttpClients.custom().setConnectionManager(connManager);\n\n//创建自定义的httpclient对象\nCloseableHttpClienthttpClient=HttpClients.custom().setConnectionManager(connManager).build();\n\n\n//创建httpclient对象(这里设置成全局变量,相对于同一个请求session、cookie会跟着携带过去)\n//CloseableHttpClienthttpClient=HttpClients.createDefault();\n\n//创建get方式请求对象\nHttpGethttpGet=newHttpGet(url);\nhttpGet.addHeader(&34;,&34;);\n//包装一下\nhttpGet.addHeader(&34;,&34;);\nhttpGet.addHeader(&34;,refererUrl);\nhttpGet.addHeader(&34;,&34;);\n\n//通过请求对象获取响应对象\nCloseableHttpResponseresponse=httpClient.execute(httpGet);\n//获取结果实体\nif(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){\nresult=EntityUtils.toString(response.getEntity(),&34;);\n}\n\n//释放链接\nresponse.close();\n}\n//这里还可以捕获超时异常,重新连接抓取\ncatch(Exceptione){\nresult=null;\nSystem.err.println(&34;);\ne.printStackTrace();\n}\nreturnresult;\n}

这样就可以正常抓取了

我们之前获取项目路径用的是

varctx=/*[[@{/}]]*/&39;;

突然发现不行了,跳转的路径直接是/开头,现在改成这样获取

//项目路径\nvarctx=[[${字符串

/**\n*自动注入参数\n*例如:\n*\n*@paramsrchttp://search.zongheng.com/s?keyword=2&sort=\n*@paramparams&34;,&34;\n*@returnhttp://search.zongheng.com/s?keyword=斗破苍穹&pageNo=1&sort=\n*/\npublicstaticStringinsertParams(Stringsrc,String…params){\ninti=1;\nfor(Stringparam:params){\nsrc=src.replaceAll(&&字符串,在进行第一次搜索之后,字符串了,因此后面的搜索结果都是第一次的结果…

解决:获取来源时不是用=赋值,而是复制一份,三个方法都要改

修改前:

//获取来源详情\nMap<String,String>src=source.get(sourceKey);

修改后:

//获取来源详情,复制一份\nMap<String,String>src=newHashMap<>();\nsrc.putAll(source.get(sourceKey));

多端开发

公司最近打算做手机端,学习了DCloud公司的uni-app,开发工具是HBuilderX,并用我们的小说爬虫学习、练手,做了个H5手机端的页面

DCloud公司官网:https://www.dcloud.io/

uni-app官网:https://uniapp.dcloud.io/

uni-app是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可编译到iOS、Android、H5、以及各种小程序等多个平台。

效果图:

代码开源

代码已经开源、托管到我的GitHub、码云:

GitHub:https://github.com/huanzi-qch/spider

码云:https://gitee.com/huanzi-qch/spider

版权声明

作者:huanzi-qch

出处:https://www.cnblogs.com/huanzi-qch

若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.

好了,关于前端网站源码分享在线抓取工具和web前端整站源码的问题到这里结束啦,希望可以解决您的问题哈!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平