在java中运行的Python脚本(抓取网易云音乐数据)的简单事例代码(精简版)

这篇文章是精简版的,详情可以看我另一篇文章:https://blog.csdn.net/ZLZQ_Yuan/article/details/105374629

主要思路是: 用python写抓取数据的部分,然后用java代码,通过执行cmd命令直接执行python脚本,再通过java的swing工具进行页面展示。

1.python程序代码:

   抓取网易云音乐某个播放页面上的歌曲名,及其地址(并将其下载在当前py文件的目录下)。

# encoding=utf-8
import requests
from bs4 import BeautifulSoup
import urllib.request

headers = {
    'Referer': 'http://mucis.163.com',
    'Host': 'music.163.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',
    'Accept': 'text/html5,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
}

# 歌单的url地址
play_url = 'http://music.163.com/playlist?id=2182968685'

# 获取页面内容
s = requests.session()
response = s.get(play_url, headers=headers).content

# 使用bs4匹配出对应的歌曲名称和地址
s = BeautifulSoup(response, 'lxml')
main = s.find('ul', {'class': 'f-hide'})

lists = []
for music in main.find_all('a'):
    # print('{} : {}'.format(music.text, music['href']))
    # 拼接出真正的路径
    musicUrl = 'http://music.163.com/song/media/outer/url' + music['href'][5:] + '.mp3'
    musicName = music.text
    # 单首歌曲的名字和地址放在list列表中
    # list.append(musicName)
    # list.append(musicUrl)
    list = [musicName, musicUrl]
    # 全部歌曲信息放在lists列表中
    lists.append(list)

print("start--------------------------")
num = "该页面共有" + str(len(lists)) + "首歌曲。歌曲名及url地址如下:"
print(num)
for i in lists:
    name = i[0]
    url = i[1]
    print(name + " : " + url)
print("end--------------------------")

# 下载列表中的全部歌曲,并以歌曲名命名下载后的文件,文件位置为当前文件夹
# for i in lists:
# i = lists[1]
# url = i[1]
# name = i[0]
# try:
#     print('正在下载', name)
#     urllib.request.urlretrieve(url, './%s.mp3' % name)
#     print('下载成功')
# except:
#     print('下载失败')

2.java代码:

   主函数Main启动Display界面显示,“运行”按钮监听点击事件,点击后调用ConnectPython类实现cmd命令框运行py脚本。

/**
 * 运行py脚本
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

public class ConnectPython {
	public String getData() {	

		 String returnResult= "";
		 StringBuilder sb =new StringBuilder();

		  try {
	            Process process = Runtime.getRuntime().exec("python E:\\MusicData.py" );

	            InputStreamReader ir = new InputStreamReader(process.getInputStream(),"GBK");
	            String result =null;
	            LineNumberReader input = new LineNumberReader(ir);	            
	            while((result= input.readLine())!=null) {
	            	//returnResult+=result+"";
	            	//拼接更快
	            	sb.append(result).append("\r\n");	
	            }
	            returnResult=sb.toString();

	            input.close();
	            ir.close();
	            process.waitFor();	           
	        } catch (Exception e) {
	            System.out.println("调用python脚本并读取结果时出错:" + e.getMessage());
	        }	  
		  return returnResult;
	       // System.out.println("程序已被执行!");	  	  
	}

}

 

/**
 * 界面显示
 */
import java.awt.Dimension;

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Display implements ActionListener{

	javax.swing.JButton btn2;
	javax.swing.JTextArea wbk1;
	 
	
	public Display() {	
		// TODO Auto-generated constructor stub
		javax.swing.JFrame jf=new javax.swing.JFrame();
		jf.setTitle("抓取网易云音乐数据运行界面");
		jf.setSize(600,450);
		jf.setLocationRelativeTo(null);
		//流式布局
		java.awt.FlowLayout flow=new java.awt.FlowLayout();
		jf.setLayout(flow);
		  //单行文本域
		  wbk1=new javax.swing.JTextArea("请点击运行按钮");		   
		  java.awt.Dimension dm=new java.awt.Dimension(580, 350);
		  wbk1.setPreferredSize(dm);
		  JScrollPane jsp=new JScrollPane(wbk1);
		  jf.add(jsp);
		  javax.swing.JButton btn1=new javax.swing.JButton("上一页");
		  btn2=new javax.swing.JButton("运行");
		  btn2.addActionListener(this);
		  javax.swing.JButton btn3=new javax.swing.JButton("下一页");
		  jf.add(btn1);
		  jf.add(btn2);
		  jf.add(btn3);
		  jf.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource()==btn2) {
			ConnectPython cpython = new ConnectPython();
			if(cpython.getData()!=null) {
				wbk1.setText(cpython.getData());
			}			
		}
	}	  
}
/**
 * 主函数
 * @author ZLZQ_Yuan
 *
 */
public class Main {
	public static void main(String[] args) {
		Display display = new Display();
	}
}

3.运行结果:

  注意:运行前一定要先在cmd命令框中下载所有py文件需要的依赖包。(具体参考开头链接里被红色字体标注的部分)

                   

                    

                                  由于没有写分页功能,剩下的歌曲数据未显示出来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值