Android MaoZhuaWeiBo开发Service抓取个人信息-2

前面把主要的东西讲完了,之后就是数据的获取和解析显示出来了,那接下来我们就负责抓取数据的这块吧,首先我们需要

在清单文件里加载服务和活动

添加:、

 <activity android:name="com.neweriweibo.activity.OAuthActivity"/>
        <activity android:name=".MainActivity"/>
        <activity android:name="com.neweriweibo.activity.SendMessageActivity"/>

        <!-- 获取自己微博信息 -->
        <service android:name="com.neweriweibo.service.UserService"/>

        <!-- 获取所有微博的信息 -->
        <service android:name="com.neweriweibo.service.WeiBoService"/>

下面看看用户个人信息的抓取:

package com.neweriweibo.service;
/**
 * 个人信息数据抓取、
 * @author Engineer-Jsp
 * @date 2014.10.28
 * */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import org.json.JSONArray;
import org.json.JSONObject;

import com.neweriweibo.model.User;
import com.neweriweibo.utils.TencentAPI;

import android.app.IntentService;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.util.Log;
public class UserService extends IntentService {

	public final static String UPDATA = "com.neweriweibo.service.UPDATA";
	public final static String NOW_WEATHER = "UserWeiBo" ;
	private StringBuffer _buff;
	private File weibousercurrentFile;
	private BufferedWriter write;
	private BufferedWriter writefour;
	private static BufferedReader reader ;
	private String access_token;
	private String openid;
	private String openkey;

