Java爬虫学习 第四天

在上次学习了爬取一章的文本之后, 我想到可不可以把所有章节的文本都爬取到, 换句话说, 爬取到分页的数据。
那么开始今天的实验 :
第一步:
寻找目标,我比较喜欢看动漫,但是每一页的动漫只有几十个动漫名字, 很多都看过了, 所以为了一次性的查看所有的动漫名, 这次实验的目标就确定了。
https://www.yinghuadongman123.com/y/2.html
樱花动漫网
在这里插入图片描述
第二步:
httpClient + 正则表达式 ,虽然也挺好的, 但是我们还是采用, jsoup 这个比较方便。
我们还是先引入依赖``

  <dependency>
       <groupId>org.jsoup</groupId>
       <artifactId>jsoup</artifactId>
            <version>1.12.1</version>
         </dependency>

第三步:
先尝试爬取第一页的动漫名字
成功的代码:

package com.example.demo;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Test4 {
    public static void main(String[] args) {
         try {
             Document document =Jsoup.connect("https://www.yinghuadongman123.com/y/2.html").get();
             Elements elements=document.select("body > div:nth-child(1) > div > div > div.stui-pannel__bd.clearfix > ul > li> div > div > h4 > a");
            for(Element i : elements)
            {
                 String str=i.attr("title");
                System.out.println(str);
            }
         }
         catch(Exception e)
         {
              e.printStackTrace();
         }

    }
}

结果:
在这里插入图片描述
第四步:
来到了今天最重要的一步:
怎么获取分页的数据,经过分析发现第一页的css表达式和第二页的css表达式差不多, 那么关键之处就不再这个css表达式上, 通过控制变量法, 我发现网页的地址不一样 ,
除了第一页之外其他的地址的格式都是

https://www.yinghuadongman123.com/y/2-i.html
i是第几页 就是几

接下来我们把第一页到第3页的动漫名字爬出来。
成功代码如下:

package com.example.demo;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.ArrayList;

//body > div:nth-child(1) > div > div > div.stui-pannel__bd.clearfix > ul > li:nth-child(1) > div > div > h4 > a
public class Test4 {
    public static void main(String[] args) {
         try {
             ArrayList<String> ans=new ArrayList<>();
             ans.add("https://www.yinghuadongman123.com/y/2.html");
             String str="https://www.yinghuadongman123.com/y/2";
             String str2=".html";
             for(int i=2;i<=3;i++)
             {
                  String str3=str+"-"+i+str2;
                  ans.add(str3);
             }
             int index=1;
             for(String j: ans ) {

                 System.out.println("动漫第" +(index++)+"页");
                 Document document = Jsoup.connect(j).get();
                 int w=0;
                 Elements elements = document.select("body > div:nth-child(1) > div > div > div.stui-pannel__bd.clearfix > ul > li> div > div > h4 > a");
                 for (Element i : elements) {
                     w++;
                     String str1 = i.attr("title");
                 System.out.print(str1+"\t");
                     if(w==4)
                     {
                         System.out.println();
                          w=0;
                     }
                 }
             }
         }
         catch(Exception e)
         {
              e.printStackTrace();
         }

    }
}

结果截图: 

在这里插入图片描述
第三页对比
在这里插入图片描述
第五步:
虽然成功了但是如果网页的网址区别的复杂度太高呢?
那么这种方法就成功不了
于是我打算在做一次实验, 换一个目标
起点中文网猩红降临第二和第三章的内容,
在这里插入图片描述
在这里插入代码片

将前面的总结我们得到了一条思路
如果要爬取有相同HTML结构的网页, 
那么我们可以先爬取所有网页地址, 
再根据网页的结构去爬取我们想要的数据

第六步:
爬取第二章和第三章的网址
呃,遇到了前端反调试debugger (一种反爬措施)
没办法, 去另一个网站做实验。
在这里插入图片描述
笔趣阁
成功的代码:

package com.example.demo;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import javax.print.Doc;
import java.net.URL;
import java.util.ArrayList;

//body > div:nth-child(1) > div > div > div.stui-pannel__bd.clearfix > ul > li:nth-child(1) > div > div > h4 > a
public class Test4 {
    public static void main(String[] args) {
         try {
             //https://book.qidian.com/info/1034000598/?WxUg5ztDmi=1658285555106
           ///   Document document=Jsoup.parse(new URL("https://book.qidian.com/info/1034000598/?WxUg5ztDmi=1658285555106"),60000);
              Document document=Jsoup.connect("https://www.mayiwxw.com/67_67743/index.html").get();
              System.out.println(document);
              //https://www.qidian.com/
              Elements elements=document.select("#list > dl > dd > a");
             System.out.println("成功了");
             int index=0;
             String mainurl="https://www.mayiwxw.com";
              for(Element i: elements)
              {
                  String w=i.attr("href");
                  String o=i.ownText();
                  System.out.println(o);
                  Document document1=Jsoup.connect(mainurl+w).get();
                  Elements elements1=document1.select("#content");
                  for(Element j : elements1)
                  {
                       String p=j.ownText();
                      System.out.println(p);
                  }

                  index++;
                  if(index>2) break;
              }
         }
         catch(Exception e)
         {
              e.printStackTrace();
         }

    }
}

结果如图: 

在这里插入图片描述
今天就差不多了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

絨辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值