java批量采集豌豆荚网站Android应用图标和包名
Android主题开发者做的主题,如果想代替第三方应用图标,就必须要知道应用的包名。其实想知道应用的包名很简单,直接在浏览器打开GooglePlay或豌豆荚,打开某应用的页面,看网址你就会发现,网址最后“/”字符后接的就是应用的包名!
估计有人想把常用应用的图标和包名都搞下来,所以用java写了个小程序,批量抓取了豌豆荚上“全部软件”按总下载量排名里1到20页的应用图标与包名。
所有图标都用包名来命名的,里面还有一个packageName.txt文件,包含了应用名称对应的包名,方便查找。
java源码
分享这个java小程序,注意,如果豌豆荚的网页结构变了(估计很少改变吧),这个小程序就需要修改一下了,如果看得懂的话,修改很简单的咯。
以下代码可能已失效,仅作参考!
packageim.garth.AppIconDownloader;
importjava.io.BufferedWriter; importjava.io.File; importjava.io.FileOutputStream; importjava.io.FileWriter; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjava.net.URL; importjava.net.URLConnection; importjava.util.HashMap; importjava.util.Map.Entry;
importorg.apache.http.HttpEntity; importorg.apache.http.HttpResponse; importorg.apache.http.HttpStatus; importorg.apache.http.client.HttpClient; importorg.apache.http.client.methods.HttpGet; importorg.apache.http.impl.client.DefaultHttpClient; importorg.apache.http.util.EntityUtils; importorg.jsoup.Jsoup; importorg.jsoup.nodes.Document; importorg.jsoup.nodes.Element; importorg.jsoup.select.Elements;
/** *获取豌豆荚网页上安卓软件全部软件 *注意:执行程序前,一定要在这个工程目录下创建icon文件夹 *所有图标将下载到icon这个文件夹中 *应用名称与包名写到了icon下的packageName.txt文件里 * *这个程序用到的jar包: *commons-logging-1.1.3.jar *httpclient-4.1.2.jar *httpcore-4.3.jar *jsoup-1.6.1.jar * * */ publicclassAppIconDownloader{
/** *@paramargs */ publicstaticvoidmain(String[]args){
StringrootUrl="http://www.wandoujia.com/tag/全部软件/total?page="; //StringrootUrl="http://www.wandoujia.com/tag/全部游戏/total?page="; //下载1到20页的应用图标 for(inti=1;i<=20;i++){ System.out.println("【下载进度】:准备下载第"+i+"页"); StringcurrentUrl=rootUrl+i; HashMap<String,String>apps=newHashMap<string,String>(); apps=getAppImageUrl(currentUrl); //遍历HashMap逐个下载图标 for(Entry</string><string,String>entry:apps.entrySet()){ try{ //下载图标,存储到当前工程目录下的icon目录(请事先创建icon目录) download(entry.getValue(),"icon/"+entry.getKey()+".png"); }catch(Exceptione){ System.out.println("【下载出错】:"+entry.getKey()); e.printStackTrace(); } } System.out.println("【下载进度】:第"+i+"页下载完成"); }
}
/** *获取url网页里的所有应用的应用名及其图标网址 *@paramappPackageName *@return */ privatestaticHashMap</string><string,String>getAppImageUrl(Stringurl){
HashMap</string><string,String>apps=newHashMap</string><string,String>(); StringappPackageName=""; StringappImageUrl=""; StringappName="";
Stringhtml=getHtmlByUrl(url); Documentdoc=Jsoup.parse(html); Elementselements=doc.select("div.container.clearfix>section.main-col>div.app-blocks>div.app-block>ul.app-list.clearfix>li.app>a.icon-area"); ElementsnameElements=doc.select("div.container.clearfix>section.main-col>div.app-blocks>div.app-block>ul.app-list.clearfix>li.app>div.operate>a.name>span.txt"); ElementsimageEle;
inti=0; for(Elementele:elements){ //获取包名 appPackageName=ele.attr("data-pn"); //获取图标网址 imageEle=ele.select("img.icon"); appImageUrl=imageEle.get(0).attr("src").replace("68_68","256_256"); //加入apps apps.put(appPackageName,appImageUrl); //获取app名称 appName=nameElements.get(i).text(); //把app名称和包名输出到文件 write2file("【"+appName+"】"+appPackageName); i++; } System.out.println("【下载进度】:"+url+"下的图标网址已经获取成功"); returnapps; }
/** *下载文件到本地 * *@paramurlString * 被下载的文件地址 *@paramfilename * 本地文件名 *@throwsException * 各种异常 */ privatestaticvoiddownload(StringurlString,Stringfilename)throwsException{ System.out.println("【下载进度】:正在下载"+filename); //构造URL URLurl=newURL(urlString); //打开连接 URLConnectioncon=url.openConnection(); //输入流 InputStreamis=con.getInputStream(); //1K的数据缓冲 byte[]bs=newbyte[1024]; //读取到的数据长度 intlen; //输出的文件流 OutputStreamos=newFileOutputStream(filename); //开始读取 while((len=is.read(bs))!=-1){ os.write(bs,0,len); } //完毕,关闭所有链接 os.close(); is.close(); System.out.println("【下载进度】:"+filename+"下载成功"); }
/** *根据URL获得所有的html信息 *@paramurl *@returnhtml */ privatestaticStringgetHtmlByUrl(Stringurl){ Stringhtml=null; //创建httpClient对象 HttpClienthttpClient=newDefaultHttpClient(); //以get方式请求该URL HttpGethttpget=newHttpGet(url); try{ //得到responce对象 HttpResponseresponce=httpClient.execute(httpget); //返回码 intresStatu=responce.getStatusLine().getStatusCode(); //200正常 其他就不对 if(resStatu==HttpStatus.SC_OK){ //获得相应实体 HttpEntityentity=responce.getEntity(); if(entity!=null){ //获得html源代码 html=EntityUtils.toString(entity); } } }catch(Exceptione){ System.out.println("访问【"+url+"】出现异常!"); e.printStackTrace(); }finally{ httpClient.getConnectionManager().shutdown(); } returnhtml; }
privatestaticvoidwrite2file(Stringcontent){
Filefile=newFile("icon/packageName.txt"); BufferedWriterwriter=null; try{ if(!file.exists()){ file.createNewFile(); } //参数true表示将输出追加到文件内容的末尾而不覆盖原来的内容 writer=newBufferedWriter(newFileWriter(file,true)); //输出内容 writer.write(content); //换行 writer.newLine(); }catch(IOExceptione){ System.out.println("输出出错"); e.printStackTrace(); }finally{ if(writer!=null){ try{ writer.close(); }catch(IOExceptione){ e.printStackTrace(); } } } }
}