安卓案例:利用URLConnection下载网页

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓案例:利用URLConnection下载网页相关的知识,希望对你有一定的参考价值。

文章目录

一、安卓网络编程

二、运行效果

  • 输入百度网址,下载网页内容

三、涉及知识点

  1. 线性布局(LinearLayout)
  2. 标签(TextView·)
  3. 文本编辑框(EditText)
  4. 按钮(Button)
  5. 网址连接类(URLConnection)
  6. 异步任务(AsyncTask)

四、实现步骤

(一)创建安卓应用

  • 基于Empty Activity创建安卓应用 - DownloadWebPageByURLConnection

(二)准备图片素材

  • 将背景图片拷贝到mipmap-xhdpi目录

(三)主布局资源文件

  • 主布局资源文件 - main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@mipmap/background"
    android:orientation="vertical"
    android:padding="20dp">

    <EditText
        android:id="@+id/edtUrl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/input_url"
        android:lines="2"
        android:textSize="20sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:gravity="center"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btnDownload"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="20dp"
            android:onClick="doDownload"
            android:text="@string/download"
            android:textSize="20sp" />

        <Button
            android:id="@+id/btnClear"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="doClear"
            android:text="@string/clear"
            android:textSize="20sp" />
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#bbbbbb" />

    <ScrollView
        android:id="@+id/svContent"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/tvContent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#0000ff"
            android:textSize="18sp" />
    </ScrollView>
</LinearLayout>

(四)字符串资源文件

  • 字符串资源文件 - strings.xml
<resources>
    <string name="app_name">利用URLConnection下载网页</string>
    <string name="input_url">请输入网址(以http或https打头)</string>
    <string name="download">下载</string>
    <string name="clear">清空</string>
</resources>

(五)授权访问因特网

  • 在安卓项目清单文件里授权访问因特网

(六)在主界面里实现功能

  • 主界面 - MainActivity

1、声明变量,获取控件实例

  • 声明两个控件变量,然后获取控件实例

2、创建下载资源的异步任务类

  • 在MainActivity里继承AsyncTask创建DownloadTask
/**                                                                                                                  
 * 下载资源的异步任务                                                                                                         
 */                                                                                                                  
private class DownloadTask extends AsyncTask<String, Double, String>                                                
    private static final String TAG = "download_webpage";                                                            
                                                                                                                     
    // 异步任务执行前要执行的操作                                                                                                 
    @Override                                                                                                        
    protected void onPreExecute()                                                                                   
        super.onPreExecute();                                                                                        
        Log.d(TAG, "开始下载网页……");                                                                                      
                                                                                                                    
                                                                                                                     
    // 后台进行的耗时操作                                                                                                     
    @Override                                                                                                        
    protected String doInBackground(String... params)                                                               
        // 获取网址字符串                                                                                                   
        String strUrl = params[0]; // 执行异步任务时传入的第一个参数                                                                
        // 定义网页内容                                                                                                    
        String content = "";                                                                                         
        try                                                                                                         
            // 基于网址字符串创建URL对象                                                                                        
            URL url = new URL(strUrl);                                                                               
            // 获取URL连接对象                                                                                             
            URLConnection conn = url.openConnection();                                                               
            // 获取字节输入流(进水管)                                                                                          
            InputStream is = conn.getInputStream();                                                                  
            // 将字节流转换成字符输入流                                                                                          
            InputStreamReader isr = new InputStreamReader(is);                                                       
            // 将字符串输入流包装成缓冲字符输入流                                                                                     
            BufferedReader br = new BufferedReader(isr);                                                             
            // 定义文本行字符串                                                                                              
            String nextLine = "";                                                                                    
            // 定义字符串生成器                                                                                              
            StringBuilder builder = new StringBuilder();                                                             
            // 行读取整个缓冲字符输入流                                                                                          
            while ((nextLine = br.readLine()) != null)                                                              
                // 将每一行内容添加到字符串生成器                                                                                   
                builder.append(nextLine);                                                                            
                // 发布异步任务执行的进度                                                                                       
                publishProgress((double) builder.toString().length());                                               
                                                                                                                    
            // 获取网页内容                                                                                                
            content = builder.toString();                                                                            
         catch (MalformedURLException e)                                                                           
            e.printStackTrace();                                                                                     
         catch (IOException e)                                                                                     
            e.printStackTrace();                                                                                     
                                                                                                                    
        // 返回网页内容                                                                                                    
        return content;                                                                                              
                                                                                                                    
                                                                                                                     
    // 异步任务执行后要执行的操作                                                                                                 
    @Override                                                                                                        
    protected void onPostExecute(String result)                                                                     
        super.onPostExecute(result);                                                                                 
        // 判断网页读取是否成功                                                                                                
        if (!result.equals(""))                                                                                     
            // 通过标签显示网页内容                                                                                            
            tvContent.setText(result);                                                                               
         else                                                                                                      
            // 通过吐司提示用户网页读取失败                                                                                        
            Toast.makeText(MainActivity.this, "遗憾,网页读取失败!", Toast.LENGTH_LONG).show();                               
                                                                                                                    
                                                                                                                    
                                                                                                                     
    // 更新异步任务执行的进度                                                                                                   
    @Override                                                                                                        
    protected void onProgressUpdate(Double... values)                                                               
        super.onProgressUpdate(values);                                                                              
        // 在日志里输出下载进度                                                                                                
        Log.d(TAG, "已读取" + values[0] + "个字符~");                                                                      
                                                                                                                    
                                                                                                                    

3、编写下载按钮单击事件处理方法

  • 编写doDownload(View view)方法
/**                                                             
 * 下载按钮单击事件处理方法                                                 
 *                                                              
 * @param view                                                  
 */                                                             
public void doDownload(View view)                              
    // 获取网址字符串                                                  
    String strUrl = edtUrl.getText().toString().trim();         
    // 创建下载任务对象                                                 
    DownloadTask task = new DownloadTask();                     
    // 执行下载任务,传入网址作为参数                                          
    task.execute(strUrl);                                       
                                                                                                                                                      

4、编写清空按钮单击事件处理方法

  • 编写doClear(View view)方法
/**                                             
 * 清空按钮单击事件处理方法                                 
 *                                              
 * @param view                                  
 */                                             
public void doClear(View view)                 
    // 清空网址编辑框                                  
    edtUrl.setText("");                         
    // 清空网页内容标签                                 
    tvContent.setText("");                      
    // 让网址编辑框获取焦点                               
    edtUrl.requestFocus();                      
                                               

(七)运行程序,查看结果

  • 输入百度网址,下载网页内容
  • LogCat里查看日志信息

五、利用requests库爬取网页

(一)安装requests库

  • 在终端执行命令:pip install requests

(二)爬取网页

  • 编写Python程序 - 爬取网页.py
  • 请求网页,打印响应对象(200表明请求成功)
  • Response对象封装了我们请求的网页数据,如何得到网页数据呢?
  • 查看响应对象的content属性
  • 大家可以看到,网页里的汉字没有正常显示,显示的是unicode,那么该如何操作才能看到网页里的汉字呢?
  • 查看响应对象的text属性
  • 网页里的汉字显示乱码,需要处理一下,才能正常显示汉字

以上是关于安卓案例:利用URLConnection下载网页的主要内容,如果未能解决你的问题,请参考以下文章

安卓案例:利用URLConnection下载音乐

安卓案例:利用URLConnection下载图片

安卓案例:利用URLConnection下载图片

安卓案例:利用URLConnection下载音乐

安卓小案例收集二

URLConnection/案例