在java中运行的Python脚本(抓取网易云音乐数据)的简单事例代码(精简版)
2020-06-23 04:17
573 查看
这篇文章是精简版的,详情可以看我另一篇文章:https://blog.csdn.net/ZLZQ_Yuan/article/details/105374629
主要思路是: 用python写抓取数据的部分,然后用java代码,通过执行cmd命令直接执行python脚本,再通过java的swing工具进行页面展示。
1.python程序代码:
抓取网易云音乐某个播放页面上的歌曲名,及其地址(并将其下载在当前py文件的目录下)。
[code]# 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脚本。
[code]/** * 运行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("程序已被执行!"); } }
[code]/** * 界面显示 */ 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()); } } } }
[code]/** * 主函数 * @author ZLZQ_Yuan * */ public class Main { public static void main(String[] args) { Display display = new Display(); } }
3.运行结果:
注意:运行前一定要先在cmd命令框中下载所有py文件需要的依赖包。(具体参考开头链接里被红色字体标注的部分)
由于没有写分页功能,剩下的歌曲数据未显示出来。
相关文章推荐
- Java代码中调用shell脚本和python脚本并获得输出结果(分为小数据量和大数据量)
- 利用python脚本抓取AC的代码[爬虫+HTMLParser+handle_entityref+正则表达式+模拟登陆+文件操作]
- Linux下运行java代码的Shell脚本设置
- Python实现简单网页图片抓取完整代码实例
- Java运行Python脚本的几种方式
- Python使用mechanize模拟登录、抓取数据的代码
- Ajax与Python服务器交互,在网页实现简单的Python3代码的运行
- java简单实现抓取动态网页数据
- Python抓取Discuz!用户名脚本代码
- 一个简单的使用python抓取网页中的水文数据的程序
- 简单Python脚本实现数据导出Excel格式的尝试
- 从JAVA传数据到Python 脚本用Jython的解决方案
- Python机器学习中的实用小操作(一):数据清理篇 阿萨姆 2 个月前 0. 背景 很多朋友评论希望我共享答案和文章中提到的操作代码,比如生成相关性图谱等。为了方便大家,开始介绍一些虽然简单但很有用
- python学习第二章变量和简单数据类型的部分课后练习自己尝试的代码
- 【Python入门只需20分钟】从安装到数据抓取、存储原来这么简单
- 写python脚本进行abaqus建模,抄某指导书中的一个简单的悬臂梁代码
- 编写bat脚本运行简单java项目-邮件发送基于spring示例
- 简单的测试java代码运行时间
- 简单Python脚本实现数据导出Excel格式的尝试
- 简单的java读取excel表中的数据代码