# Crawler **Repository Path**: wanxx/Crawler ## Basic Information - **Project Name**: Crawler - **Description**: 爬虫 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-04-07 - **Last Updated**: 2024-12-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 业务爬虫 ### 介绍 获取自己想要的数据,具体例子如下 - ##### 获取所有上市公司的公司名、股票代码、股票详情链接 - ##### 获取上市公司近5个月涨跌幅 - ##### 比特币搬砖 ### 软件架构 Java开发:Selenium + webmagic + mybatis plus ### 运行小提示 1. 在 com.wxx.db.DBManager修改自己的数据库名、账号和密码 2. 如果提示chrome版本问题,请升级自己电脑的谷歌浏览器 3. 在 /src/main/resources 下存有该项目所有实例的数据表结构,在自己新建的数据库执行该SQL文件 4. 可以运行里面的各个实例的,通常都是 *Process.java ### 实例讲解 ##### 1. 获取所有上市公司的公司名、股票代码、股票详情链接 - 代码位置: com.wxx.shares包 - 运 行: 运行 **SharesProcess.java** 的main函数即可,控制台有输出 - 核心代码: ```java public void start() { String startUrl = "http://data.eastmoney.com/zjlx/detail.html"; CrawlerUtil.genSpider(this, startUrl, downloader).run(); // 微信推送给自己 WeChatPush.pushText("获取所有公司信息任务完成" + downloader.successCount + "页"); } public static void main(String[] args) { new SharesProcess().start(); } ``` ##### 2. 获取指定公司近5个月的涨跌幅 - 代码位置: com.wxx.shares.changes包 - 运 行: 运行 **SharesChangeProcess.java** 的main函数即可,控制台有输出 - 核心代码: ```java List taskList = new ArrayList<>(); taskList.add("http://data.eastmoney.com/zjlx/002217.html"); // 合力泰 taskList.add("http://data.eastmoney.com/zjlx/000725.html"); // 京东方A taskList.add("http://data.eastmoney.com/zjlx/000651.html"); // 格力电器 taskList.add("http://data.eastmoney.com/zjlx/zs000001.html"); // 上证指数 Spider spider = CrawlerUtil.genSpider(this, downloader); for (String url: taskList) { spider.addUrl(url); } spider.run(); System.out.println("结束:" + downloader.dataList.toString()); WeChatPush.pushText("分析完成"); ``` ##### 3. 比特币搬砖 - 原理描述:不同交易平台的btc价格不一样,所以可以赚取差价(当然原理可以行得通,至于手续费啥的自己另算);火币和okex官网的价格是WebSocket实时推送过来显示在界面的,所以我们打开两个标签页分别加载,然后设置定时器每隔10毫秒获取一次页面的价格,然后计算差价完成任务. - 以后优化:交易平台都是可以直接通过api交易的,也就是交易也可以通过代码实现,不需要人为介入,可提高我们交易的及时性 - 代码位置: com.wxx.btc包 - 运 行: 运行 **BtcProcess.java** 的main函数即可 - 全部代码: ```java public class BtcProcess { double huoUsdPrice = 0.0; // 火币交易所比特币的美元价格 double okUsdPrice = 0.0; // ok交易所比特币的美元价格 final double PRICE_NOTIFY_OFFSET = 10.0; // 两个交易所的差价的阀值达到该值时通知 final String URL_HUOBI = "https://www.huobi.io/zh-cn/"; // 火币网官网 final String URL_OKEX = "https://www.okex.com/"; // okex官网 HashMap windowMap = new HashMap<>(); private static ChromeDriver webDriver; static { CrawlerUtil.configChromeDriver(); ChromeOptions option = new ChromeOptions(); option.addArguments("headless"); // 不打开浏览器窗口,直接在后台执行任务 webDriver = new ChromeDriver(option); } private void start() throws InterruptedException { webDriver.get(URL_HUOBI); windowMap.put(URL_HUOBI, webDriver.getWindowHandle()); webDriver.switchTo().newWindow(WindowType.TAB); webDriver.get(URL_OKEX); windowMap.put(URL_OKEX, webDriver.getWindowHandle()); Thread.sleep(2000); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { parseHuoBi(); parseOkex(); calculatePriceOffset(); } }, 0, 10); } private void parseHuoBi() { WebElement element = webDriver.switchTo().window(windowMap.get(URL_HUOBI)).findElement(By.xpath("//dl[@class='btcusdt']")).findElement(By.xpath("//dd[@class='price']")); String value = element.getText(); if (value.contains("≈")) { value = value.substring(0, value.indexOf("≈") - 1); } try { huoUsdPrice = Double.parseDouble(value); } catch (Exception e) { weChatPush("火币价格解析double格式错误"); } } private void parseOkex() { WebElement element = webDriver.switchTo().window(windowMap.get(URL_OKEX)).findElement(By.xpath("//div[@class='ticker-table-box']")).findElement(By.xpath("//span[@class='legalPrice']")); String value = element.getText().replace("$", "").replace("," ,""); try { okUsdPrice = Double.parseDouble(value); } catch (Exception e) { weChatPush("okex价格解析double格式错误"); } } /** * 计算出不同交易所的差价,达到阀值推送 */ private void calculatePriceOffset() { if (okUsdPrice > 0.0 && huoUsdPrice > 0.0) { double offsetPrice = Double.parseDouble(String.format("%.2f", Math.abs(okUsdPrice - huoUsdPrice))); System.out.println("当前差价:" + offsetPrice + " okex:" + okUsdPrice + " 火币:" + huoUsdPrice); if (offsetPrice > PRICE_NOTIFY_OFFSET) { DecimalFormat df = new DecimalFormat("#.00"); weChatPush("目前行情:火币价格是" + huoUsdPrice + " okex的价格是" + okUsdPrice + ",目前差价是" + df.format(offsetPrice) + ",超过了" + PRICE_NOTIFY_OFFSET); } } } private long preNotifyTime = 0; /** * 当出现异常或者达到自己预定的值时,微信推送提醒 * 【注意】:避免提醒频繁,设置每分钟最多推送一次 */ private void weChatPush(String message) { if (System.currentTimeMillis() - preNotifyTime >= 60000) { WeChatPush.pushText(message); preNotifyTime = System.currentTimeMillis(); } } public static void main(String[] args) { try { new BtcProcess().start(); WeChatPush.pushText("比特币差价任务结束"); } catch (Exception e) { WeChatPush.pushText("比特币差价任务出现异常:" + e.getMessage()); e.printStackTrace(); } } } ```