手机版

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

时间:2021-11-02 来源:互联网 编辑:宝哥软件园 浏览:

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

有一天,我发现有很多铃声的官网(http://www . shoujidoido.com/main/)有很多数据。

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

http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getlistlistid={ category ID } page={分页页码}。

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

可以看出它们都有{'hasmore' :1,' curpage' 33601}这样的指令。通过判断hasmore的值,决定是否抓取下一页。

但是上面链接返回的json不包含铃声的下载地址。

很快就会发现,你点击页面上的“下载”就会看到。

通过下面的请求,可以得到铃声的下载地址。

http://www.shoujiduoduo.com/ringweb/ringweb.php?Type=geturlact=downrid={铃声ID}。

因此,他们的数据很容易被窃取。于是我开始了。

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

https://github.com/yongbo000/DuoduoAudioRobot

向上代码:

打包我。永博。DoiduoringRobot导入Java。io。bufferedeer导入Java。io。文件;导入Java。io。FileWriter导入Java。io。ioexception导入Java。io。InputStream导入Java。io。InputStreamReader导入Java。净。网址;导入Java。净。URl连接;导入Java。乌提尔。迭代器;导入Java。乌提尔。regex。火柴人;导入Java。乌提尔。regex。模式;进口。com。谷歌。gson。Gson进口。com。谷歌。gson。jsonarray导入com。谷歌。gson。jsone element;导入com。谷歌。gson。jsonparser/* * @作者yongbo _ * @创建于2013/4/16 * * */公开类十二环机器人客户端实现可运行{公共静态字符串GET _ ringininfo _ URL='http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getlistlistid=% 1 $ d页面=% 2 $ d ';公共静态字符串'http://www.shoujiduoduo.com/ringweb/ringweb.php?type=get URL act=down rid=% 1 $ d ';公共静态字符串错误_消息='列表标识'为%1$d的机器人发生错误,已自动停止。

当前页,面,张,版为“% 2 $ d”;公共静态字符串'状态_消息='开始抓取数据,当前列表Id: %1$d,当前页面:% 2 $ d ';公共静态字符串FILE _ DIR=' e :/ring data/';公共静态字符串FILE _ NAME=' listId=% 1 $ d.txt私有布尔值error flag=false private int listId私有(同Internationalorganizations)国际组织页面;private int结束页=-1;private int Hasmore=1;私有DbHelper dbHelper/** *构造函数* @param listId菜单标识* @参数页开始页码* @param endPage结束页码* */public doidoringrobotclient(int listId,int beginPage,int end page){ this。listId=listIdthis.page=beginPagethis。结束页=结束页;这个。DBhelper=new DBhelper();}/** * 构造函数* @param listId菜单标识* @参数页开始页码* */public doidoringrobotclient(int listId,int page) {this(listId,page,-1);}/** * 获取铃声* */public void getring(){ String URL=String。格式(GET _ ring info _ URL、listId、页面);string responseStr=HttpGet(URL);has more=get has more(responseStr);page=get next page(responseStr);环解析(responsestr。全部替换(' \ \ { \ '有更多' :[0-9]*,\ ' cur page ' :[0-9]* \ \ },',' ').replaceAll(',]',']');}/** * 发起超文本传送协议(超文本传输协议的缩写)请求* @param webUrl请求连接地址* */public String httpGet(String web URL){ URL URL;URL connection ConStringBuilder sb=new StringBuilder();字符串结果字符串=' ';尝试{url=新网址(WebURl);conn=URL。OpenConnection();conn . connect();输入流为=conn . getinputstream();InputStreamReader ISR=new InputStreamReader(is);BufferedReader bufReader=新的buffere阅读器;字符串行文本;while((line text=BufReader。ReadLine())!=null){ sb。追加(行文本);}结果字符串=sb。ToString();} catch(异常e){错误标志=真;//将错误写入txtwriteToFile(字符串。格式(ERROR _ MSG,listId,page));}返回resultStr}/** *将数据字符串转化成戒指对象,并存入文本文件(文本文件)中* @param json Json字符串* */public void Ring解析(String JSON){ Ring Ring=null;JsonElement元素=new JsonParser().解析(JSON);对象数组=元素。getasjsonarray();//遍历数组迭代器jsonelement it=array。迭代器();Gson Gson=new Gson();while (it.hasNext()!错误标志){ JSoneElement e=it。next();//JSoneElement转换为JavaBean对象ring=gson.fromJson(e,ring。类);戒指。setdown(get ring down(ring。getid()));if(是可用的ring(ring)){ system。出去。println(戒指。tostring());//可选择写入数据库还是写入文本//写入tofile(ring。tostring());writeToDatabase(环);}}}/** * 写入txt * @param数据字符串* */public void writeToFile(字符串数据){字符串路径=文件_目录字符串。格式(FILE _ NAME,listId);文件目录=新文件(FILE _ DIR);文件文件=新文件(路径);FileWriter fw=nullif(!迪尔。exists()){ dir。mkdirs();}请尝试{if(!文件。exists()){文件。新建文件();}fw=新的FileWriter(文件,真);fw.write(数据);fw。写入(' \ r \ n ');fw。flush();} catch (IOException e) {//TODO自动生成的catch块e . print stack trace();}最后{尝试{if(fw!=null){ fw。close();}} catch (IOException e) {//TODO自动生成的catch块e . print stack trace();}}}/** * 写入数据库* @param环一个戒指的实例* */public void writeToDatabase(Ring Ring){ db helper。执行(' addRing ',Ring);} @ override public void run(){ while(具有更多==1!errorFlag){if(endPage!=-1){ if(page end page){ break;} }系统。出去。println(字符串。格式(STATUS _ MSG,listId,page));getring();系统。出去。println(字符串。格式('该页数据写入完成'));}系统。出去。println(' end.');} private int getHasmore(String resultStr){ Pattern p=Pattern。编译(' \ ' hasmore ' :([0-9]*),\ ' cur page ' :([0-9]*)');匹配器匹配=p . matcher(结果字符串);if(匹配。find()){返回整数。parseint(匹配。第(1)组);}返回0;} private int getnext page(String resultStr){ Pattern p=Pattern。编译器(' \ '有更多' :([0-9]*),\ ' cur page ' :([0-9]*)');匹配器匹配=p . matcher(结果字符串);if(匹配。find()){返回整数。parseint(匹配。第(2)组);}返回0;}/** * 判断当前戒指是否满足条件。

当戒指的名字大于50个字符或是期间为小数则不符合条件,将被剔除* @param环当前戒指对象实例* */private boolean是可用的环(环环){模式p=pattern.compile('^[1-9][0-9]*$');火柴人。GetDuration());if(!匹配。find()){ return false;}if(ring.getName().长度()50 || ring.getArtist().长度()50 || ring.getDownUrl().length()==0){ return false;}返回true}/** *获取铃声的下载地址* @param rid铃声的id * */public String getringdowurl(String rid){ String URL=String。格式(GET _ DOWN _ URL,rid);string responseStr=HttpGet(URL);返回响应tr;}}

版权声明:java多线程抓取官网铃声数据是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。