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

news2024/11/15 18:35:44

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 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简单的封装下代码 工具类:

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 主方法代码:

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

有问题? 请来找我,文心一言
        有帮助的话,请点个赞谢谢.​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1549103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Springboot的疫情隔离酒店管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的疫情隔离酒店管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

完全二叉树的层序遍历[天梯赛]

文章目录 题目描述思路 题目描述 输入样例 8 91 71 2 34 10 15 55 18 输出样例 18 34 55 71 2 10 15 91思路 完全二叉树最后一层可以不满&#xff0c;但上面的每一层的节点数都是满的 后序遍历的顺序为"左右根"&#xff0c;我们可以用数组模拟完全二叉树&#xff0c;…

奶瓶哪个牌子的比较好?适合新生儿的奶瓶分享

每一位新手家长都要选购很多东西&#xff0c;而必备的无疑就是新生儿奶瓶了。如果你不知道要给宝宝选什么品牌的奶瓶好&#xff0c;不懂哪些材质符合安全无毒标准。那么收藏这篇文章就对了&#xff0c;作为一名测评博主&#xff0c;我近期测评了多款全网热议的奶瓶&#xff0c;…

【机器学习300问】54、如何找到有效的组合特征?

一、为什么需要去寻找有效的组合特征&#xff1f; 因为并不是所有的特征组合都会意义&#xff0c;都能带来价值。 例如在房价预测场景中&#xff0c;卧室数量和浴室数量的比值有意义&#xff0c;但房屋面积与建造年份相组合作为新的组合特征&#xff0c;可能就没有实际含义&…

面试经典150题【111-120】

文章目录 面试经典150题【111-120】67.二进制求和190.颠倒二进制位191.位1的个数136.只出现一次的数字137.只出现一次的数字II201.数字范围按位与5.最长回文子串97.交错字符串72.编辑距离221.最大正方形 面试经典150题【111-120】 六道位运算&#xff0c;四道二维dp 67.二进制…

[HackMyVM]靶场quick5

kali:192.168.56.104 靶机:192.168.56.134 端口扫描 # nmap 192.168.56.134 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-27 19:08 CST Nmap scan report for careers.quick.hmv (192.168.56.134) Host is up (0.000056s latency). Not shown: 998 closed tcp p…

Unity编辑器功能将AB资源文件生成MD5码

将路径Application.dataPath/ArtRes/AB/PC文件夹下所有的Ab包文件生成MD5吗&#xff0c;通过文件名 文件长度MD5‘|’的格式拼接成字符串写入到资源对比文件abCompareInfo.txt中。 将路径pathFile扥文件生成MD5码

C语言学习之环境搭建【建议收藏】

学生时代&#xff0c;我们一般使用的VC【Microsoft Visual C 2010&#xff08;学习版&#xff09;】进行学习&#xff0c;该篇博客主要记录如何安装VC&#xff0c;非常详细&#xff0c;适合入门的小白&#xff0c;奶妈级别安装教程&#xff0c;建议收藏。 准备好软件安装包&…

LeetCode刷题--- Dijkstra 求最短路径

首先是图的表示&#xff0c;邻接矩阵和邻接表。实现看代码 邻接矩阵&#xff1a;二维数组&#xff0c; matrix[a][b] 表示 从a可以指向b无向图而言&#xff0c; matrix[a][b]matrix[b][a]&#xff0c;比如可以定义matrix[a][b]1表示ab是连接的&#xff0c;matrix[a][b]0表示ab…

Docker进阶:Docker Swarm —弹性伸缩调整服务的副本数量

Docker进阶&#xff1a;Docker Swarm —弹性伸缩调整服务的副本数量 1、 创建一个Nginx服务&#xff08;Manager节点&#xff09;2、查看服务状态&#xff08;Manager节点&#xff09;3、测试访问&#xff08;Worker节点&#xff09;4、查看服务日志&#xff08;Manager节点&am…

有效三角形的个数【双指针】

1.优化版暴力求解 如果能构成三⻆形&#xff0c;需要满⾜任意两边之和要⼤于第三边。实际上只需让较⼩的两条边之和⼤于第三边即可。将原数组排序&#xff0c;从⼩到⼤枚举三元组&#xff0c;这样三层 for 循环枚举出的三元组只需判断较⼩的两条边之和是否⼤于第三边。 class…

2024/3/24周报

文章目录 摘要Abstract文献阅读题目引言创新点数据处理研究区域和数据缺失值处理水质相关分析 方法和模型LSTMAttention机制AT-LSTM模型 实验结果 深度学习transformer代码实现1 模型输入1.1 Embedding层1.2 位置编码 2 Encoder2.1 编码器2.2 编码器层2.3注意力机制2.4多头注意…

Sora那么牛,他的模型的成本会有多少呢?

Sora的训练需要大量的计算资源&#xff0c;估计需要4211-10528个 Nvidia H100 GPUs运行一个月。推理成本&#xff1a;一个Nvidia H100 GPU大约每小时能生成5分钟的视频。初期的Sora成本将非常高&#xff0c;肯定是不适合普通人来使用&#xff0c;所以目前OpenAI都是先找一些艺术…

AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

用python绘制词云图时&#xff0c;出现报错AttributeError: ImageDraw object has no attribute textsize&#xff0c;应当如何解决&#xff1f; - CSDN文库

TikTok养号怎么做?打破0播放的前提是做好这些

TikTok养号的重要性不必多少&#xff0c;不仅可以在创号初期保障账号安全&#xff0c;后期的账号流量也需要以前期养好账号为前提。下面就给大家分享如何养号的真实操作攻略&#xff01; 一、为什么要养号 &#xff08;1&#xff09;提高系统推荐精准度 系统不了解新账户人设…

基于单片机病房温度监测与呼叫系统设计

**单片机设计介绍&#xff0c;基于单片机病房温度监测与呼叫系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机病房温度监测与呼叫系统设计概要主要涵盖了通过单片机技术实现病房温度的实时监测以及病人呼叫功能…

如何应对Android面试官->进程通信如何注册与获取服务

前言 大家好&#xff0c;我是老A&#xff1b; 这个章节继续上一章节继续讲解&#xff0c;主要讲解下 java 层服务的注册与获取、线程池&#xff1b;我们基于 AMS 来看下 java 层是如何获取的&#xff1b; SystemServer SystemServer 的启动也是 main 函数&#xff0c;我们进入…

三、阅读器开发--4、阅读器目录、全文搜索功能开发

1、阅读器目录 1.1、实现目录 先实现目录的布局 定义一个蒙版&#xff0c;充满整个屏幕浮在阅读器上方&#xff0c;左侧为目录右侧为背景&#xff0c;目录下方包含一个tab&#xff0c;点击后会切换不同的内容&#xff0c;这里tab是目录、书签&#xff0c;这里可以通过如下的…

(原型与原型链)前端八股文修炼Day5

一 原型链的理解 原型链定义&#xff1a; 原型链是 JavaScript 中实现对象继承的关键机制之一&#xff0c;它是一种对象之间的关系&#xff0c;通过这种关系&#xff0c;一个对象可以继承另一个对象的属性和方法。 原型链的组成&#xff1a; 每个对象都有一个指向另一个对象的…

【node】express使用(三)

1、express.static快速托管静态资源 express:快速、开放、极简的Web开发框架。(npm第三方包&#xff0c;提供快速创建web服务器便捷方法) Express中文官网 (1) express快速创建web网站服务器以及api接口服务器 // 1、导入express const express require(express) // 2、创…