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

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<String, String> apps = new HashMap<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(Exception e) {
     System.out.println("【下载出错】:" + entry.getKey());
     e.printStackTrace();
    }
   }
   System.out.println("【下载进度】:第" + i + "页下载完成");
  }

}

/**
  * 获取url网页里的所有应用的应用名及其图标网址
  * @param appPackageName
  * @return
  */
 private static HashMap</string><string , String> getAppImageUrl(String url) {

HashMap</string><string , String> apps = new HashMap</string><string , String>();
  String appPackageName = "";
  String appImageUrl = "";
  String appName = "";

String html = getHtmlByUrl(url);
  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(urlString);
     // 打开连接
     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(String url){ 
     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();
    }
   }
  }
 }

}

(0)

相关推荐

  • 解析Android获取系统cpu信息,内存,版本,电量等信息的方法详解

    Android获取系统cpu信息,内存,版本,电量等信息 1.CPU频率,CPU信息:/proc/cpuinfo和/proc/stat 通过读取文件/proc/cpuinfo系统CPU的类型等多种信息.读取/proc/stat 所有CPU活动的信息来计算CPU使用率 下面我们就来讲讲如何通过代码来获取CPU频率: 复制代码 代码如下: package com.orange.cpu; import java.io.BufferedReader;import java.io.FileNotFound

  • Android获取手机的版本号等信息的代码

    本文实例分享了Android获取手机系统版本等信息的方法,供大家参考,具体内容如下: 第一种代码: String phoneInfo = "Product: " + android.os.Build.PRODUCT; phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI; phoneInfo += ", TAGS: " + android.os.Build.TAGS; phoneInfo +=

  • Android判断包名和类名是否存在的方法

    1.对包名的判断,异常则说明不存在: 复制代码 代码如下: try { PackageManager pm = getPackageManager(); pm.getPackageInfo("com.org", PackageManager.GET_ACTIVITIES); } catch (NameNotFoundException e) {     // TODO Auto-generated catch block     e.printStackTrace(); } 2.对类名

  • Android获取手机系统版本等信息的方法

    本文实例讲述了Android获取手机系统版本等信息的方法.分享给大家供大家参考.具体如下: String phoneInfo = "Product: " + android.os.Build.PRODUCT; phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI; phoneInfo += ", TAGS: " + android.os.Build.TAGS; phoneInfo += &qu

  • Android获取手机型号/系统版本号/App版本号等信息实例讲解

    MainActivity如下: 复制代码 代码如下: package cn.testgethandsetinfo; import android.os.Bundle; import android.text.TextUtils; import android.widget.TextView; import android.app.Activity; import android.content.Context; import android.content.pm.PackageInfo; imp

  • Android编程获取包名,版本信息及VersionName名称的方法

    本文实例讲述了Android编程获取包名,版本信息及VersionName名称的方法.分享给大家供大家参考,具体如下: 话不多说,直接上代码,此处,主要是在版本升级的时候,使用较多. private String getAppInfo() { try { String pkName = this.getPackageName(); String versionName = this.getPackageManager().getPackageInfo( pkName, 0).versionNam

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

    Android主题开发者做的主题,如果想代替第三方应用图标,就必须要知道应用的包名.其实想知道应用的包名很简单,直接在浏览器打开Google Play或豌豆荚,打开某应用的页面,看网址你就会发现,网址最后"/"字符后接的就是应用的包名! 估计有人想把常用应用的图标和包名都搞下来,所以用java写了个小程序,批量抓取了豌豆荚上"全部软件"按总下载量排名里1到20页的应用图标与包名. 所有图标都用包名来命名的,里面还有一个packageName.txt文件,包含了应用名

  • Android开发实现根据包名判断App运行状态的方法

    本文实例讲述了Android开发实现根据包名判断App运行状态的方法.分享给大家供大家参考,具体如下: 前面讲过Android开发判断一个app应用是否在运行的方法,这里实现获取指定包名的 APP 是否还在后台运行,判断 APP 是否存活. 背景 可以根据 App 是否有 Service 分两类情况处理: ① 没有 Service ② 有 Service 对于没有 Service 的 App,程序一旦切换到后台,可能很快就被回收了,这里使用 ActivityManager.getRunningT

  • Android Studio 修改应用包名实例详解

    Android Studio 修改应用包名实例详解 我们平时新建项目有些朋友可能当时就是随意写的一个包名,然后在项目过程中, 又感觉这个包名不太好,所以就要对包名进行修改,根据我们正常的修改方式,是这样的. 在种情况是只能修改最外层的那个名称, 如果我们现在是需要修改中间的某一个,这里就行不通了. 那么我们来看一下如何修改成你最终要的包名. 操作图如下: 看到没有,我们只需要在setting里面,把 compact empty middle packages 这个选项去掉,这样,我们的包的层次结

  • Android获取、更改包名的小技巧分享(超实用)

    前言 小菜因为工作需要,经常需要一套代码修改很多次包名,虽然不是什么技术活,但是小菜的用的次数多了就有了一点点小技巧分享给大家,下面话不多说了,来一起看看详细的介绍吧. 方法如下: 1. 如果源码是在本机电脑中,首先找到源码多位置,例如:由包名 com.aaa.bbb 修改为包名 com.ccc.ddd,可以直接重命名,本地修改: 2. AndroidStudio 打开本项目: 3. 删除 .gradle: 4. 把 build.gradle 中 appicationId 替换为新的包名: 5.

  • Android修改jar文件包名的方法分享

    前言 jar 包我们会非常高频率的使用,尤其是用一些其他三方库的时候,往往把 java 代码打包成 jar 文件,方便项目依赖使用. 带来的问题是, 多个jar包容易出现包名冲突. 这时候我们修改 jar 文件的包名是一个比较快速有效的解决办法. 举两个例子,是笔者亲身经历的两个情况. Gson库:这个相信很多人都在使用,但是直接导入 gson 的 jar 包,在 HTC Desire HD 这款手机上会抛出异常(TypeNotFoundException) Jackson库:这也是个 json

  • Android编程实现应用获取包名、版本号、权限等信息的方法

    本文实例讲述了Android编程实现应用获取包名.版本号.权限等信息的方法.分享给大家供大家参考,具体如下: /** * 获取当前应用程序的包名 * @param context 上下文对象 * @return 返回包名 */ public static String getAppProcessName(Context context) { //当前应用pid int pid = android.os.Process.myPid(); //任务管理类 ActivityManager manage

  • Android applicationId和包名的区别总结

    应用ID与包名区别 每个Android应用都有一个唯一的应用ID.在Android设备和市场上,这个ID是你应用的唯一标识.若想在市场上更新应用,新应用的ID必须和原来apk的应用ID一致.所以一旦发布了应用,就不能再改变应用ID. 在Eclipse中没有applicationId这个概念,在Eclipse中applicationId即等同于包名.但是到了Android Studio中,这两个概念做个区分.包名的定义在清单文件中: <manifest xmlns:android="http

  • 详细Java批量获取微信公众号方法

    最近需要爬取微信公众号的文章信息.在网上找了找发现微信公众号爬取的难点在于公众号文章链接在pc端是打不开的,要用微信的自带浏览器(拿到微信客户端补充的参数,才可以在其它平台打开),这就给爬虫程序造成很大困扰.后来在知乎上看到了一位大牛用php写的微信公众号爬取程序,就直接按大佬的思路整了整搞成java的了.改造途中遇到蛮多细节问题,拿出来分享一下. 系统的基本思路是在安卓模拟器上运行微信,模拟器设置代理,通过代理服务器拦截微信数据,将得到的数据发送给自己的程序进行处理. 需要准备的环境:node

  • Android 改变图标原有颜色和搜索框的实例代码

    图标改变颜色:Drawable的变色,让Android也能有iOS那么方便的图片色调转换,就像同一个图标,但是有多个地方使用,并且颜色不一样,就可以用这个方法了. 搜索框: 一般是EditText实现,本文 实现 TextView图片和文字居中,键盘搜索. 来看看效果图: 图标改变颜色:第一个界面的左边(二维码)和右边(更多)两个实现,我放进去的图片是黑色的,显示出来是白色的. 搜索框:第一个界面的图片和文字居中,还可以设置间距,第二个见面搜索设置键盘搜索按钮,点击搜索监听事件,清除内容的图标.

  • Java 批量文件压缩导出并下载到本地示例代码

    主要用的是org.apache.tools.zip.ZipOutputStream  这个zip流,这里以Execl为例子. 思路首先把zip流写入到http响应输出流中,再把excel的流写入zip流中(这里可以不用生成文件再打包,只需把execl模板读出写好数据输出到zip流中,并为每次的流设置文件名) 例如:在项目webapp下execl文件中 存在1.xls,2.xls,3.xls文件 1.Controller @RequestMapping(value = "/exportAll&qu

随机推荐