专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java爬虫学习:网络爬虫

Java爬虫学习:网络爬虫

更新时间:2020-03-11 10:55:40 来源:赢咖4 浏览2291次


  Jsoup方式提取信息


  我们先来使用Jsoup的方式提取新闻信息,如果你还不知道Jsoup,请参考https://jsoup.org/


  先建立一个Springboot项目,名字就随意啦,在pom.xml中引入Jsoup的依赖

  <dependency>

  <groupId>org.jsoup</groupId>

  <artifactId>jsoup</artifactId>

  <version>1.12.1</version>

  </dependency>

  好了,接下来我们一起分析页面吧,想必你还没浏览过吧,点击这里浏览虎扑新闻。在列表页中,我们利用F12审查元素查看页面结构,经过我们分析发现列表新闻在<divclass="news-list">标签下,每一条新闻都是一个li标签,分析结果如下图所示:


Java爬虫学习:网络爬虫


  由于我们前面已经知道了css选择器,我们结合浏览器的Copy功能,编写出我们a标签的css选择器代码:div.news-list>ul>li>div.list-hd>h4>a,一切都准备好了,我们一起来编写Jsoup方式提取信息的代码:

  /**

  *jsoup方式获取虎扑新闻列表页

  *@paramurl虎扑新闻列表页url

  */

  publicvoidjsoupList(Stringurl){

  try{

  Documentdocument=Jsoup.connect(url).get();

  //使用css选择器提取列表新闻a标签

  //<ahref="https://voice.hupu.com/nba/2484553.html"target="_blank">霍华德:夏休期内曾节食30天,这考验了我的身心</a>

  Elementselements=document.select("div.news-list>ul>li>div.list-hd>h4>a");

  for(Elementelement:elements){

  //System.out.println(element);

  //获取详情页链接

  Stringd_url=element.attr("href");

  //获取标题

  Stringtitle=element.ownText();

  System.out.println("详情页链接:"+d_url+",详情页标题:"+title);

  }

  }catch(IOExceptione){

  e.printStackTrace();

  }

  }

  使用Jsoup方式提取还是非常简单的,就5、6行代码就完成了,关于更多Jsoup如何提取节点信息的方法可以参考jsoup的官网教程。我们编写main方法,来执行jsoupList方法,看看jsoupList方法是否正确。

  publicstaticvoidmain(String[]args){

  Stringurl="https://voice.hupu.com/nba";

  CrawlerBasecrawlerBase=newCrawlerBase();

  crawlerBase.jsoupList(url);

  }

  执行main方法,得到如下结果:


  Java爬虫学习:网络爬虫


  从结果中可以看出,我们已经正确的提取到了我们想要的信息,如果你想采集详情页的信息,只需要编写一个采集详情页的方法,在方法中提取详情页相应的节点信息,然后将列表页提取的链接传入提取详情页方法即可。


  httpclient+正则表达式


  上面我们使用了Jsoup方式正确提取了虎扑列表新闻,接下来我们使用httpclient+正则表达式的方式来提取,看看使用这种方式又会涉及到哪些问题?httpclient+正则表达式的方式涉及的知识点还是蛮多的,它涉及到了正则表达式、Java正则表达式、httpclient。如果你还不知道这些知识,可以点击下方链接简单了解一下:


  正则表达式:正则表达式


  Java正则表达式:Java正则表达式


  httpclient:httpclient


  我们在pom.xml文件中,引入httpclient相关Jar包

  <dependency>

  <groupId>org.apache.httpcomponents</groupId>

  <artifactId>httpclient</artifactId>

  <version>4.5.10</version>

  </dependency>

  <dependency>

  <groupId>org.apache.httpcomponents</groupId>

  <artifactId>httpcore</artifactId>

  <version>4.4.10</version>

  </dependency>

  <dependency>

  <groupId>org.apache.httpcomponents</groupId>

  <artifactId>httpmime</artifactId>

  <version>4.5.10</version>

  </dependency>
  /**

  *httpclient+正则表达式获取虎扑新闻列表页

  *@paramurl虎扑新闻列表页url

  */

  publicvoidhttpClientList(Stringurl){

  try{

  CloseableHttpClienthttpclient=HttpClients.createDefault();

  HttpGethttpGet=newHttpGet(url);

  CloseableHttpResponseresponse=httpclient.execute(httpGet);

  if(response.getStatusLine().getStatusCode()==200){

  HttpEntityentity=response.getEntity();

  Stringbody=EntityUtils.toString(entity,"utf-8");

  if(body!=null){

  /*

  *替换掉换行符、制表符、回车符,去掉这些符号,正则表示写起来更简单一些

  *只有空格符号和其他正常字体

  */

  Patternp=Pattern.compile("\t|\r|\n");

  Matcherm=p.matcher(body);

  body=m.replaceAll("");

  /*

  *提取列表页的正则表达式

  *去除换行符之后的li

  *<divclass="list-hd"><h4><ahref="https://voice.hupu.com/nba/2485167.html"target="_blank">与球迷亲切互动!凯尔特人官方晒球队开放训练日照片</a></h4></div>

  */

  Patternpattern=Pattern

  .compile("<divclass=\"list-hd\">\\s*<h4>\\s*<ahref=\"(.*?)\"\\s*target=\"_blank\">(.*?)</a>\\s*</h4>\\s*</div>");

  Matchermatcher=pattern.matcher(body);

  //匹配出所有符合正则表达式的数据

  while(matcher.find()){

  //Stringinfo=matcher.group(0);

  //System.out.println(info);

  //提取出链接和标题

  System.out.println("详情页链接:"+matcher.group(1)+",详情页标题:"+matcher.group(2));

  }

  }else{

  System.out.println("处理失败!!!获取正文内容为空");

  }

  }else{

  System.out.println("处理失败!!!返回状态码:"+response.getStatusLine().getStatusCode());

  }

  }catch(Exceptione){

  e.printStackTrace();

  }

  }


  从代码的行数可以看出,比Jsoup方式要多不少,代码虽然多,但是整体来说比较简单,在上面方法中我做了一段特殊处理,我先替换了httpclient获取的字符串body中的换行符、制表符、回车符,因为这样处理,在编写正则表达式的时候能够减少一些额外的干扰。接下来我们修改main方法,运行httpClientList方法。

  publicstaticvoidmain(String[]args){

  Stringurl="https://voice.hupu.com/nba";

  CrawlerBasecrawlerBase=newCrawlerBase();

  //crawlerBase.jsoupList(url);

  crawlerBase.httpClientList(url);

  }

Java爬虫学习:网络爬虫


  使用httpclient+正则表达式的方式同样正确的获取到了列表新闻的标题和详情页链接。到此Java爬虫系列博文第一篇就写完了,这一篇主要是Java网络爬虫的入门,我们使用了jsoup和httpclient+正则的方式提取了虎扑列表新闻的新闻标题和详情页链接。当然这里还有很多没有完成,比如采集详情页信息存入数据库等。


    以上就是赢咖4注册机构小编介绍的“Java爬虫学习:网络爬虫”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>