当前位置: 移动技术网 > IT编程>开发语言>Java > java批量采集豌豆荚网站Android应用图标和包名

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

捕鱼机干扰器,麦当劳改名字,圣斗士星矢ol贵鬼词典

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();
    }
   }
  }
 }

}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网