自己动手实现抖音高清无水印视频下载工具(3)

1,695 阅读3分钟

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

前情回顾

书接上回,上次我们在调试过程中,成功拿到了sec_uid,但是无法成功访问接口,提示了错误内容: {"status_code":1,"status_msg":"Url doesn't match"}

凭借经验分析后,基本可以确定导致以上问题的原因基就是接口可能做了反爬校验,直接校验了user-Agent等参数来判定是否是模拟访问,那么今天我们换个思路,我们尝试使用浏览器内核驱动去调用接口,看看能否成功。

Selenium介绍

Selenium是什么

Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。 Selenium也是一款同样使用Apache License 2.0协议发布的开源框架。

为什么要使用Selenium

Selenium最初是为网站自动化测试而开发的,Selenium可以直接调用浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏等,可以完美模拟浏览器端操作,一些API接口的反爬不太会识别到,这么就可以解决之前遇到的反爬导致调用不通问题。

继续解决user/info无法访问的问题

经过上面的铺垫,大家基本了解了Selenium的用途,我们继续了解使用方法

首选,我们需要安装GoogleChrome浏览器,并查看版本号

image.png

接着,打开驱动下载地址(地址可以自行百度):

image.png

找到和浏览器版本对应的驱动:

image.png

image.png 下载并解压到随意位置,这里是我的存放路径:

image.png 然后我们继续到代码里进行改造,首先在pom.xml中添加Selenium引用:

        <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-java</artifactId>
                <version>3.141.59</version>
        </dependency>

这里有个坑要注意下,如果项目引用了swagger2,会有冲突导致报错,我这里直接吧swagger2引用先删掉了,如果需要共存,可以百度找解决方法。

image.png

我们继续改造调用接口的代码,这里将之前用HttpRequest的请求方式改为Selenium模拟浏览器请求,直接上代码:

	/**
	 * 
	 * @param homeUrl 首页地址
	 * @param url 接口地址
	 */
	public void getUserInfo(String homeUrl,String url){
		String sec_uid=getLocationParam(homeUrl);
		String apiUrl=url+"?sec_uid="+sec_uid;
		System.out.println(apiUrl);
		System.getProperties().setProperty("webdriver.chrome.driver","F:\\proj\\drivers\\chromedriver.exe");
		 //开启webDriver进程
		 ChromeOptions options = new ChromeOptions();
                 //下面2个参数是不让浏览器弹出,不然浏览器闪出来一下
		 options.addArguments("--headless");
		 options.addArguments("--disable-gpu");
		 WebDriver webDriver = new ChromeDriver(options);
		 webDriver.get(apiUrl);
		 String h=webDriver.getPageSource();
		 System.out.println(h);
		 webDriver.close();
		 webDriver.quit();
//		 String jsonString = JwtHttpUtil.httpRequest(apiUrl, "POST", null);
//		 System.out.println(jsonString);
	}

运行结果:

image.png 执行完成后,终于看到了我想要的内容了,至此sec_uid以及user/info接口的调用都已经完美解决,下期我们继续分析其他内容。

阶段总结:

1、分析接口时要充分利用Google Chrome浏览器的调试工具来搜索代码内容,通过代码出现位置的上下文进行分析跟踪。

2、HttpRequest会被后端反爬规则拦截,可以搭配Selenium灵活运用。

3、Selenium虽然好用,但是它会创建系统进程,自然会影响代码执行效率,这里需要进行优化。