首页 > 编程语言 >Java爬虫技术:从基础到进阶的全面指南

Java爬虫技术:从基础到进阶的全面指南

时间:2024-08-05 22:49:46浏览次数:15  
标签:java 进阶 爬虫 Java org import example String

Java爬虫技术:从基础到进阶的全面指南

大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨Java爬虫技术,从基础知识开始,逐步深入到进阶技术,并通过代码示例进行详细说明。

一、Java爬虫的基础

爬虫是一个自动化程序,旨在访问网页并提取数据。Java爬虫的基本工具包括java.net包中的HttpURLConnection和流处理类。下面是一个简单的例子,演示如何使用HttpURLConnection来获取网页内容。

package cn.juwatech.example;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class BasicWebCrawler {
    public static void main(String[] args) {
        String url = "http://example.com";
        try {
            HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
            connection.setRequestMethod("GET");

            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder content = new StringBuilder();

            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine);
            }

            in.close();
            connection.disconnect();

            System.out.println(content.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

二、使用Jsoup解析HTML

爬取网页后,需要解析HTML以提取所需的数据。Jsoup是一个流行的Java库,用于处理和解析HTML。

package cn.juwatech.example;

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

public class JsoupExample {
    public static void main(String[] args) {
        String url = "http://example.com";
        try {
            Document doc = Jsoup.connect(url).get();
            Elements links = doc.select("a[href]");

            for (Element link : links) {
                System.out.println("Link: " + link.attr("href"));
                System.out.println("Text: " + link.text());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、处理动态网页

很多现代网页是动态生成的,仅靠简单的HTTP请求和HTML解析不足以获取数据。这时,我们可以使用Selenium等工具,它们能够模拟浏览器行为,包括执行JavaScript。

package cn.juwatech.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.By;
import java.util.List;

public class SeleniumExample {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
        WebDriver driver = new ChromeDriver();
        
        try {
            driver.get("http://example.com");

            List<WebElement> links = driver.findElements(By.tagName("a"));

            for (WebElement link : links) {
                System.out.println("Link: " + link.getAttribute("href"));
                System.out.println("Text: " + link.getText());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

四、处理登录和Cookies

很多网站需要登录后才能访问特定内容。我们可以使用HttpClientJsoup来处理登录和管理会话。

package cn.juwatech.example;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.util.Map;

public class LoginExample {
    public static void main(String[] args) {
        try {
            // 第一次请求获取登录表单
            Connection.Response loginForm = Jsoup.connect("http://example.com/login")
                    .method(Connection.Method.GET)
                    .execute();

            // 提交表单数据和Cookies
            Document document = Jsoup.connect("http://example.com/login")
                    .data("username", "yourusername")
                    .data("password", "yourpassword")
                    .cookies(loginForm.cookies())
                    .post();

            // 使用登录后的Cookies进行后续请求
            Map<String, String> cookies = loginForm.cookies();
            Document protectedPage = Jsoup.connect("http://example.com/protected_page")
                    .cookies(cookies)
                    .get();

            System.out.println(protectedPage.body().text());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

五、多线程爬虫

为了提高爬虫的效率,可以使用多线程来并行爬取多个网页。下面是一个简单的多线程爬虫示例。

package cn.juwatech.example;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadedCrawler {
    private static final int NUM_THREADS = 10;

    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);
        String[] urls = {"http://example.com/page1", "http://example.com/page2", "http://example.com/page3"};

        for (String url : urls) {
            executor.execute(() -> {
                try {
                    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
                    connection.setRequestMethod("GET");

                    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    String inputLine;
                    StringBuilder content = new StringBuilder();

                    while ((inputLine = in.readLine()) != null) {
                        content.append(inputLine);
                    }

                    in.close();
                    connection.disconnect();

                    System.out.println("Content of " + url + ": " + content.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }

        executor.shutdown();
    }
}

六、处理反爬虫机制

一些网站会采取措施防止爬虫,例如通过检测User-Agent、IP地址或访问频率来识别和阻止爬虫。以下是一些常见的应对策略:

  1. 设置User-Agent

    Connection connection = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
    
  2. 使用代理IP

    System.setProperty("http.proxyHost", "your.proxy.host");
    System.setProperty("http.proxyPort", "your.proxy.port");
    
  3. 控制爬取频率
    使用Thread.sleep在每次请求后暂停一段时间,以避免被检测为爬虫。

总结

Java爬虫技术涵盖了从基本的HTTP请求和HTML解析到处理动态网页、多线程爬虫以及应对反爬虫机制的广泛内容。通过合理运用这些技术,可以高效地从网络中提取所需数据。在实际应用中,必须遵守相关法律法规和网站的使用条款,确保爬虫行为的合法性和道德性。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

标签:java,进阶,爬虫,Java,org,import,example,String
From: https://www.cnblogs.com/szk123456/p/18344199

相关文章

  • javaCC链6
    CC6条件:commons-conlections<=3.2.1不限制jdk版本payloadpackageorg.example;importorg.apache.commons.collections.Transformer;importorg.apache.commons.collections.functors.ChainedTransformer;importorg.apache.commons.collections.functors.ConstantTrans......
  • javaCC链3
    cc3cc3区别cc6不再是使用Rutime类执行命令,而是通过类加载器动态加载恶意类然后执行类加载:ClassLoader.loadClass->ClassLoader.findClass->ClassLLoader.defineClassClassLoader.loadClass:寻找加载的类(双亲委派机制)ClassLoader.findClass:如果loadClass没找到类,就根据类名称/......
  • JavaScript(二十二)——JavaScript this 关键字
    目录方法中的this单独使用this函数中使用this(默认)函数中使用this(严格模式)事件中的this对象方法中绑定显式函数绑定面向对象语言中this表示当前对象的一个引用。但在JavaScript中this不是固定不变的,它会随着执行环境的改变而改变。在方法中,this表示该方......
  • 爬虫:xpath高级使用,bs4使用,bs4-css选择器
    xpath高级使用fromlxmlimportetree#由于本次要格式化的内容是一个文件,所以用parse,如果是一个html格式的字符串就用HTMLhtml=etree.parse('02_xpath.html')#可以连接多个但是每两个之间要用一个管道符来连接#print(html.xpath('//ol/li[@data="one"]/text()|......
  • RabbitMQ(三)Java客户端
    1.快速入门在idea里面创建两个springboot项目,一个模块是consumer,一个是publisher两者有自己的启动类,继承同一父工程的pom。父工程的pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http......
  • 基于java+springboot+vue的高校实习管理系统
    ......
  • JavaEE 图书管理系统
    基于阿里巴巴的fastjson框架搭建的JavaEE版本的图书管理系统,项目架构如下:fastjson包的阿里云下载镜像如下:CentralRepository:com/alibaba/fastjson2/fastjson2/2.0.8 运行效果:BeanBook.javapackageBean;publicclassBook{ privateStringtitle;//书名 pr......
  • 日撸Java三百行(day14:栈)
    目录一、栈的基本知识1.栈的概念2.栈的功能3.栈的实现二、栈的代码实现1.栈的基本属性与方法2.栈的遍历3.入栈实现4.出栈实现5.数据测试6.完整的程序代码总结一、栈的基本知识1.栈的概念根据百度百科,我们知道“栈”是存储货物或供旅客住宿的地方,可引申为仓库......
  • 日撸Java三百行(day13:链表)
    目录一、链表的基础知识二、链表的代码实现1.链表创建2.链表遍历3.链表定位查找4.链表插入5.链表删除6.数据测试7.完整的程序代码总结一、链表的基础知识在之前顺序表的学习中,我们其实提到过链表。链表它是线性表在不同的物理存储方式下派生出来的,链表不像顺序表......
  • 【报错提示】java.lang.RuntimeException: Can't create handler inside thread
    ​报错提示遇到一个报错: java.lang.RuntimeException:Can'tcreatehandlerinsidethreadThread[OkHttphttps://a.fxltsbl.com/...]thathasnotcalledLooper.prepare() 分析 1.这个报错提示是在一个没有调用Looper.prepare()的线程中尝试创建一个Handler对象......