本周实现爬取的数据通过APP进行展示,需要用到的东西:web结构(servlet),Android,服务器,使用python爬取数据
服务器搭建我选择的是阿里云的云服务器,web和python方面之前已经学习过了,这里介绍Android上我学习的知识:HttpURLConnection
1 package com.example.yiqing; 2 3 import androidx.appcompat.app.AppCompatActivity; 4 5 import android.content.Intent; 6 import android.os.Bundle; 7 import android.os.Handler; 8 import android.os.Message; 9 import android.text.method.ScrollingMovementMethod; 10 import android.view.View; 11 import android.widget.Button; 12 import android.widget.TextView; 13 14 import org.json.JSONArray; 15 import org.json.JSONObject; 16 17 import java.io.BufferedReader; 18 import java.io.DataOutputStream; 19 import java.io.IOException; 20 import java.io.InputStreamReader; 21 import java.io.OutputStream; 22 import java.net.HttpURLConnection; 23 import java.net.URL; 24 import java.net.URLEncoder; 25 26 public class Watch extends AppCompatActivity { 27 private TextView show; 28 private Button see; 29 30 //利用Handler实现更改页面 31 private Handler handler=new Handler(){ 32 public void handleMessage(android.os.Message msg){ 33 Bundle bundle=new Bundle(); 34 bundle=msg.getData(); 35 String ans=bundle.getString("result"); 36 if(ans!=null){ 37 show.setText(ans); 38 } 39 } 40 }; 41 @Override 42 protected void onCreate(Bundle savedInstanceState) { 43 super.onCreate(savedInstanceState); 44 setContentView(R.layout.activity_watch); 45 show=(TextView)findViewById(R.id.show); 46 show.setMovementMethod(ScrollingMovementMethod.getInstance()); 47 see=(Button)findViewById(R.id.see); 48 49 see.setOnClickListener(new View.OnClickListener(){ 50 @Override 51 public void onClick(View view){ 52 //写下要访问的servlet路径 53 final String path="http://47.98.228.220:8080/PaQu/ChartServlet"; 54 //使用HttpURLConnection需要子线程 55 new Thread(new Runnable() { 56 @Override 57 public void run() { 58 Intent intentdata=getIntent(); 59 //从上一个页面拿到输入的日期数据 60 String date=intentdata.getStringExtra("date"); 61 String msg=""; 62 HttpURLConnection conn=null; 63 try{ 64 URL url=new URL(path); 65 conn=(HttpURLConnection)url.openConnection(); 66 //设置post格式,这里格式要跟servlet里一致 67 conn.setRequestMethod("POST"); 68 //设置超时时间 69 conn.setConnectTimeout(5000); 70 conn.setReadTimeout(5000); 71 //post格式不能用缓存 72 conn.setUseCaches(false); 73 conn.setDoInput(true); 74 String data="date="+date; 75 //将传给servlet的数据写入传输 76 OutputStream out=conn.getOutputStream(); 77 //这里注意要更改传输数据的格式,getBytes() 78 out.write(data.getBytes()); 79 out.flush(); 80 out.close(); 81 conn.connect(); 82 83 //这里开始接收从servlet里传回来的数据 84 BufferedReader reader=new BufferedReader(new InputStreamReader(conn.getInputStream())); 85 String line=null; 86 //传回来的是一个JSONArray类型的数据,需要对其进行解析 87 if((line=reader.readLine())!=null){ 88 //开始解析 89 JSONArray jsonArray=new JSONArray(line); 90 for(int i=0;i<jsonArray.length();i++){ 91 JSONObject jsonObject=jsonArray.getJSONObject(i); 92 String province=jsonObject.getString("Province"); 93 String confirmed=jsonObject.getString("Confirmed"); 94 String cured=jsonObject.getString("Cured"); 95 String dead=jsonObject.getString("Dead"); 96 msg=msg+"省份:"+province+" 确诊:"+confirmed+" 治愈:"+cured+" 死亡:"+dead+" "; 97 } 98 } 99 //将信息使用bundle封装,传给handler 100 Bundle bundle=new Bundle(); 101 bundle.putString("result",msg); 102 Message msg1=new Message(); 103 msg1.setData(bundle); 104 handler.sendMessage(msg1); 105 conn.disconnect(); 106 }catch(Exception e){ 107 e.printStackTrace(); 108 } 109 } 110 }).start(); 111 } 112 }); 113 } 114 115 }
HttpURLConnection能够连接到servlet,需要先给Android设置网络连接权限。爬取到数据是Servlet回传的数据,这里可以看到我servlet回调的是json数据。最后就是更改页面控件显示。因为主线程上不允许调用页面更改,因此需要handle另起线程实现。