批量爬取手机某app动态壁纸
发现一个很好看的手机动态壁纸app,但app广告很是烦人,于是...
一、准备工具
- IDEA社区版:撸java代码专用神器
- Fiddler Everywhere:网络抓包的不二之选
- 手机一部:用于分析页面数据
- PostMan:用于测试请求接口参数
Fiddler如何对手机抓包网上教程很多,这里就不再赘述了。有兴趣的请自行百度,这里附上一条教程链接。
二、通过抓包分析响应数据获取请求链接
1、手机页面分析:壁纸是加载的方式为流式加载。做过后端的应该很容易联想到数据是通过js异步加载出来的。当请求的数据超过页面展示的数据时,页面就会发起一次Ajax请求。接下来就通过fiddler抓取需要的响应数据包,找到相应的请求链接。
2、数据抓包分析:由上面分析可知,页面数据都是以流的方式加载,那么手机页面不断地往下拉,达到数据展示阀值页面就会向后台发送请求,经过3轮数据请求,嘿!果然发现了一个响应数据格式为json的数据包,相应的也找到了该响应的请求链接。得到了请求连接接下来就需要分析请求参数了。
3、请求参数分析:由上面分析获得的链接请求参数很多,但部分参数可有可无,为了减少链接的长度和后来代码的可读性,这里有必要删除一些没必要的参数,经过postman的测试。筛选出了以下必要参数。
三、对获取的链接进行发起请求并保存数据
获取了请求链接和参数,那么接下来任务就需要撸代码和保存数据了,上代码。
public class Application {
public static void main(String[] args) {
//由于响应的数据格式为json,这里使用了jackson作为json解析器
ObjectMapper mapper = new ObjectMapper();
//这里是获取的上面请求链接(手动打码)
String sead = "http://***********?tag=l_all&limit=36&";
String url = "";
String after = "76534017";//初始下一页的id
int count = 0;//统计数据量
int start = 1;//开始页码
int end = 2;//结束页码
int chapter=1;//为后来保存数据文件命名
//循环取前十页的壁纸数据
while (start <= end) {
url = sead + "page=" + start + "&after=" + after;//拼接请求地址
try {
Connection.Response response = Jsoup.connect(url)
.ignoreContentType(true)
.method(Connection.Method.GET)//请求方式为GET
.timeout(5000)//设置超时时间
.execute();
//将json数据进行解析
RootBean rootBean = mapper.readValue(response.body(), RootBean.class);
//获取下一页的id
after = String.valueOf(rootBean.getAfter());
//对每一页的数据进行下载
for (Data data : rootBean.getData()) {
FileUtils.copyURLToFile(new URL(data.getUrl()), new File("E:\\video\\" + (chapter++) + ".mov"));//数据下载
}
System.out.println("****************第" + start + "页提取完成+***************************");
count += rootBean.getData().size();
Thread.sleep(1000);
} catch (IOException e) {
System.out.println("第" + start + "页数据获取失败!");
} catch (InterruptedException e) {
System.out.println("等待超时!");
}
start++;
}
System.out.println("共检索数据 " + count + "条!");
}
}
四、效果展示