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中的工具类进行爬取的二次开发。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