	public UserService(){
		super("WeatherService") ;
	}
	@Override
	public void onCreate() {

		super.onCreate();
		weibousercurrentFile = new File(Environment.getExternalStorageDirectory(), "weiinfo");
		if (!weibousercurrentFile.exists()) {
			try {
				weibousercurrentFile.createNewFile();// 创建
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		access_token = PreferenceManager.getDefaultSharedPreferences(this).getString("access_token", "access_token");
		openid = PreferenceManager.getDefaultSharedPreferences(this).getString("openid", "openid");
		openkey = PreferenceManager.getDefaultSharedPreferences(this).getString("openkey", "openkey");

	}

	@Override
	public void onDestroy() {

		super.onDestroy();

	}

	/**
	 * https://open.t.qq.com/api/user/info
	 * ?oauth_consumer_key=801506473
	 * &access_token=789a7d5284d0c3e608f8e384c993d04b
	 * &openid=0027BC08DB5B45D7461E9A0F16F527E7
	 * &clientip=CLIENTIP&oauth_version=2.a&scope=all
	 */

	@Override
	protected void onHandleIntent(Intent intent) {
		// oauth_consumer_key=801506545&access_token=c63ed52ee874eff6e61dfe66d2c7b396&openid=0027BC08DB5B45D7461E9A0F16F527E7&clientip=CLIENTIP&oauth_version=2.a&scope=all
        // oauth_consumer_key=xx&access_token=xx&openid=xx&clientip=xx&oauth_version=2.a&scope=xx
		User weibouser = new User();
		StringBuffer buff = new StringBuffer(TencentAPI.userInfo) ;
		buff.append("?").append("oauth_consumer_key="+TencentAPI.client_id )
		.append("&access_token="+access_token)
		.append("&openid="+openid)
		.append("&clientip=CLIENTIP&oauth_version=2.a&scope=all") ;

		Log.i("获取当前登录账户个人信息的请求地址:", buff.toString()+"") ;   

		try {
			URL _url = new URL(buff.toString());
			HttpURLConnection conn = (HttpURLConnection) _url.openConnection();
			conn.setConnectTimeout(8000);
			conn.setReadTimeout(8000);
			conn.setDoOutput(false);
			conn.setRequestMethod("GET");

			if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
				InputStream in = conn.getInputStream();
				InputStreamReader reader = new InputStreamReader(in, "utf-8");
				BufferedReader buffere = new BufferedReader(reader);
				StringBuilder builder = new StringBuilder();
				String line = null;
				while (null != (line = buffere.readLine())) {
					builder.append(line);
				}

				String json = builder.toString();

				Log.i("获取当前登录账户个人信息的数据:",  json.toString()+"\n") ;
				// 解析数据

				 JSONObject  root = new JSONObject(json).getJSONObject("data") ;
				 JSONArray tweetinfo = root.getJSONArray("tweetinfo");
				 Log.d("用户最近的一条原创微博:", tweetinfo.toString());
				 JSONObject zero = tweetinfo.getJSONObject(0);
				 String nearinfo = zero.getString("text");
				 Log.d("原创微博信息:", nearinfo.toString());
				 String  nick = root.getString("nick") ;
				 String  idolnum = root.getString("idolnum") ;
				 String  location = root.getString("location") ;
				 String  brithyear = root.getString("birth_year") ;
				 String  brithmonth = root.getString("birth_month") ;
				 String  brithday = root.getString("birth_day") ;
				 String  introduction = root.getString("introduction") ;
				 String  headimg = root.getString("head")+"/40";
				 String  fansnum = root.getString("fansnum");
                 String  tweetnum = root.getString("tweetnum");
                 String  sex = root.getString("sex");
                 Log.d("sex内容测试,刚取得:", sex);
                 if(sex.equals("1")){
                	 sex = "男";
                 }else if(sex.equals("2")){
                	 sex = "女";
                 }else{
                	 sex = "";
                 }
                Log.d("sex内容测试,判断后:", sex);
                write = new BufferedWriter(new FileWriter(weibousercurrentFile));
				write.write(nick + "*" + idolnum + "*" + location+ "*" + brithyear+"/"+brithmonth+"/"+brithday+"*"+introduction+"*"+headimg+"*"+fansnum+"*"+tweetnum+"*"+sex+"*"+nearinfo);
				write.close();

				weibouser.setNick(nick) ;
				weibouser.setIdonum(idolnum);
				weibouser.setLoacation(location) ;
				weibouser.setBirthyeaer(brithyear);
				weibouser.setBirthmonth(brithmonth);
				weibouser.setBirthday(brithday) ;
				weibouser.setHeadimg(headimg);
				weibouser.setInfo(introduction) ;
				weibouser.setFansnum(fansnum);
				weibouser.setTweetnum(tweetnum);
				weibouser.setSex(sex);
				weibouser.setNearinfo(nearinfo);
				conn.disconnect();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		    Intent _intent = new Intent(UPDATA);
			Bundle mBundle = new Bundle();
			mBundle.putParcelable(UserService.NOW_WEATHER, weibouser);
			_intent.putExtras(mBundle);

			sendBroadcast(_intent) ;

	}

}

常规的网络请求抓取数据,将解析到的数据存在User对象里,并且在本地用BuffereWriter保存了一份,方便下登录,且考虑在没有网络的情况下或者数据抓取失败的情况下不至于界面因没有数据而显得空洞,不美观

将获取的数据意图发送至应用程序,其他活动接收,并获取数据,显示在界面

User:

package com.neweriweibo.model;
/**
 * 用户信息对象
 * @author Engineer-Jsp
 * @date 2014.10.28
 * */
import android.os.Parcel;
import android.os.Parcelable;

public class User  implements Parcelable{

	private String nick ;// 昵称
	private String info ;// 自我介绍
	private String loacation ;// 所在地
	private String idonum ;  //关注的人数

	private String birthyeaer ;// 生日年
	private String birthmonth ;// 生日月
	private String birthday ;// 生日天
	private String headimg;// 头像

	private String fansnum;// 被关注数
	private String tweetnum; // 发表的微博数
	private String sex; // 性别
    private String nearinfo; //用户最近的一条原创微博
	public String getNearinfo() {
		return nearinfo;
	}
	public void setNearinfo(String nearinfo) {
		this.nearinfo = nearinfo;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getFansnum() {
		return fansnum;
	}
	public void setFansnum(String fansnum) {
		this.fansnum = fansnum;
	}
	public String getTweetnum() {
		return tweetnum;
	}
	public void setTweetnum(String tweetnum) {
		this.tweetnum = tweetnum;
	}

	public String getHeadimg() {
		return headimg;
	}
	public void setHeadimg(String headimg) {
		this.headimg = headimg;
	}
	public String getNick() {
		return nick;
	}
	public void setNick(String nick) {
		this.nick = nick;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	public String getLoacation() {
		return loacation;
	}
	public void setLoacation(String loacation) {
		this.loacation = loacation;
	}
	public String getIdonum() {
		return idonum;
	}
	public void setIdonum(String idonum) {
		this.idonum = idonum;
	}
	public String getBirthyeaer() {
		return birthyeaer;
	}
	public void setBirthyeaer(String birthyeaer) {
		this.birthyeaer = birthyeaer;
	}
	public String getBirthmonth() {
		return birthmonth;
	}
	public void setBirthmonth(String birthmonth) {
		this.birthmonth = birthmonth;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	public User(String nick, String info, String loacation, String idonum,
			String birthyeaer, String birthmonth, String birthday,String headimg,
			String fansnum , String tweetnum,String sex,String nearinfo) {
		super();
		this.nick = nick;
		this.info = info;
		this.loacation = loacation;
		this.idonum = idonum;
		this.birthyeaer = birthyeaer;
		this.birthmonth = birthmonth;
		this.birthday = birthday;
		this.headimg = headimg;
		this.fansnum = fansnum;
		this.tweetnum = tweetnum;
		this.sex = sex;
		this.nearinfo = nearinfo;
	}
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "User [昵称=" + nick + ", 自我介绍=" + info + ", 城市="
				+ loacation + ", 关注数=" + idonum + ", 年="
				+ birthyeaer + ", 月=" + birthmonth + ", 日="
				+ birthday + ",头像地址="+headimg+",听众="+fansnum+",发表微博数="+tweetnum+",性别="+sex+
				",最近动态="+nearinfo+"]";
	}

	public static final Parcelable.Creator<User> CREATOR = new Creator<User>() {

		@Override
		public User createFromParcel(Parcel source) {
			// TODO Auto-generated method stub
			User user = new User() ;

			user.nick = source.readString() ;
			user.info = source.readString() ;
			user.loacation = source.readString() ;
			user.idonum = source.readString() ;
			user.birthyeaer = source.readString() ;
			user.birthmonth = source.readString() ;
			user.birthday = source.readString() ;
			user.headimg = source.readString();
			user.fansnum = source.readString();
			user.tweetnum = source.readString();
			user.sex = source.readString();
			user.nearinfo = source.readString();
			return user;
		}

		@Override
		public User[] newArray(int size) {
			// TODO Auto-generated method stub
			return new User[size];
		}
	};

	@Override
	public int describeContents() {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		// TODO Auto-generated method stub
		dest.writeString(nick);
		dest.writeString(info);
		dest.writeString(loacation);
		dest.writeString(idonum);
		dest.writeString(birthyeaer);
		dest.writeString(birthmonth);
		dest.writeString(birthday);
		dest.writeString(headimg);
		dest.writeString(fansnum);
		dest.writeString(tweetnum);
		dest.writeString(sex);
		dest.writeString(nearinfo);
	}

}

UserService extends IntentService 重写onHandleIntent(Intent intent) ,其实就相当于开启了一个子线程,来对网络请求进行处理,IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker
thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作

时间: 2024-11-08 01:23:03

Android MaoZhuaWeiBo开发Service抓取个人信息-2的相关文章

SpringCloud系列九:SpringCloudConfig 基础配置(SpringCloudConfig 的基本概念、配置 SpringCloudConfig 服务端、抓取配置文件信息、客户端使用 SpringCloudConfig 进行配置、单仓库目录匹配、应用仓库自动选择、仓库匹配模式)

1.概念:SpringCloudConfig 基础配置 2.具体内容 通过名词就可以发现,SpringCloudConfig 核心作用一定就在于进行配置文件的管理上.也就是说为了更好的进行所有微服务的配置项的管理,在 SpringCloud 设计架构里面就考虑到了针对于所有的核心配置文件(application.yml)进行的一项统一管理的工具. 2.1.SpringCloudConfig 的基本概念 现在可以思考一个问题:在一个实际的项目开发过程之中,有可能会出现有上百个微服务(创建微服务的标

PHP curl模拟浏览器抓取网站信息

curl是一个利用URL语法在命令行方式下工作的文件传输工具. 官方解释 curl是一个利用URL语法在命令行方式下工作的文件传输工具.curl是一个利用URL语法在命令行方式下工作的文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP.curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies,

网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码

这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. 要想得到书籍的详细信息和ISBN码,我们需要遍历所有的页码,进入到书籍列表,然后从书籍列表进入到每本书的详情页里,这样就能够抓取详情信息和ISBN码了. 二.从分页里遍历每一页书籍列表 通过查看分页功能的HTML代码,通过class="current"可以定位当前页码所在span标签,此s

网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格

通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码) 接下来将通过ISBN码去amazon.com获取每本书对应的价格. 一.了解需要和分析网站 通过分析amazon.com得知,以ISBN码作为搜索关键字可查找到对应的书. 结果页码就有这本书的价格,既然价格是以$符号开头,那就可以通过正则表达式得到价格. 通过正则表达式匹配价格代码:

Web Scraper 高级用法——抓取属性信息 | 简易数据分析 16

这是简易数据分析系列的第 16 篇文章. 这期课程我们讲一个用的较少的 Web Scraper 功能--抓取属性信息. 网页在展示信息的时候,除了我们看到的内容,其实还有很多隐藏的信息.我们拿豆瓣电影250举个例子: 电影图片正常显示的时候是这个样子: 如果网络异常,图片加载失败,就会显示图片的默认文案,这个文案其实就是这个图片的属性信息: 我们查看一下这个结构的 HTML(查看方法可见 CSS 选择器的使用的第一节内容),就会发现图片的默认文案其实就是这个 <img/> 标签的 alt 属性

安卓开发之抓取新闻案例

一.概述 这是一个通过HttpClient抓取网页新闻的demo.涉及知识点:通过HttpClient从网络获取新闻(组织成XML格式的),pull解析XML,Android下ListView的使用及优化,将XML资源文件转成视图view显示,安卓下的简单布局,Android消息处理机制.这里使用到的网页新闻是用tomcat下的一个WEB应用中的new.xml来模拟的,虚拟机访问本机可通过如下链接:http://10.0.2.2:8080/应用名称/new.xml . 二.步骤 下面说一下思路:

iOS开发之抓取花瓣网json数据

最近在研究iPhone流水布局的实现,首先得有数据,所以我就随便在网上抓一些数据来实现.网上有很多网站是用瀑布流,比如蘑菇街,花瓣网,美丽说等等,今天就以花瓣网为例子,尝试去抓取里面我们想要的数据. 本来是我是想用objective-c的一个HTML开源框架hpple去解析花瓣网返回的html数据,提取里面我们想要的节点,但是我尝试了一下,实现不了,也听网上说这个框架不是很完善.所以我干脆用工具来实现了,网上有很多这样的工具,现在我先一个叫charles的http代理监听工具,它能够监听我们ht

使用jsoup抓取新闻信息

1,jsoup简介 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据.jsoup 是基于 MIT 协议发布的,可放心使用于商业项目. jsoup 的主要功能如下: 1. 从一个 URL,文件或字符串中解析 HTML: 2. 使用 DOM 或 CSS 选择器来查找.取出数据: 3. 可操作 HTML 元素.属性.文本: 2,jsoup使用 1,下载jsoup的

抓取网页信息

winform的form.cs 1 using HtmlAgilityPack; 2 using System; 3 using System.Windows.Forms; 4 using Hqew.DMSFrame.Entity.ExpressionClips; 5 using System.Collections.Generic; 6 using Hqew.DMSFrame.Exception; 7 using System.Threading; 8 9 namespace PageGath