WebDriver 获取淘宝和天猫商品的类别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36511401/article/details/102558024

 一、技巧。

1、要自动化测试一个网页或者爬起一个网页的信息,以及在网页上进行操作的时候,点击F12,开发浏览器的开发者模式,对网页元素的分析是必不可少的。

2、可以使用下方的快捷标志,然后点击网页上的元素,就可以在Elements的窗口里面快速的定位到相应的代码。

二、网页分析。

1、根据淘宝和天猫的商品链接,获取相应的商品类别。我们先要找到一个网站,比如:http://www.taodake.cn/p.php/73l.html。只要输入淘宝和天猫商品链接,点击查询,就可以得到相应的商品类别,及其他信息。我们这里就以商品类别为例。

2、点击查询之后,发现浏览器的url并没有变化,这时候就要在去分析网页元素,用快速选择工作,选中查询按钮,这时候就会跳到相应的代码位置。

3、发现我们需要的那个界面其实是另一个网页,只不过是被嵌入到iframe中而已,所以我们可以直接打开这个链接:http://www.kehuda.com/g/l/default.jsp?iframe=true&ad=true&site=www.taodake.cn&timestamp=1571063790&sign=454b22875199b484cc0260b3661aaecc

4、输入宝贝链接,点击查询之后,发现浏览器的链接变成了:http://www.kehuda.com/g/l/default.jsp?iframe=true&ad=true&site=www.taodake.cn&timestamp=1571063790&sign=454b22875199b484cc0260b3661aaecc#site=taobao&id=531918473475http://www.kehuda.com/g/l/default.jsp?iframe=true&ad=true&site=www.taodake.cn&timestamp=1571063790&sign=454b22875199b484cc0260b3661aaecc#site=tmall&id=550392154495

5、发现查询淘宝和天猫商品的类别时候,发现浏览器的链接变化了,而且还只是在原先的链接后面加上了#site=taobao&id=531918473475和#site=tmall&id=550392154495,然后对这么长的url进行删减一些参数的测试,得到最后最精简的url:http://www.kehuda.com/g/l/default.jsp?iframe=true&ad=true#site=taobao&id=531918473475http://www.kehuda.com/g/l/default.jsp?iframe=true&ad=true#site=tmall&id=550392154495

6、 现在我们查询淘宝和天猫商品type的话,就可以直接用url的链接查询了,不需要模拟输入文本和点击按钮,省去了不少的麻烦,也能让爬起的时间大大的缩短。我们打开F12开发者模式,用快速选择工具,直接选择所属类目。用cssSelector的方法选择就是(“div.ct_result > div.n”),但是有多个这个元素,我们可以循环获取元素里面内容,判断是否包含“所属类目:”的字符串,就可以得到我们想要的结果。

三、核心代码。

1、WebDriverUtils工具类。

public class WebDriverUtils {
    public static WebDriver createWebDriver() {
        ChromeOptions options = new ChromeOptions();
        System.setProperty("webdriver.chrome.driver", PropertyUtils.getString("chrome.driver.path"));//chromedriver位置
        options.setBinary(PropertyUtils.getString("chrome.path"));//chrome位置
        Map<String, Object> prefs = new HashMap<>();
        prefs.put("profile.managed_default_content_settings.images", 2);//禁止下载加载图片
        options.setExperimentalOption("prefs", prefs);
        WebDriver driver = new ChromeDriver(options);
        driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
        return driver;
    }

    //浏览器每次都用新的Tag
    public static void getNewTag(WebDriver driver, String url) throws InterruptedException {
        JavascriptExecutor jse = (JavascriptExecutor) driver;
        jse.executeScript("function createDoc(){var w = window.open(); w.document.open(); w.document.write('<h1>Hello World!</h1>'); w.document.close();}; createDoc();");
        Thread.sleep(2000);
        driver.close();
        ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
        driver.switchTo().window(tabs.get(tabs.size() - 1)); //switches to new tab
        driver.manage().timeouts().pageLoadTimeout(300, TimeUnit.SECONDS);// 超过指定时间会超时,会抛出Exception
        driver.get(url);
        sleep();
    }

