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 推荐:

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

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

相关推荐
枫叶_v22 分钟前
【SpringBoot】20 同步调用、异步调用、异步回调
java·spring boot·后端
鸣弦artha29 分钟前
蓝桥杯——杨辉三角
java·算法·蓝桥杯·eclipse
未知陨落36 分钟前
数据结构——二叉搜索树
开发语言·数据结构·c++·二叉搜索树
大波V537 分钟前
设计模式-参考的雷丰阳老师直播课
java·开发语言·设计模式
计算机-秋大田43 分钟前
基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)
java·spring boot·微信小程序·小程序·vue·课程设计
无敌最俊朗@1 小时前
unity3d————接口基础知识点
开发语言·c#
《源码好优多》1 小时前
基于Java Springboot旅游信息推荐系统
java·spring boot·旅游
岁月无声code1 小时前
Spring Boot 牛刀小试 org.springframework.boot:spring-boot-maven-plugin:找不到类错误
java·spring boot·github
不爱学习的YY酱1 小时前
【计网不挂科】计算机网络第二章< 物理层 >习题库(含答案)
java·数据库·计算机网络
一丝晨光1 小时前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++