手机版

Java实现爬虫给应用提供数据(Jsoup网络爬虫)

时间:2021-09-18 来源:互联网 编辑:宝哥软件园 浏览:

一、需求

最近基于材料设计重构了自己的新闻App,数据来源是个问题。

有前人分析了知乎日报、凤凰新闻等原料药,根据相应的统一资源定位器可以获取新闻的JSON数据。为了锻炼写代码能力,笔者打算爬虫新闻页面,自己获取数据构建原料药。

二、效果图

下图是原网站的页面

爬虫获取了数据,展示到应用手机端

三、爬虫思路

关于应用的实现过程可以参看这几篇文章,本文主要讲解一下如何爬虫数据。

机器人下录制应用操作生成可交换的图像格式动态图的全过程://www .JB 51。net/article/78236。html文件的后缀学习安卓材料设计(回收视图代替ListView)://www .JB 51。net/article/78232。htmandroid项目实战之仿网易新闻的页面(回收视图)://www .JB 51。net/article/78230。html文件的后缀

Jsoup简介

Jsoup是一个爪哇的开源超文本标记语言解析器,可直接解析某个统一资源定位器地址、超文本标记语言文本内容。

Jsoup主要有以下功能:

-从一个网址,文件或字符串中解析HTML-使用数字正射影像图或半铸钢钢性铸铁(铸造半钢)选择器来查找、取出数据;-对超文本标记语言元素、属性、文本进行操作;-清除不受信任的HTML(来防止XSS攻击)四、爬虫过程

得到请求获取网页超文本标记语言

新闻网页超文本标记语言的数字正射影像图树如下所示:

下面这段代码根据指定的url,用代码获取得到请求返回的超文本标记语言源代码。

公共静态字符串字符串引发常见异常{网址字符串html=尝试{ url=新的网址(URlstRN);HttpURLConnection连接=(HttpURLConnection)URL。open connection();连接。setrequest方法(' GET ');连接。setconnecttimeout(5000);连接。setdoinput(true);连接。setdooutput(true);if(连接。getresponse code()==200){ InputStream in=connection。getinputstream();html=StreamTool。intostringByte(in);} else {抛出新的常见异常('新闻服务器返回值不为200');} } catch(异常e){ e . print stack trace();引发新的公共异常(' get请求失败');}返回html} InputStream in=连接。getinputstream();将得到输入流转化为字符串是个普遍需求,我们将其抽象出来,写一个工具方法。

