这是我参与更文挑战的第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浏览器,并查看版本号
接着,打开驱动下载地址(地址可以自行百度):
找到和浏览器版本对应的驱动:
下载并解压到随意位置,这里是我的存放路径:
然后我们继续到代码里进行改造,首先在pom.xml中添加Selenium引用:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
这里有个坑要注意下,如果项目引用了swagger2,会有冲突导致报错,我这里直接吧swagger2引用先删掉了,如果需要共存,可以百度找解决方法。
我们继续改造调用接口的代码,这里将之前用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);
}
运行结果:
执行完成后,终于看到了我想要的内容了,至此sec_uid以及user/info接口的调用都已经完美解决,下期我们继续分析其他内容。
阶段总结:
1、分析接口时要充分利用Google Chrome浏览器的调试工具来搜索代码内容,通过代码出现位置的上下文进行分析跟踪。
2、HttpRequest会被后端反爬规则拦截,可以搭配Selenium灵活运用。
3、Selenium虽然好用,但是它会创建系统进程,自然会影响代码执行效率,这里需要进行优化。