java多线程抓取铃声多多官网的铃声数据

一直想练习下java多线程抓取数据。

有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据。

通过观察他们前端获取铃声数据的ajax

http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getlist&listid={类别ID}&page={分页页码}

很容易就能发现通过改变 listId和page就能从服务器获取铃声的json数据, 通过解析json数据,

可以看到都带有{"hasmore":1,"curpage":1}这样子的指示,通过判断hasmore的值,决定是否进行下一页的抓取。

但是通过上面这个链接返回的json中不带有铃声的下载地址

很快就可以发现,点击页面的“下载”会看到

通过下面的请求,就可以获取铃声的下载地址了

http://www.shoujiduoduo.com/ringweb/ringweb.php?type=geturl&act=down&rid={铃声ID}

所以,他们的数据是很容易被偷的。于是我就开始...

源码已经发在github上。如果感兴趣的童鞋可以查看

github:https://github.com/yongbo000/DuoduoAudioRobot

上代码:

package me.yongbo.DuoduoRingRobot;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.URL;

import java.net.URLConnection;

import java.util.Iterator;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import com.google.gson.Gson;

import com.google.gson.JsonArray;

import com.google.gson.JsonElement;

import com.google.gson.JsonParser;

/* * @author yongbo_ * @created 2013/4/16 * * */

