java-获取1688网站商家信息----简单应用

1.下载google浏览器

注: 苹果电脑下载 旧版本google浏览器 点设置时会自动更新, (卸载重装),运行时版本和驱动不匹配会报错

第三方网站下载链接:旧版本(安装后老是提示更新,最新版本没有找到对应的驱动,不能更新它)

Google Chrome 64bit OS X版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒

查看浏览器版本 在地址栏输入: chrome://version/

2.下载ChromeDrever 驱动,对应浏览器的版本下载解压即可

CNPM Binaries Mirror

3.需要代理 不然老是提示你要登录

作者用的是 快代理 - 企业级HTTP代理IP云服务_专注IP代理10年

或者不用代理 自己试试试看

4.创建项目: maven项目

需要用到插件 : Selenium

maven仓库: https://mvnrepository.com/

文档说明: Selenium 浏览器自动化项目 | Selenium

相关教程: 哔哩哔哩_bilibili

4.1创建项目:

jdk 用的11 , 1.8 的也没问题,其他版本没用过

4.2 添加插件: 找到 pom.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.11.0</version>
        </dependency>
        

        <!-- SLF4J API  打印日志的-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version> <!-- 使用最新的稳定版本 -->
        </dependency>
        <!--  Logback Classic (contains SLF4J binding) and Core -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version> <!-- 使用最新的稳定版本 -->
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>

        </dependencies>
    </dependencyManagement>

</project>

4.3简单的封装下代码 工具类:

java 复制代码
package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.time.Duration;
import java.util.Set;

public class Util {

    public Util(String keyword, int index, int len) {
        getContacts(keyword,index,len);
    }

    /**
     * @param keyword 关键字
     * @param index 0
     * @param len 几条数据
     * @return
     */
    public static void getContacts(String keyword, int index, int len) {
        for (; index < len; index++) {


            // 1.找驱动 设置ChromeDriver的路径  填绝对路径 winds d:/某某目录下/chromedriver.exe
            System.setProperty("webdriver.chrome.driver", "/Users/Desktop/javaGHui/Chromedriver/chromedriver");

            // 创建ChromeOptions对象
//        ChromeOptions options = new ChromeOptions();
//        // 设置代理
//        Proxy proxy = new Proxy();
//        proxy.setHttpProxy("***.***.com:***"); // 设置你的代理主机和端口
//        proxy.setSslProxy("***.***.com:***"); // 对于HTTPS代理,也进行设置
            // 如果你有代理的用户名和密码,可以这样设置
//             proxy.setProxyType(Proxy.ProxyType.MANUAL);
//             proxy.setAutodetect(false);
//             proxy.setSslProxyUsername("username");
//             proxy.setSslProxyPassword("password");

            // 将代理设置添加到ChromeOptions
//        options.setCapability("proxy", proxy);
            //2.把代理添加到驱动
            // WebDriver driver = new ChromeDriver(options);

            //2.或者不使用代理
            WebDriver driver = new ChromeDriver();
            String url = "https://s.1688.com/selloffer/offer_search.htm?keywords=" + keyword + "&n=y&netType=1%2C11%2C16&spm=a260k.dacugeneral.search.0";
            try {
                // 设置浏览器窗口大小(可选)
                //driver.manage().window().setSize(new org.openqa.selenium.Dimension(1280, 1024));
                //输入网址
                driver.get(url);


                //找公司   [1-60] 个 一页数据
                String xpathExpression = "//*[@id=\"sm-offer-list\"]/div[" + index + "]/div/div[1]/div/a";
                WebElement gonsilinkElement = driver.findElement(By.xpath(xpathExpression));

                // 等待搜索框可见
                // 等待搜索结果加载(这里可以根据实际情况调整等待条件和时间)
                long minutes = 10;
                Duration duration = Duration.ofMinutes(minutes);
                WebDriverWait gongsiwait = new WebDriverWait(driver, duration);// 设置超时时间为10秒
                 等待直到a标签变得可点击
                gongsiwait.until(ExpectedConditions.elementToBeClickable(gonsilinkElement));

                // 检查是否找到了元素
                if (gonsilinkElement != null) {
                    // 点击a标签
                    System.out.println("找到匹配的a标签" + gonsilinkElement);
                    gonsilinkElement.click();

                    // 这里可以添加代码来处理点击后的页面行为
                } else {
                    System.out.println("没有找到匹配的gonsilinkElement标签");
                }


                // 获取所有窗口句柄
                Set<String> windowHandles = driver.getWindowHandles();
                // 切换到新打开的窗口
                for (String windowHandle : windowHandles) {
                    if (!windowHandle.equals(driver.getWindowHandle())) {
                        driver.switchTo().window(windowHandle);
                        break;
                    }
                }

                //找联系电话
                WebElement linkElement = driver.findElement(By.xpath("//a[text()='联系方式']"));

                 等待直到a标签变得可点击
                gongsiwait.until(ExpectedConditions.elementToBeClickable(linkElement));

                // 检查是否找到了元素
                if (linkElement != null) {
                    // 点击a标签
                    System.out.println("找到匹配的的联系电话标签" + linkElement);
                    linkElement.click();

                    // 这里可以添加代码来处理点击后的页面行为
                } else {
                    System.out.println("没有找到匹配的联系电话标签");
                }

                // 标记是否为最后一次迭代
                int i = 0;
                // 切换到新打开的窗口
                Set<String> windowHandlesss = driver.getWindowHandles();

                System.out.println("窗口长度:" + driver.getWindowHandles().size());

                for (String windowHandle : windowHandlesss) {
                    i++;
                    System.out.println(i + "窗口windowHandle" + windowHandle);

                    if (i == 3) {
                        driver.switchTo().window(windowHandle);

                    }

                }


                //保存联系人
                // 获取网页的根元素
                WebElement rootElement = driver.findElement(By.tagName("html"));

                // 使用JavaScript获取网页的完整HTML
                // JavascriptExecutor js = (JavascriptExecutor) driver;
                // String htmlContent = (String) js.executeScript("return document.documentElement.outerHTML;");

                // 提取网页中的文本数据
                String textContent = rootElement.getText();

                // 查找开始位置的索引
                int startIndex = textContent.indexOf("联系方式") + "联系方式".length();

                // 查找结束位置的索引
                int endIndex = textContent.indexOf("有任何问题欢迎电话或在线沟通咨询,欢迎实地考察!");

                // 使用substring方法提取子串
                if (endIndex != -1) {
                    String substring = textContent.substring(startIndex, endIndex);


                    // 保存到本地文件
                    saveToFile2("webContacts.txt", substring);


                    // 如果需要,还可以保存完整的HTML内容
                    // saveToFile("webpage_html.html", htmlContent);

                } else {
                    System.out.println("开始或结束位置未找到");
                }


            } catch (Exception e) {
                e.printStackTrace();
                System.err.println("出错了");
            } finally {
                //最后确保关闭所有剩余窗口并退出WebDriver
                driver.quit();
            }

        }

    }