    public static void sleep() {
        try {
            Thread.sleep((int) (PropertyUtils.getInt("chrome.sleep") +
                    Math.random() * PropertyUtils.getInt("chrome.sleep.random")));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

2、主要流程代码。

@Service
public class ReptileGoodTypeService {
    @Autowired
    private IEcoGoodInfoService goodInfoService;

    private Logger log = LoggerFactory.getLogger(getClass());

    public void reptileGoodType(WebDriver driver, String platform) {
        List<EcoGoodInfo> goodInfoList = goodInfoService.getListForGoodType(platform);
        if (ListUtils.isBlank(goodInfoList)) {
            log.info("=============暂无商店要被采集!==============");
            return;
        }
        getTbAndTm(driver, goodInfoList);
    }

    private void getTbAndTm(WebDriver driver, List<EcoGoodInfo> goodInfoList) {
        driver.get("http://www.kehuda.com/g/l");
        for (int i = 0; i < goodInfoList.size(); i++) {
            try {
                EcoGoodInfo goodsInfo = goodInfoList.get(i);
                String url;
                if (goodsInfo.getPlatform().equals("淘宝")) {
                    url = getTaoBaoUrl(goodsInfo.getGoodUrl());
                } else if (goodsInfo.getPlatform().equals("天猫")) {
                    url = getTianMaoUrl(goodsInfo.getGoodUrl());
                } else {
                    continue;
                }
                WebDriverUtils.getNewTag(driver, url);
                //判断是否下架
                List<WebElement> msgElementList = driver.findElements(By.cssSelector("div.ct_result > div.msg"));
                for (WebElement msgElement : msgElementList) {
                    String msgResult = msgElement.getText();
                    if (msgResult.contains("下架") || msgResult.contains("不存在")) {
                        goodsInfo.setIsDelete(1);
                        goodInfoService.updateById(goodsInfo);
                    }
                }
                //获取分类
                List<WebElement> resultElementList = driver.findElements(By.cssSelector("div.ct_result > div.n"));
                String typeContent = null;
                for (WebElement resultElement : resultElementList) {
                    typeContent = resultElement.getAttribute("innerHTML");
                    String flagStr = "所属类目:";
                    if (typeContent.contains(flagStr)) {
                        typeContent = typeContent.replace(flagStr, "").trim();
                        break;
                    }
                }

                if (StringUtils.isNotBlank(typeContent)) {
                    String[] typeArray = typeContent.split("<img src=\"/images/arrow\\.gif\">");
                    if (typeArray.length >= 1) {
                        goodsInfo.setFirstType(typeArray[0]);
                        if (typeArray.length >= 2) {
                            goodsInfo.setSecondType(typeArray[1]);
                            if (typeArray.length >= 3) {
                                goodsInfo.setThirdType(typeArray[2]);
                            } else {
                                goodsInfo.setThirdType(goodsInfo.getSecondType());
                            }
                        } else {
                            goodsInfo.setSecondType(goodsInfo.getFirstType());
                            goodsInfo.setThirdType(goodsInfo.getFirstType());
                        }
                        goodInfoService.updateById(goodsInfo);
                        log.info(String.format("第%d/%d个商品type采集完成。", i + 1, goodInfoList.size()));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static String getTaoBaoUrl(String goodUrl) {
        String id = goodUrl.split("id=")[1];
        String[] paramArray = goodUrl.split("&");
        for (String param : paramArray) {
            if (param.contains("id=")) {
                id = param.split("id=")[1];
                break;
            }
        }
        return "http://www.kehuda.com/g/l/?ad=true#site=taobao&id=" + id;
    }

    private static String getTianMaoUrl(String goodUrl) {
        String id = goodUrl.split("id=")[1];
        String[] paramArray = goodUrl.split("&");
        for (String param : paramArray) {
            if (param.contains("id=")) {
                id = param.split("id=")[1];
                break;
            }
        }
        return "http://www.kehuda.com/g/l/?ad=true#site=tmall&id=" + id;
    }
}

3、备注。

  从数据库中获取商品信息列表List,插入到方法里面,将得到的一级、二级和三级分类放到商品信息中,再对数据库进行更新。其中WebDriver的Element只有getText()方法,没有getHtml()方法,所以我们使用Element.getAttribute("innerHTML")来进行替代。如果对我文章还有什么不同的地方,可以参考我的其他文章,也可以在下方留言。

猜你喜欢

转载自blog.csdn.net/qq_36511401/article/details/102558024