htmlunit+fastjson抓取酷狗音乐 qq音乐链接及下载

上次学了jsoup之后,发现一些动态生成的网页内容是无法抓取的,于是又学习了htmlunit,下面是抓取酷狗音乐与qq音乐链接的例子:

酷狗音乐:

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.nodes.Element;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.WebClient;

public class worm7 {
	 private static String name="离骚";
     public static WebClient getWebClient(boolean flag){
    	 WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45);
    	 webClient.getOptions().setUseInsecureSSL(true);
    	 webClient.getOptions().setCssEnabled(false);
         webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
         webClient.getOptions().setThrowExceptionOnScriptError(false);
         webClient.getOptions().setRedirectEnabled(true);
         webClient.getOptions().setAppletEnabled(false);
         webClient.getOptions().setJavaScriptEnabled(flag);
         webClient.getOptions().setTimeout(60000);
         webClient.getOptions().setPrintContentOnFailingStatusCode(false);
         webClient.setAjaxController(new NicelyResynchronizingAjaxController());
         return webClient;
     }
     public static String getMp3Url(WebClient webClient){
    	 FileOutputStream outputStream = null;
         InputStream inputStream = null;
         BufferedInputStream bis = null;
    	try {
			Page page=webClient.getPage("http://songsearch.kugou.com/song_search_v2?"
					+ "callback=jQuery112408395432201569397_1532930925600"
					+ "&keyword="+URLEncoder.encode(name, "utf-8")
					+ "&page=1"
					+ "&pagesize=30"
					+ "&userid=-1"
					+ "&clientver="
					+ "&platform=WebFilter"
					+ "&tag=em"
					+ "&filter=2"
					+ "&iscorrection=1"
					+ "&privilege_filter=0"
					+ "&_="+System.currentTimeMillis());
			//System.out.println(page.getWebResponse().getContentAsString());
			//System.out.println(zzee(page.getWebResponse().getContentAsString(),"(?<=\\(\\{).*?(?=\\}\\))"));
			JSONObject job=JSONObject.parseObject("{"+zzee(page.getWebResponse().getContentAsString(),"(?<=\\(\\{).*?(?=\\}\\))")+"}").getJSONObject("data");
			System.out.println("job:"+job);
			JSONArray list=job.getJSONArray("lists");
			System.out.println("list"+list);
			for(int i=0;i<list.size();i++){
				String id1=list.getJSONObject(i).getString("FileHash");
				String id2=list.getJSONObject(i).getString("AlbumID");
				String detailUrl="http://www.kugou.com/yy/index.php?r=play/getdata"
						+ "&hash="+id1
						+ "&album_id="+id2
						+ "&_="+System.currentTimeMillis();
				Page page2=webClient.getPage(detailUrl);
				JSONObject job2=JSONObject.parseObject(page2.getWebResponse().getContentAsString()).getJSONObject("data");
				System.out.println("标题:"+job2.getString("audio_name"));
				//System.out.println("歌词:"+job2.getString("lyrics"));
				System.out.println("mp3:"+job2.getString("play_url"));

	                String outImage = job2.getString("audio_name")+ ".mp3";
	                URL imgUrl = new URL(job2.getString("play_url"));//获取输入流
	                inputStream = imgUrl.openConnection().getInputStream();
	                //将输入流信息放入缓冲流提升读写速度
	                bis = new BufferedInputStream(inputStream);
	                //读取字节娄
	                byte[] buf = new byte[1024];
	                //生成文件
	                outputStream = new FileOutputStream("f://"+ outImage);
	                int size = 0;
	                //边读边写
	                while ((size = bis.read(buf)) != -1) {
	                     outputStream.write(buf, 0, size);
	                }
	                //刷新文件流
	                outputStream.flush();

			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return name;

     }
     private static String zzee(String str, String zz) {
 		String list = null;
 		Pattern p = Pattern.compile(zz);
 		Matcher m = p.matcher(str);
 		while (m.find()) {
 			list = m.group();
 		}

 		return list;
 	}
	public static void main(String[] args) {
		WebClient webClient=getWebClient(false);
		getMp3Url(webClient);
	}
}

  运行结果:

qq音乐抓取实例:

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.nodes.Element;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.WebClient;

public class worm6 {
	 private static String name="离骚";
	 static String id1=null;
	 static String id2=null;
	 static String id3=null;
	 static String id4=null;
	 static String name1=null;
	 static String name2=null;
	 static String url = null;
	 static JSONObject  job2=null;
     public static WebClient getWebClient(boolean flag){
    	 WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45);
    	 webClient.getOptions().setUseInsecureSSL(true);
    	 webClient.getOptions().setCssEnabled(false);
         webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
         webClient.getOptions().setThrowExceptionOnScriptError(false);
         webClient.getOptions().setRedirectEnabled(true);
         webClient.getOptions().setAppletEnabled(false);
         webClient.getOptions().setJavaScriptEnabled(flag);
         webClient.getOptions().setTimeout(60000);
         webClient.getOptions().setPrintContentOnFailingStatusCode(false);
         webClient.setAjaxController(new NicelyResynchronizingAjaxController());
         return webClient;
     }
     public static String getMp3Url(WebClient webClient){

    	try {
			Page page=webClient.getPage("https://c.y.qq.com/soso/fcgi-bin/client_search_cp?"
					+ "ct=24"
					+ "&qqmusic_ver=1298"
					+ "&new_json=1"
					+ "&remoteplace=txt.yqq.center"
					+ "&searchid=36047978388657978"
					+ "&t=0"
					+ "&aggr=1"
					+ "&cr=1"
					+ "&catZhida=1"
					+ "&lossless=0"
					+ "&p=1"
					+ "&n=20"
					+ "&w="+URLEncoder.encode(name, "utf-8")
					+ "&g_tk=5381"
					+ "&jsonpCallback=MusicJsonCallback6176591962889693"
					+ "&loginUin=0"
					+ "&hostUin=0"
					+ "&format=jsonp"
					+ "&inCharset=utf8"
					+ "&outCharset=utf-8"
					+ "&notice=0"
					+ "&platform=yqq"
					+ "&needNewCode=0"
					);
			//System.out.println("page:"+page);
			//System.out.println("------"+page.getWebResponse().getContentAsString());
			//System.out.println("======"+zzee(page.getWebResponse().getContentAsString(),"(?<=\\(\\{).*?(?=\\}\\))"));

			JSONObject job=JSONObject.parseObject("{"+zzee(page.getWebResponse().getContentAsString(),"(?<=\\(\\{).*?(?=\\}\\))")+"}").getJSONObject("data");
			//System.out.println("job:"+job);
			String job0=job.getString("song");
			//System.out.println("job0"+job0);
			job=JSON.parseObject(job0);
			JSONArray list=job.getJSONArray("list");
			//System.out.println("list:"+list);
			for(int i=0;i<list.size();i++){
				id1=list.getJSONObject(i).getString("mid");
				//System.out.println("id1"+id1);
				id2=list.getJSONObject(i).getString("file");
				//System.out.println("id"+id2);
				id2="C400"+JSONObject.parseObject(id2).getString("media_mid")+".m4a";
				//System.out.println("id"+id2);
				name1=list.getJSONObject(i).getString("title");
				name2=list.getJSONObject(i).getString("singer");
				//System.out.println(name2);
				JSONArray name=JSON.parseArray(name2);
				//System.out.println("job4:"+name);
				name2=name.getJSONObject(0).getString("name");
				//System.out.println(name.getJSONObject(0).getString("name"));

				/*String detailUrl="https://c.y.qq.com/v8/fcg-bin/fcg_play_single_song.fcg?"
						+ "songmid="+id1
						+ "&tpl=yqq_song_detail&format=jsonp&callback=getOneSongInfoCallback&g_tk=5381&jsonpCallback=getOneSongInfoCallback&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0"
						;
				Page page2=webClient.getPage(detailUrl);
				//System.out.println(page2);
				String b="{"+zzee(page2.getWebResponse().getContentAsString(),"(?<=\\(\\{).*?(?=\\}\\))")+"}";
				//System.out.println("b"+b);
				JSONObject job1=JSONObject.parseObject("{"+zzee(page2.getWebResponse().getContentAsString(),"(?<=\\(\\{).*?(?=\\}\\))")+"}").getJSONObject("url");
				System.out.println("job1:"+job1);
				String job2=job1.getString(id2);

				System.out.println("job2"+job2);*/
				String url1="https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=5381&jsonpCallback=MusicJsonCallback32651599216689386&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0&cid=205361747&callback=MusicJsonCallback32651599216689386&uin=0"
						+"&songmid="+id1
						+"&filename="+id2
						+"&guid=2241489759";
						;
						Page page2=webClient.getPage(url1);
						//System.out.println("page2"+page2);
						JSONObject job2=JSONObject.parseObject("{"+zzee(page2.getWebResponse().getContentAsString(),"(?<=\\(\\{).*?(?=\\}\\))")+"}").getJSONObject("data");
						//System.out.println("标题:"+job2.getString("items"));
						String job3=job2.getString("items");
						JSONArray job4=JSON.parseArray(job3);
						//System.out.println("job4:"+job4);
						//System.out.println(job4.getJSONObject(0).getString("vkey"));
						url ="http://dl.stream.qqmusic.qq.com/"+id2+"?vkey="+job4.getJSONObject(0).getString("vkey")+"&guid=2241489759&uin=0&fromtag=66";
						System.out.println("name:"+name1+"--"+name2);
						System.out.println("url:"+url);

						download();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return name;

     }
     private static String zzee(String str, String zz) {
 		String list = null;
 		Pattern p = Pattern.compile(zz);
 		Matcher m = p.matcher(str);
 		while (m.find()) {
 			list = m.group();
 		}

 		return list;
 	}
     private static void download() throws IOException{
    	 FileOutputStream outputStream = null;
         InputStream inputStream = null;
         BufferedInputStream bis = null;
    	 String outImage = name1+"--"+name2+ ".mp3";
         URL imgUrl = new URL(url);//获取输入流
         inputStream = imgUrl.openConnection().getInputStream();
         //将输入流信息放入缓冲流提升读写速度
         bis = new BufferedInputStream(inputStream);
         //读取字节娄
         byte[] buf = new byte[1024];
         //生成文件
         outputStream = new FileOutputStream("f://"+ outImage);
         int size = 0;
         //边读边写
         while ((size = bis.read(buf)) != -1) {
              outputStream.write(buf, 0, size);
         }
         //刷新文件流
         outputStream.flush();
     }
	public static void main(String[] args) {
		WebClient webClient=getWebClient(false);
		getMp3Url(webClient);
	}
}

  

运行结果:

相比之下,酷狗音乐相对好爬一些,QQ音乐有些繁琐。。。

原文地址:https://www.cnblogs.com/xr210/p/9404325.html

时间: 2024-10-10 06:57:53

htmlunit+fastjson抓取酷狗音乐 qq音乐链接及下载的相关文章

Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲

在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天就来实战下,用他们来抓取酷狗音乐网上的 Top500排行榜音乐.接下来的代码中除了会用到HttpClient和Jsoup之外,还会用到log4j和ehcache,分别用来记录日志和实现缓存,如果看官对这两个不是很熟悉的话,请自行百度,现在网上的入门实例有很多,我就不专门记笔记了. 那为什么会想到爬取

python使用beautifulsoup4爬取酷狗音乐

声明:本文仅为技术交流,请勿用于它处. 小编经常在网上听一些音乐但是有一些网站好多音乐都是付费下载的正好我会点爬虫技术,空闲时间写了一份,截止4月底没有问题的,会下载到当前目录,只要按照bs4库就好, 安装方法:pip install beautifulsoup4 完整代码如下:双击就能直接运行 from bs4 import BeautifulSoup import requests import re headers = { 'User-Agent': 'Mozilla/5.0 (Windo

爬虫程序2-爬取酷狗top500

爬取的内容为酷狗榜单中酷狗top500的音乐信息,如图所示. 网页版酷狗不能手动翻页,进行下一步的浏览.但通过观察第一页的URL: http://www.kugou.com/yy/rank/home/1-8888.html 这里尝试把数字1换为数字2,进行浏览,恰好返回的是第2页的信息(下图).进行多次尝试,发现更换不同数字即为不同页面,故只需更改home/后面的数字即可.由于每页显示的为22首歌曲,所以总共需要23个URL import requestsfrom bs4 import Beau

java使用htmlunit工具抓取js中加载的数据

htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实现.这个没有界面的浏览器,运行速度也是非常迅速的.采用的是Rhinojs引擎.模拟js运行. 说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs

Java实现简易爬虫--抓取酷安网用户头像

爬虫思路 以酷安网用户粉丝较多的用户的个人中心为进口,获取该用户的全部粉丝的个人中心链接,用户头像链接和用户名,并分别放入队列.开启两个线程获取信息,一个线程获取队列中的用户的信息并放入队列,另一个线程负责从头像链接队列中取出链接并下载用户头像. 爬虫分析 用浏览器打开一个用户的粉丝列表(http://coolapk.com/u/[用户id]/contacts) 并查看源码 我们可以看到粉丝列表以HTML的ul标签显示,并且其id为dataList,ul标签中的各个li标签即为每一个用户的信息啦

抓取一个网站的所有网址链接

作者QQ:231469242 关键字:爬虫,网址抓取,python 测试 url=http://db.yaozh.com/ import requests,bs4,re url="http://db.yaozh.com/" def getLinks(url): res = requests.get(url) soup = bs4.BeautifulSoup(res.text,"lxml") links = [] for link in soup.findAll('a

python爬虫:使用urllib.request和BeautifulSoup抓取新浪新闻标题、链接和主要内容

案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSoup import requests url = 'http://news.sina.com.cn/china/' web_data = requests.get(url) web_data.encoding = 'utf-8' soup = BeautifulSoup(web_data.text,'

Java爬虫实战(一):抓取一个网站上的全部链接

前言:写这篇文章之前,主要是我看了几篇类似的爬虫写法,有的是用的队列来写,感觉不是很直观,还有的只有一个请求然后进行页面解析,根本就没有自动爬起来这也叫爬虫?因此我结合自己的思路写了一下简单的爬虫,测试用例就是自动抓取我的博客网站(http://www.zifangsky.cn)的所有链接. 一 算法简介 程序在思路上采用了广度优先算法,对未遍历过的链接逐次发起GET请求,然后对返回来的页面用正则表达式进行解析,取出其中未被发现的新链接,加入集合中,待下一次循环时遍历. 具体实现上使用了Map<

使用Jsoup抓取网站上的图片、链接

以 http://www.zgfjqw.roboo.com/ 中国风景区网为例,我们想要抓取首页的所有图片. 使用Jsoup可以轻松实现. 代码及注释如下: 1 package test; 2 import java.io.*; 3 import java.net.URL; 4 import java.io.IOException; 5 import org.jsoup.Jsoup; 6 import org.jsoup.nodes.Document; 7 import org.jsoup.no