当前位置:  编程技术>java/j2ee

java批量采集豌豆荚网站Android应用图标和包名

    来源: 互联网  发布时间:2014-11-06

    本文导语:  Android主题开发者做的主题,如果想代替第三方应用图标,就必须要知道应用的包名。其实想知道应用的包名很简单,直接在浏览器打开Google Play或豌豆荚,打开某应用的页面,看网址你就会发现,网址最后“/”字符后接的就是...

Android主题开发者做的主题,如果想代替第三方应用图标,就必须要知道应用的包名。其实想知道应用的包名很简单,直接在浏览器打开Google Play或豌豆荚,打开某应用的页面,看网址你就会发现,网址最后“/”字符后接的就是应用的包名!

估计有人想把常用应用的图标和包名都搞下来,所以用java写了个小程序,批量抓取了豌豆荚上“全部软件”按总下载量排名里1到20页的应用图标与包名。

所有图标都用包名来命名的,里面还有一个packageName.txt文件,包含了应用名称对应的包名,方便查找。

java源码

分享这个java小程序,注意,如果豌豆荚的网页结构变了(估计很少改变吧),这个小程序就需要修改一下了,如果看得懂的话,修改很简单的咯。

以下代码可能已失效,仅作参考!

代码如下:

package im.garth.AppIconDownloader;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map.Entry;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.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
 *
 *
 */
public class AppIconDownloader {

 /**
  * @param args
  */
 public static void main(String[] args) {

  String rootUrl = "http://www.wandoujia.com/tag/全部软件/total?page=";
  //String rootUrl = "http://www.wandoujia.com/tag/全部游戏/total?page=";
  //下载1到20页的应用图标
  for(int i = 1; i < = 20; i++) {
   System.out.println("【下载进度】:准备下载第" + i + "页");
   String currentUrl = rootUrl + i;
   HashMap apps = new HashMap();
   apps = getAppImageUrl(/tech-java/currentUrl/index.html);
   //遍历HashMap逐个下载图标
   for(Entry entry : apps.entrySet()) {
    try{
     //下载图标,存储到当前工程目录下的icon目录(请事先创建icon目录)
     download(entry.getValue(), "icon/" + entry.getKey() + ".png");
    }catch(Exception e) {
     System.out.println("【下载出错】:" + entry.getKey());
     e.printStackTrace();
    }
   }
   System.out.println("【下载进度】:第" + i + "页下载完成");
  }

 }

 /**
  * 获取url网页里的所有应用的应用名及其图标网址
  * @param appPackageName
  * @return
  */
 private static HashMap getAppImageUrl(/tech-java/String url/index.html) {

  HashMap apps = new HashMap();
  String appPackageName = "";
  String appImageUrl = "";
  String appName = "";

  String html = getHtmlByUrl(/tech-java/url/index.html);
  Document doc = Jsoup.parse(html);
     Elements elements = doc.select("div.container.clearfix>section.main-col>div.app-blocks>div.app-block>ul.app-list.clearfix>li.app>a.icon-area"); 
     Elements nameElements = 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"); 
     Elements imageEle;

     int i = 0;
     for(Element ele : 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 + "下的图标网址已经获取成功");
  return apps;
 }

 /**
    * 下载文件到本地
    *
    * @param urlString
    *          被下载的文件地址
    * @param filename
    *          本地文件名
    * @throws Exception
    *           各种异常
    */
 private static void download(String urlString, String filename) throws Exception {
  System.out.println("【下载进度】:正在下载" + filename);
     // 构造URL
     URL url = new URL(/tech-java/urlString/index.html);
     // 打开连接
     URLConnection con = url.openConnection();
     // 输入流
     InputStream is = con.getInputStream();
     // 1K的数据缓冲
     byte[] bs = new byte[1024];
     // 读取到的数据长度
     int len;
     // 输出的文件流
     OutputStream os = new FileOutputStream(filename);
     // 开始读取
     while ((len = is.read(bs)) != -1) {
       os.write(bs, 0, len);
     }
     // 完毕,关闭所有链接
     os.close();
     is.close();
     System.out.println("【下载进度】:" + filename + "下载成功");
 }  

 /**
  * 根据URL获得所有的html信息
  * @param url
  * @return html
  */ 
 private static String getHtmlByUrl(/tech-java/String url/index.html){ 
     String html = null; 
     //创建httpClient对象
     HttpClient httpClient = new DefaultHttpClient(); 
     //以get方式请求该URL
     HttpGet httpget = new HttpGet(url); 
     try { 
         //得到responce对象
         HttpResponse responce = httpClient.execute(httpget);
         //返回码
         int resStatu = responce.getStatusLine().getStatusCode(); 
         //200正常  其他就不对 
         if (resStatu==HttpStatus.SC_OK) {
             //获得相应实体 
             HttpEntity entity = responce.getEntity(); 
             if (entity!=null) { 
                 //获得html源代码
                 html = EntityUtils.toString(entity); 
             } 
         } 
     } catch (Exception e) { 
         System.out.println("访问【"+url+"】出现异常!"); 
         e.printStackTrace(); 
     } finally { 
         httpClient.getConnectionManager().shutdown(); 
     } 
     return html; 
 }

 private static void write2file(String content) {

  File file = new File("icon/packageName.txt");
  BufferedWriter writer = null;
  try{
   if(!file.exists()) {
    file.createNewFile();
   }
   //参数true表示将输出追加到文件内容的末尾而不覆盖原来的内容
   writer = new BufferedWriter(new FileWriter(file, true));
   //输出内容
   writer.write(content);
   //换行
   writer.newLine();
  } catch(IOException e){
   System.out.println("输出出错");
   e.printStackTrace();
  } finally {
   if( writer != null) {
    try {
     writer.close();
    } catch(IOException e) {
     e.printStackTrace();
    }
   }
  }
 }

}


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java根据扩展名获取系统图标和文件图标示例
  • 请问如何换掉java程序窗口的图标
  • Java图标
  • 如何去掉java 程序窗体的“咖啡杯”的图标??
  • 请问应该如何更改java应用程序的图标?
  • JAVA能写个程序一般的window程序在任务栏挂一个图标么?
  • ###做程序需要用到java duke的图标,知道哪里有下载吗(除了JDK里带的)
  • android 如何在 主菜单 来一键点图标, 播放视频(产品广告),只要驱动部分的JAVA层我不写
  • 如何把JAVA应用程序窗口上的咖啡杯图标换掉?(记得有人提过这个问题的,但是找不到了)
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3