公共类流工具{公共静态String into stringbyteinputstream(in)引发异常{ bytearayoutstream outr=new bytearayoutstream();字节[]缓冲区=新字节[1024];int len=0;StringBuilder内容=new StringBuilder();while ((len=in.read(buffer))!=-1) { content.append(新字符串(buffer,0,len,' UTF-8 ');} OutStr。close();返回内容。tostring();}}五、解析超文本标记语言获取标题

利用谷歌浏览器的审查元素,找出新闻标题对于的超文本标记语言代码:

div id=' article _ title ' h1 a href=' http://请参阅。西电。edu。cn/html/news/7428。' html '关于举办《经典音乐作品欣赏与人文审美》 讲座的通知/a /h1/div我们需要从上面的超文本标记语言中找出id='article_title '的部分,使用getElementById(字符串Id)方法

string HTMl str=HttpTool。DoGet(URl字符串);//将获取的网页超文本标记语言源代码转化为document document=Jsoup。解析(HTMl str);元素文章=文档。getelementbyid(' article ');//标题元素标题=文章。getelementbyid(' article _ title ');string TItle STr=title ele。text();六、获取发布日期、信息来源

同样找出对于的超文本标记语言代码

超文本标记语言标题/标题正文div id=' article _ detail '跨度2015-05-28/跨度跨度来源:/跨度浏览次数:脚本语言=' JavaScript ' src=' http :http://参见。西电。edu。cn/index。PHP/news/click/id/7428 '/脚本477 /span /div /body/html思路也和上面类似,使用getElementById(字符串Id)方法找出id='article_detail '为元素,再利用getElementsByTag获取跨度部分。因为一共有3个跨度./span,所以返回的是元素而不是元素。

//文章_详细信息包括了2016-01-15 来源: 浏览次数:177元素detailEle=article。getelementbyid(' article _ detail ');元素详细信息=详细信息。getelementsbytag(' span ');//发布时间String dateStr=details.get(0).text();//新闻来源String sourceStr=details.get(1).text();七、解析浏览次数

如果打印出上面的细节. get(2).text(),只会得到

浏览次数:没有浏览次数?为什么呢?

因为浏览次数是Java脚本语言渲染出来的,Jsoup爬虫可能仅仅提取超文本标记语言内容,得不到动态渲染出的数据。解决方法有两种

在爬虫的时候,内置一个浏览器内核,执行射流研究…渲染页面后,再抓取。这方面对应的工具有硒、HTMl单位或者PhantomJs。所以分析射流研究…请求,找到对应数据的请求全球资源定位器(统一资源定位符)如果你访问上面的urlhttp://see.xidian.edu.cn/index.php/news/click/id/7428,会得到下面的结果

文档写入(478)这个478就是我们需要的浏览次数,我们对上面的全球资源定位器(统一资源定位符)做得到请求,得到返回的字符串,利用正则找出其中的数字。

//访问这个新闻页面,浏览次数会1,次数是射流研究…渲染的string jsStr=HttpTool。doget(COUNT _ BASE _ URL CurrentPage);int readTimes=整数。par sent(jsstr。全部替换(' \ \ D ',' ');//或者使用下面这个正则方法//string readtimestr=jsstr.replaceall('[^0-9]' ' ');八、解析新闻内容

本来是获取新闻内容纯文字的形式,但后来发现机器人端也可以显示半铸钢钢性铸铁(铸造半钢)格式,所以后来内容保留了超文本标记语言格式。

元素内容ele=文章。getelementbyid(' article _ content ');//新闻主体内容字符串内容字符串=Contentele。ToString();//如果用文本()方法,新闻主体内容的超文本标记语言标签会丢失//为了在机器人上用WebView显示html,用toString()//String content str=content ele。text();九、解析图片全球资源定位器(统一资源定位符)

注意一个网页上大大小小的图片很多,为了只获取新闻正文中的内容,我们最好首先定位到新闻内容的元素,然后再利用getElementsByTag(“img”)筛选出图片。

元素内容ele=文章。getelementbyid(' article _ content ');//新闻主体内容字符串内容字符串=Contentele。ToString();//如果用文本()方法,新闻主体内容的超文本标记语言标签会丢失//为了在机器人上用WebView显示html,用toString()//String content str=content ele。text();元素图像=Contentele。GetElementsBytag(' img ');String[]imageUrls=新的String[images。size()];for(int I=0;I image URL . lengthi){ image URL[I]=images。得到(我).attr(' src ');}十、新闻实体类JavaBean

上面获取了新闻的标题、发布日期、阅读次数、新闻内容等等,我们自然需要构造一个javabean,把获取的内容封装进实体类中。

公共类ArticleItem { private int索引私有字符串[]图像网址;私有字符串标题;私有字符串发布日期;私有字符串源;私有int readTimes私有字符串体;public ArticleItem(int index,String[] imageUrls,String title,String publishDate,String source,int readTimes,String body){ this。index=indexthis . imageurl=imageurl this . title=title this。发布日期=发布日期;this . source=source this . readtimes=readtimes this . body=body } @ Override public String to String(){ return ' article item[index=' index ',\ n imageUrls=' arrays。toString(imageUrls)',\n title=' title ',\n publishDate=' publishDate ',\n source=' source ',\n readTimes=' readTimes ',\ n body=' body ']';}}测试

公共静态文章项目getnewstitem(int当前页面)引发了公共异常{ //根据后缀的数字,拼接新闻全球资源定位器(Uniform Resource Locator)字符串网址字符串=文章_基地_网址当前页面' .html ';string HTMl str=HttpTool。DoGet(URl字符串);document=Jsoup。解析(HTMl字符串);元素文章=文档。getelementbyid(' article ');//标题元素标题=文章。getelementbyid(' article _ title ');string TItle STr=title ele。text();//文章_详细信息包括了2016-01-15 来源: 浏览次数:177元素详细信息=文章。getelementbyid(' article _ detail ');元素详细信息=详细信息。getelementsbytag(' span ');//发布时间String dateStr=details.get(0).text();//新闻来源String sourceStr=details.get(1).text();//访问这个新闻页面,浏览次数会1,次数是射流研究…渲染的string jsStr=HttpTool。doget(COUNT _ BASE _ URL CurrentPage);int readTimes=整数。par sent(jsstr。全部替换(' \ \ D ',' ');//或者使用下面这个正则方法//string readtimestr=jsstr.replaceall('[^0-9]' ' ');元素内容ele=文章。getelementbyid(' article _ content ');//新闻主体内容字符串内容字符串=Contentele。ToString();//如果用文本()方法,新闻主体内容的超文本标记语言标签会丢失//为了在机器人上用WebView显示html,用toString()//String content str=content ele。text();元素图像=Contentele。GetElementsBytag(' img ');String[]imageUrls=新的String[images。size()];for(int I=0;I image URL . lengthi){ image URL[I]=images。得到(我).attr(' src ');}返回新的ArticleItem(currentPage、imageUrls、titleStr、dateStr、sourceStr、readTimes、content str);}公共静态void main(String[]args)抛出公社例外{系统。出去。println(getnew item(7928));}输出信息

ArticleItem [index=7928,image URL=[/uploads/image/20160114/20160114225911 _ 34428。png],标题=电院2014级开展"让诚信之花开遍冬日校园"教育活动,发布日期=2016-01-14,来源=来源: 电影新闻网,readTimes=200,body=div id=' article _ content ' p style=' text-缩进:2 em'align=' align ' strong span style=' font-size :16 px;线高:1.5西电新闻网讯/span/strong span style=' font-size :16 px;线高:1.5(通讯员/span strong span style=' font-size :16 px;线高:1.5丁彤王朱丹/span/strong span style=' font-size :16 px;线高:1.5.)本文讲解了如何实现Jsoup网络爬虫,如果文章对您有帮助,那就给个赞吧。

版权声明:Java实现爬虫给应用提供数据(Jsoup网络爬虫)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。