    /**
     * 保存文件方法
     */
    private static void saveToFile(String fileName, String content) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            writer.write(content);
            System.out.println("文件 " + fileName + " 已保存。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 保存文件方法 追加文本
     */
    public static void saveToFile2(String fileName, String content) {
        FileWriter fileWriter = null;
        BufferedWriter bufferedWriter = null;

        try {
            // 创建 FileWriter 对象,用于写入字符流,true 表示追加模式
            fileWriter = new FileWriter(fileName, true);

            // 创建 BufferedWriter 对象,将 FileWriter 包装起来,提供缓冲功能
            bufferedWriter = new BufferedWriter(fileWriter);

            // 写入内容到文件
            bufferedWriter.write(content);

            // 刷新缓冲区,确保内容被写入文件
            bufferedWriter.flush();
            System.out.println("文件 " + fileName + " 已保存。");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭流
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
                if (fileWriter != null) {
                    fileWriter.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

4.3 主方法代码:

java 复制代码
package org.example;


public class MainDemo {
    public static void main(String[] args) {
        // 搜索框中 要搜索的内容
        // 循环获取 
        Util util = new Util("短袖",0,60);
    }

}

等执行完成 ,打开文件webContacts.txt 就可看到联系电话了

5.学习 定位 网页元素

http://t.csdnimg.cn/zY3FQ

Ai 推荐:

有问题? 请来找我,文心一言

有帮助的话,请点个赞谢谢.​​​​​​

相关推荐
web安全工具库6 分钟前
深入理解Python中的时间表示:Unix时间点、毫秒和微秒,以及time模块
开发语言·python·unix
伯牙碎琴8 分钟前
八、TOGAF(架构治理Architecture Governance)
java·微服务·架构
liuyang-neu14 分钟前
力扣 16.最接近的三数之和
java·数据结构·算法·leetcode
艾伦~耶格尔16 分钟前
Java API 之集合框架进阶
java·开发语言·学习
韩子谦17 分钟前
Java迭代器Iterator和Iterable有什么区别?
java·windows·python
Satan71218 分钟前
【Java】全面理解Java8特性
java·开发语言
至简行远20 分钟前
路由器接口配置DHCP实验简述
java·服务器·网络·数据结构·python·算法·智能路由器
c1tenj221 分钟前
SpringCloud Feign 以及 一个标准的微服务的制作
java·spring cloud·微服务
hakesashou24 分钟前
python有main函数吗
开发语言·python
Zach_yuan26 分钟前
C++重生之我是001
开发语言·c++