public class DuoduoRingRobotClient implements Runnable {

public static String GET_RINGINFO_URL = "http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getlist&listid=%1$d&page=%2$d";

public static String GET_DOWN_URL = "http://www.shoujiduoduo.com/ringweb/ringweb.php?type=geturl&act=down&rid=%1$d";

public static String ERROR_MSG = "listId为 %1$d 的Robot发生错误,已自动停止。当前page为 %2$d";public static String STATUS_MSG = "开始抓取数据,当前listId: %1$d,当前page: %2$d";

public static String FILE_DIR = "E:/RingData/";public static String FILE_NAME = "listId=%1$d.txt";private boolean errorFlag = false;private int listId;private int page;

private int endPage = -1;private int hasMore = 1;

private DbHelper dbHelper;

/** * 构造函数 * @param listId 菜单ID * @param page 开始页码 * @param endPage 结束页码 * */

public DuoduoRingRobotClient(int listId, int beginPage, int endPage)

{this.listId = listId;this.page = beginPage;this.endPage = endPage;this.dbHelper = new DbHelper();}

/** * 构造函数 * @param listId 菜单ID * @param page 开始页码 * */

public DuoduoRingRobotClient(int listId, int page) {this(listId, page, -1);}

/** * 获取铃声 * */public void getRings() {String url = String.format(GET_RINGINFO_URL, listId, page);String responseStr = httpGet(url);hasMore = getHasmore(responseStr);

page = getNextPage(responseStr);

ringParse(responseStr.replaceAll("\\{\"hasmore\":[0-9]*,\"curpage\":[0-9]*\\},", "").replaceAll(",]", "]"));}/** * 发起http请求 * @param webUrl 请求连接地址 * */public String httpGet(String webUrl){URL url;URLConnection conn;StringBuilder sb = new StringBuilder();String resultStr = "";try {url = new URL(webUrl);conn = url.openConnection();conn.connect();InputStream is = conn.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader bufReader = new BufferedReader(isr);String lineText;while ((lineText = bufReader.readLine()) != null) {sb.append(lineText);}resultStr = sb.toString();} catch (Exception e) {errorFlag = true;//将错误写入txtwriteToFile(String.format(ERROR_MSG, listId, page));}return resultStr;}/** * 将json字符串转化成Ring对象,并存入txt中 * @param json Json字符串 * */public void ringParse(String json) {Ring ring = null;JsonElement element = new JsonParser().parse(json);JsonArray array = element.getAsJsonArray();// 遍历数组Iterator it = array.iterator();

Gson gson = new Gson();while (it.hasNext() && !errorFlag) {JsonElement e = it.next();// JsonElement转换为JavaBean对象ring = gson.fromJson(e, Ring.class);ring.setDownUrl(getRingDownUrl(ring.getId()));if(isAvailableRing(ring)) {System.out.println(ring.toString());

//可选择写入数据库还是写入文本//writeToFile(ring.toString());writeToDatabase(ring);}}}

/** * 写入txt * @param data 字符串 * */public void writeToFile(String data)

{String path = FILE_DIR + String.format(FILE_NAME, listId);File dir = new File(FILE_DIR);File file = new File(path);FileWriter fw = null;if(!dir.exists()){dir.mkdirs();

}try {if(!file.exists()){file.createNewFile();}fw = new FileWriter(file, true);

fw.write(data);fw.write("\r\n");fw.flush();} catch (IOException e) {

// TODO Auto-generated catch blocke.printStackTrace();

}finally {try {if(fw != null){fw.close();}} catch (IOException e) {

// TODO Auto-generated catch blocke.printStackTrace();}}}/** * 写入数据库 * @param ring 一个Ring的实例 * */

public void writeToDatabase(Ring ring) {dbHelper.execute("addRing", ring);}

@Overridepublic void run() {while(hasMore == 1 && !errorFlag){if(endPage != -1){if(page > endPage) { break; }}System.out.println(String.format(STATUS_MSG, listId, page));

getRings();System.out.println(String.format("该页数据写入完成"));}System.out.println("ending...");}

private int getHasmore(String resultStr){Pattern p = Pattern.compile("\"hasmore\":([0-9]*),\"curpage\":([0-9]*)");

Matcher match = p.matcher(resultStr);

if (match.find()) { return Integer.parseInt(match.group(1));

} return 0;

}

private int getNextPage(String resultStr){Pattern p = Pattern.compile("\"hasmore\":([0-9]*),\"curpage\":([0-9]*)");Matcher match = p.matcher(resultStr);if (match.find()) {return Integer.parseInt(match.group(2));}return 0;}

/** * 判断当前Ring是否满足条件。当Ring的name大于50个字符或是duration为小数则不符合条件,将被剔除。 * @param ring 当前Ring对象实例 * */private boolean isAvailableRing(Ring ring){Pattern p = Pattern.compile("^[1-9][0-9]*$");

Matcher match = p.matcher(ring.getDuration());

if(!match.find()){return false;}if(ring.getName().length() > 50 || ring.getArtist().length() > 50 || ring.getDownUrl().length() == 0){return false;}return true;}

/** * 获取铃声的下载地址 * @param rid 铃声的id * */

public String getRingDownUrl(String rid){String url = String.format(GET_DOWN_URL, rid);

String responseStr = httpGet(url);return responseStr;}}相关阅读:

JavaScript中ES6字符串扩展方法

win10版本号怎么查看?win10查看版本号的方法

C#开发纽曼USB来电小秘书客户端总结

JS+DIV实现鼠标划过切换层效果的实例代码

CSS3的常见transformation图形变化用法小结

jquery模拟alert的弹窗插件

Windows10右键菜单没有"解压文件"这一选项怎么办 win10鼠标右键没有解压选项的解决

让input框实现类似百度的搜索提示(基于jquery事件监听)

Php中用PDO查询Mysql来避免SQL注入风险的方法

javascript(js)的小数点乘法除法问题详解

win10无法启动安全中心该怎么办?

jsp操作MySQL实现查询/插入/删除功能示例

Bootstrap基础学习

Jquery的each里用return true或false代替break或continue

学校铃声Java_java_java多线程抓取铃声多多官网的铃声数据,一直想练习下java多线程抓取数 - phpStudy...相关推荐

  1. java铃声类_java多线程抓取铃声多多官网的铃声数据

    一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观察他们前端获取铃声数据的ajax http ...

  2. java铃声_java多线程抓取铃声多多官网的铃声数据

    一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观察他们前端获取铃声数据的ajax http ...

  3. python利用mysql数据库实现一个中英文翻译程序兼单词试卷生成并改阅功能,并可以爬取有道官网进行在线翻译。

    直接上运行截图(代码在后面) 开始界面 使用navicat查看mysql数据库中的数据 单词查询功能测试 本地翻译一个本地数据库中有的单词 本地翻译一个本地数据库中没有的单词 爬取有道官网进行在线翻译 ...

  4. Node 插件 爬取王者荣耀官网英雄信息,并生成数据库

    文章结构 打开官网看接口地址 打开官网 游戏资料里的英雄资料,并打开后台 接下来是英雄技能 技能结构路径方便抓取 jQ的获取元素这里不细说 重头戏 抓包到到数据库 全部代码 看数据库 总结 打开官网看 ...

  5. java超线程_超线程多核心下Java多线程编程技术分析

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...

  6. 爬取中国所有银行官网网址信息

    爬取中国所有银行官网网址信息,并保存在文档中. from urllib import request from urllib.request import urlopen import re url ...

  7. Python爬虫之简单爬虫之爬取英雄联盟官网的英雄的皮肤

    Python爬虫之简单爬虫之爬取英雄联盟官网的英雄的皮肤 文章目录 Python爬虫之简单爬虫之爬取英雄联盟官网的英雄的皮肤 背景:LOL这款游戏有着大量的玩家,这个游戏里面人们津津乐道的皮肤,每一款 ...

  8. python爬虫爬取王者荣耀官网全部英雄头像(源码分享)

    这篇文章为源码分享,爬虫的分析过程请阅读文章 <用python爬取王者荣耀官网的英雄皮肤海报(含源码)> 源码 import requests import json from bs4 i ...

  9. 简单20行代码爬取王者荣耀官网1080p壁纸

    简单20行代码爬取王者荣耀官网1080p壁纸 # -*- coding: utf-8 -*- # @Time : 2020/12/13 18:08 # @Author : ningfangcong i ...

最新文章

  1. Google Test(GTest)使用方法和源码解析——参数自动填充技术分析和应用
  2. iOS_Development~ 添加 / 隐藏 UITabBar 右上角的小红点
  3. 2021年机器学习的下一步是什么?
  4. 智能车百度赛道培训第二弹-算法篇
  5. mysql servicebroker_阿里云Kubernetes服务 - Service Broker快速入门指南
  6. 1.4 super关键字详解
  7. Android打包(一)
  8. SAP使用表空间传输异构系统迁移
  9. Python可视化工具Matplotlib 3.0版出炉,改进默认后端选择,饼图终于变圆了
  10. 熟悉 CMake(二)—— 以一个实例说明 CMakeLists.txt 文件的编写
  11. idea注册账号_【Meta分析】Meta分析该不该注册?如何注册?什么时候注册?
  12. 2022全新彩虹商城知识付费模板源码+修复改良版
  13. 计算机设备统计报告,中国互联网络发展状况统计报告-中国科学院计算机网络信息中心.DOC...
  14. 江苏省泰州市谷歌高清卫星地图下载
  15. 进行分词时,报错omw-1.4安装包未找到?
  16. 两个鸡蛋100层楼(DP)
  17. LMS算法实现系统识别
  18. pc投屏android软件,Scrcpy安卓电脑投屏软件下载
  19. 超市管理系统-1(JavaSwing和Oracle数据库)
  20. Unicode编码 ASCII码 utf-8编码 中英文字符所占字节

热门文章

  1. linux用ftp上传文件
  2. 《用户思维 众创时代下的用户获取.体验.转化与留存》读书笔记
  3. js replace正则替换 \n
  4. 3DMAX角色建模,人物头像建模!次世代游戏建模技巧全解
  5. 【20考研】单词记不住?速效记忆法解决问题
  6. 【笔记整理 - MySQL】
  7. 益和VA虚拟文件夹群发文件的改进
  8. 挑战(二)的一些补充
  9. 2016全球计算机排名,高人能否把US News 2016全球计算机专业排名发出来看看?
  10. 安卓平板微信和手机微信同时登陆_一台电脑如何同时登陆多个微信?教你快速多开微信登陆的方法...