Java爬虫的一些方法(总结)

使用JAVA爬虫总结

因为最近都一直使用Java爬取一些资料,所以对一些使用经验做一些总结,希望对大家有帮助。(主要针对商品类信息,其它网站还没有尝试)

连接和爬取网站的方式主要分为3种,分别是Jsoup、开源项目gecco、原始的connection连接,个人觉得足够普通网站的使用。

jsoup代码比较多,但是获取数据比较稳,不支持Ajax请求,可以一层一层的去拿,gecco就没有很稳(也可能我不会用🐶)

扩展:还有一种方法是使用Puppeteer模拟调用谷歌浏览器访问,直接模拟浏览器,这里就不细讲,直接粘链接:Puppeteer

使用前提 :明白爬取的目的是什么,返回值类型是什么,需要的条件(header等)是什么。

  • 爬取目的:是需要网站返回的什么信息,比如连接,页面参数等。

  • 返回值类型:主要分为html、document、String、Json(很重要)。

  • 需要的条件:比如 请求头(header)中的cookie等,post请求时的请求体等等,有些请求必须携带,不然请求会失败

    我觉得能够熟练使用F12是很重要的,可以在爬取过程中少走很多弯路。在文章最后面也会做一下分享。

注意 :爬虫主要是掌握技术,是没有固定的获取数据方式的,具体还需要看网页的结构怎么样,需要灵活多变

爬取方式:

一、使用Jsoup

pom.xml

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

工具类:

package com.geccocrawler.gecco.tv.Test;

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

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;


public class HtmlParseUtils {
    public static volatile int index = 0;
    public static volatile List<String> list = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        HtmlParseUtils.getProductList("网站地址");
        for (String s : list) {
            System.out.println(s);
        }
    }



    public static void getProductList(String url) throws IOException {
        Document document = Jsoup.parse(new URL(url), 30000); //连接
//        Document document =Jsoup.connect(url).timeout(10*1000).validateTLSCertificates(false).get();//解决ssl证书错误问题,ssl异常时使用

        // document相当于网页的树,可以一层一层的去拿,但具体怎么拿,还是要看具体情况,没有固定的方式
        Elements item =  document.getElementsByClass("list-wrap").get(0).getElementsByClass("item-cells-wrap");

        /**
         * 这里是为了拿到某个商品的链接href,其它信息还是要灵活多变,没有固定的方式
         */
        for (int i = 0; i < item.size(); i++) {
            Elements item_cell = item.get(i).getElementsByClass("item-cell");
            for (Element element : item_cell) {
                String href = element.getElementsByClass("item-info").get(0).getElementsByClass("item-title").attr("href");
                list.add(href);
            }
        }
    }
}


上面的代码大概看看就可以了,主要看下面讲解

重点:一般使用Jsoup时需要先获取到document,看看document是什么样的情况,所以在document的下一行打断点,配合计算器一起使用



       
由上图和工具类大概知道了运行的方式,后面的代码需要根据document的信息去编写

对于document的操作,主要使用以下方法:

  1、get():使用第几个子节点
  2、getElementsByClass() :获取class名字的子节点。名字中间没有空格
  3、getElementsByTag() : 获取标签名字的子节点,如 a , ul , p标签等
  4、getElementsByAttributeValue(“”,“”) : 可以指定节点类型和名称,名称中间可以含有空格
  5、attr() : 获取指定标签的名称的内容,如 a标签的 href 的值



这时候有小可爱要问了,怎么确定class的名字?下面进行解答:

千万不要从第一个标签开始一个一个拿,(那要搞到什么时候去😦)

首先找到目标网页的想要部分,找到离自己需求的最近标签标签的唯一值,以下面网站为例



然后搜索,看看是不是这个class的名称是唯一值,是的话就取该class

由图所示,只有一个,所以可以取该值。 :document.getElementsByClass("product-categories-container"). 后面以此类推。看childNodes一步一步的拿

你以为到这里,就可以完美的搞到你想要的信息。。。。没那么简单😫

因为大多数时候,找目标链接也是一个技术活,有时候信息不会直接像这样就展示出来,可能隐藏到某一条接口请求中,
返回值也可能不是树,有可能是Json数据,而且请求有时候还要带上heard,或者是post请求时,还要带上请求体中的内容,不然根本不会有返回值,而是重定向的内容。
也有时会出现google的机器人认证(我也没有解决🤯🤯,我是暂停程序,手动浏览器认证后,在继续跑程序)

下面将为大家一一道来:

二、使用gecco

这里建议直接使用gitHub中的项目,然后进行二次开发
链接:https://github.com/xtuhcy/gecco

大致结构如下:

我是在test中编写代码,然后调用main->java中的工具类进行爬取的二次开发。

三、最原始的连接

posted @   Retired-lad  阅读(768)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示