java模拟登陆优酷

好久没有写文章分(装)享(逼)了,趁着国庆节有充足的时间分享一下最近所学。

需求背景

最近被分到一个活,给你一个视频地址,需要播放这个视频并录屏保存

步骤

  • 打开网页
  • 登陆
  • 播放
  • 录屏

疑难问题

  • 有些视频需要登陆以后才能播放
  • 有些网站播放需要安装flash

前期调研

因为要模拟打开网页的操作,需要使用浏览器,所以想使用无头浏览器去实现。无头浏览器有很多种,因为自己学习的语言是java,所以重点调查了支持java语言的无头浏览器。比较常用的是PhantomJS、Selenium、jBrowserDriver。最终确定使用Selenium,因为另外两种方式不支持flash播放,那么有些视频网站的地址就不能正确播放。 对于登陆的问题,本来决定使用cookie登陆,后来在写Selenium简单使用例子的时候觉得可以通过获取网页的XPath,模拟填入内容和点击的效果。

前期准备

因为selenium需要依赖驱动,所以首先得安装drive。以google浏览器为例,需要安装chromedriver。需要注意:

  • 安装的chromedriver需要和google版本一致
  • 安装位置必须和google同一路径,否则将会报错:
Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver. The latest version can be downloaded from http://chromedriver.storage.googleapis.com/index.html
	at com.google.common.base.Preconditions.checkState(Preconditions.java:847)
	at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:124)
	at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDriverService.java:32)
	at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExecutable(ChromeDriverService.java:137)
	at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:339)
	at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:88)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:116)
	at com.shuwen.test.Selenium2Test.main(Selenium2Test.java:15)
复制代码
  • 添加selenium依赖

编码实现

  • 打开浏览器
 //指定chromedriver安装位置,注意:必须和chrome在同个目录下
System.setProperty("webdriver.chrome.driver", "/Applications/Google Chrome.app/Contents/MacOS/chromedriver");
 //设置google浏览器选项
ChromeOptions chromeOptions = new ChromeOptions();
//指定浏览器全屏
chromeOptions.addArguments("--start-fullscreen");
//创建chrome
WebDriver driver = new ChromeDriver(chromeOptions);
复制代码

通过 ChromeOptions设置了一些浏览器参数,比如希望浏览器全屏打开 执行此段代码以后会发现弹出了一个浏览器,并且打开了指定的页面,但是:

需要点击登陆一下才能登陆

  • 模拟点击登陆 检查该页面
    可以很快的获得xpath为//*[@id="ykPlayer"]/div[2]/div[2]/div[5]/div[2]/a 模拟点击
driver.findElement(By.xpath("//*[@id=\"ykPlayer\"]/div[2]/div[2]/div[5]/div[2]/a")).click();
复制代码

.click 模拟点击操作

  • 输入账号密码登陆
    以同样的方式获得对应的xpath路径 账号xpath://*[@id=\"YT-ytaccount\"] 密码xpath://*[@id=\"YT-ytpassword\"] 登陆xpath://*[@id=\"YT-nloginSubmit\"]
 driver.findElement(By.xpath("//*[@id=\"YT-ytaccount\"]")).sendKeys("YourAccount");
        driver.findElement(By.xpath("//*[@id=\"YT-ytpassword\"]")).sendKeys("YourPassword");
        driver.findElement(By.xpath("//*[@id=\"YT-nloginSubmit\"]")).click();
复制代码

.sendKey往输入框填入指定数据

  • 退出浏览器
driver.quit();
复制代码
  • 完整demo
package com.cqupt.login.youku;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

/**
 * 模拟登陆优酷
 *
 * @author hetiantian
 * @date 2018/10/01
 * */
public class YouKuLogin {
    public static void main(String[] args) throws InterruptedException {
        //指定chromedriver安装位置,注意:必须和chrome在同个目录下
        System.setProperty("webdriver.chrome.driver", "/Applications/Google Chrome.app/Contents/MacOS/chromedriver");
        //设置google浏览器选项
        ChromeOptions chromeOptions = new ChromeOptions();
        //指定浏览器全屏
        chromeOptions.addArguments("--start-fullscreen");
        //创建chrome
        WebDriver driver = new ChromeDriver(chromeOptions);

        // 使用它访问 Google
        driver.get("https://v.youku.com/v_show/id_XMzYxMDM4MzY3Ng==.html");
        Thread.sleep(2*1000);

        //模拟点击登陆
        driver.findElement(By.xpath("//*[@id=\"ykPlayer\"]/div[2]/div[2]/div[5]/div[2]/a")).click();
        Thread.sleep(2*1000);

        //模拟点击登陆
        driver.findElement(By.xpath("//*[@id=\"YT-ytaccount\"]")).sendKeys("YourAccount");
        driver.findElement(By.xpath("//*[@id=\"YT-ytpassword\"]")).sendKeys("YourPassword");
        driver.findElement(By.xpath("//*[@id=\"YT-nloginSubmit\"]")).click();

        //让视频加载完成
        Thread.sleep(2000);

        // 检查页面标题
        System.out.println("Page title is: " + driver.getTitle());


        //退出浏览器
        driver.quit();
    }
}
复制代码

附:gitub地址:github.com/TiantianUpu…

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java模拟登录微博,你可以使用网络请求库(如HttpClient或OkHttp)来发送HTTP请求,并模拟用户登录微博的过程。以下是一个简单的示例代码: ```java import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class WeiboLogin { public static void main(String[] args) { HttpClient httpClient = HttpClientBuilder.create().build(); HttpPost httpPost = new HttpPost("https://passport.weibo.cn/sso/login"); // 设置请求参数 List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("username", "your_username")); params.add(new BasicNameValuePair("password", "your_password")); params.add(new BasicNameValuePair("savestate", "1")); params.add(new BasicNameValuePair("r", "https://m.weibo.cn/")); params.add(new BasicNameValuePair("ec", "0")); params.add(new BasicNameValuePair("pagerefer", "https://m.weibo.cn/")); params.add(new BasicNameValuePair("entry", "mweibo")); params.add(new BasicNameValuePair("wentry", "")); params.add(new BasicNameValuePair("loginfrom", "")); params.add(new BasicNameValuePair("client_id", "")); params.add(new BasicNameValuePair("code", "")); params.add(new BasicNameValuePair("qq", "")); params.add(new BasicNameValuePair("mainpageflag", "1")); params.add(new BasicNameValuePair("hff", "")); params.add(new BasicNameValuePair("hfp", "")); try { httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); // 发送登录请求 HttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); // 处理登录结果 if (entity != null) { String result = EntityUtils.toString(entity); System.out.println(result); // 在这里可以解析返回的结果,判断登录是否成功 } } catch (IOException e) { e.printStackTrace(); } } } ``` 请注意,这只是一个简单的示例代码,实际上模拟登录微博可能需要更多的参数和步骤。另外,模拟登录涉及到网络请求和用户隐私,需要遵守相关法律法规和网站的使用规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值