抓取网页数据并解析Android

时间:2022-10-31 08:18:32
 

抓取网页数据并解析

标签: 网页抓取jsoupAndroid 1262人阅读 评论(1) 收藏 举报 抓取网页数据并解析Android 分类: 

目录(?)[+]

这天遇到这样一个需求:这种页面数据可以抓取吗?

抓取网页数据并解析Android


随后提供了账号、密码和网站地址:

帐号:kytj1    

密码:******************    

登陆地址:http://student.tiaoji.kaoyan.com/tjadm


主要思路:

1、使用Fiddler4分析http请求交互方式,包括数据发送方式(POST或GET),携带参数等,获得返回的数据信息

2、用Android程序模拟HTTP请求

3、用Java解析HTML代码,提取出对应的姓名、报考学校、报考专业、分数、联系电话、发布时间等字段

4、把txt文件导入到Excel里,待进一步处理。


用Fiddle查看数据包


1、打开Fiddler

抓取网页数据并解析Android

2、打开网站,填入用户名和密码,点击登录

登陆地址:http://student.tiaoji.kaoyan.com/tjadm

抓取网页数据并解析Android

3、观察Filldder抓到的包

可以看到HOST、URL、POST方式以及明文密码

抓取网页数据并解析Android

抓取网页数据并解析Android

4、观察网页数据

登录成功后,网页数据显示为

抓取网页数据并解析Android

   对应的Filldder抓包数据为抓取网页数据并解析Android


可以看到请求的HOST以及URL,方式为GET,返回的数据也可以在body体中获取到。

5、HTML代码

返回的HTML页面代码为(选取了部分)

[html] view plain copy 抓取网页数据并解析Android抓取网页数据并解析Android
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=3.0,user-scalable=no ">  
  6. <title>考研调剂中心_考研调剂意向发布系统_考研调剂_考研网(kaoyan.com)</title>  
  7. <meta name="description" content="" />  
  8. <link rel="stylesheet" type="text/css" href="http://img.kaoyan.com/tiaoji/css/tiaoji-h5.css" />  
  9. <link href="http://img.kaoyan.com/global/style/header.css" rel="stylesheet">  
  10. <link href="http://img.kaoyan.com/yz/style/yz.index.css" rel="stylesheet">  
  11. <script type='text/javascript' src='http://cbjs.baidu.com/js/m.js'></script>  
  12. </head>  
  13. <body>  
  14. <div class="kyHd">  
  15.     <div class="kyTop">  
  16.         <script src="http://img.kaoyan.com/www/header-tiaoji.js" type="text/javascript"></script>  
  17.         <script src="http://img.kaoyan.com/www/headera.js" type="text/javascript"></script>  
  18.     </div>  
  19. </div>  
  20. <div style="height:10px;"></div>  
  21. <div class="w1000ad tc">  
  22.     <script type="text/javascript">/*考研网-大通栏-通用*/var cpro_id = "u1773335";</script>  
  23.     <script src="http://cpro.baidustatic.com/cpro/ui/c.js" type="text/javascript"></script>  
  24. </div>  
  25. <ul class="nav" id="tjNav">  
  26.     <li><a href="http://tiaoji.kaoyan.com/" title="考研调剂首页">调剂首页</a></li>  
  27.     <li><a href="http://www.kaoyan.com/kaoyan/27/474572/" title="考研调剂流程" target="_blank">调剂流程</a></li>  
  28.     <li><a href="http://www.kaoyan.com/tiaoji/xinxi/" title="考研调剂信息">调剂信息</a></li>  
  29.     <li><a href="http://tiaoji.kaoyan.com/xinwen/" title="考研调剂新闻">调剂新闻</a></li>  
  30.     <li><a href="http://tiaoji.kaoyan.com/jingyan/" title="考研调剂经验">调剂经验</a></li>  
  31.     <li><a href="http://tiaoji.bbs.kaoyan.com/" title="考研调剂论坛" target="_blank">调剂论坛</a></li>  
  32. </ul>  
  33. <div class="courseArea">  
  34.     <ul class="tjPicAd mt10 clear">  
  35.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("850729");</script></li>  
  36.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("850747");</script></li>  
  37.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("850763");</script></li>  
  38.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("850766");</script></li>  
  39.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869710");</script></li>  
  40.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869712");</script></li>  
  41.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869713");</script></li>  
  42.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869714");</script></li>  
  43.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869898");</script></li>  
  44.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869899");</script></li>  
  45.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869901");</script></li>  
  46.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869902");</script></li>  
  47.     </ul>  
  48.     <ul class="tjPicAd clear">  
  49.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("859514");</script></li>  
  50.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("859516");</script></li>  
  51.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("859517");</script></li>  
  52.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("859518");</script></li>  
  53.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869981");</script></li>  
  54.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869982");</script></li>  
  55.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869983");</script></li>  
  56.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("869984");</script></li>  
  57.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("1033455");</script></li>  
  58.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("1033457");</script></li>  
  59.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("1033458");</script></li>  
  60.         <li><script type="text/javascript">BAIDU_CLB_fillSlot("1033459");</script></li>  
  61.     </ul>  
  62. </div>  
  63.   
  64.   
  65. <div class="box pc-index">  
  66.     <div class="tiaoji-content-nav">  
  67.         <ul>  
  68.             <li><a href="http://www.kaoyan.com">考研网>></a></li>  
  69.             <li><a href="http://tiaoji.kaoyan.com">考研调剂中心>></a></li>  
  70.             <li><a href="http://student.tiaoji.kaoyan.com">考生调剂意向</a></li>  
  71.         </ul>  
  72.     </div>  
  73.       <form action="" method="GET">  
  74.       <select name="course">  
  75.       <option value="">专业门类</option>  
  76.       <option value="哲学">哲学</option>  
  77.       <option value="经济学">经济学</option>  
  78.       <option value="法学">法学</option>  
  79.       <option value="教育学">教育学</option>  
  80.       <option value="文学">文学</option>  
  81.       <option value="历史学">历史学</option>  
  82.       <option value="理学">理学</option>  
  83.       <option value="工学">工学</option>  
  84.       <option value="农学">农学</option>  
  85.       <option value="医学">医学</option>  
  86.       <option value="军事学">军事学</option>  
  87.       <option value="管理学">管理学</option>  
  88.       <option value="艺术学">艺术学</option>  
  89.       </select>  
  90.       报考专业: <input name="major" value=""></input>  
  91.       <input type="submit" value="搜索" />  
  92.       </form>  
  93.     <div class="tiaoji-content">  
  94.         <div class="tiaoji-cont-top">  
  95.             <h5>考生调剂信息</h5><span><a href="/tjadm/logout">退出</a></span>  
  96.         </div>  
  97.         <table class="tiaoji-tab" cellpadding="0" cellspacing="0">  
  98.             <tr>  
  99.                 <th width="3%">姓名</th>  
  100.                 <th width="5%">报考学校</th>  
  101.                 <th width="5%">报考专业</th>  
  102.                 <th width="5%">专业门类</th>  
  103.                 <th width="2%">总分</th>  
  104.                 <th width="2%">政治</th>  
  105.                 <th width="2%">外语</th>  
  106.                 <th width="2%">专一</th>  
  107.                 <th width="2%">专二</th>  
  108.                 <th width="5%">电话</th>  
  109.                 <th width="5%">邮箱</th>  
  110.                 <th width="10%">调剂意向</th>  
  111.                 <th width="5%">发布时间</th>  
  112.             </tr>  
  113.                         <tr>  
  114.                 <td>李***</td>  
  115.                 <td style=" height:25px; line-height:25px; padding:0 5px; text-align:left;">天津大学</td>  
  116.                 <td style=" height:25px; line-height:25px; padding:0 5px; text-align:left;">应用化学</td>  
  117.                 <td style=" height:25px; line-height:25px; padding:0 5px; text-align:left;">工学</td>  
  118.                 <td>244</td>  
  119.                 <td>58</td>  
  120.                 <td>53</td>  
  121.                 <td>133</td>  
  122.                 <td>0</td>  
  123.                 <td>15********15</td>  
  124.                 <td></td>  
  125.                 <td style=" height:25px; line-height:25px; padding:0 5px; text-align:left;">希望能调剂到211或者985院校,只要是与化学相关的都服从调剂</td>  
  126.                 <td>2016-03-01</td>  
  127.             </tr>      
  128.              <tr>  
  129.                 <td>何***</td>  
  130.                 <td style=" height:25px; line-height:25px; padding:0 5px; text-align:left;">安徽大学</td>  
  131.                 <td style=" height:25px; line-height:25px; padding:0 5px; text-align:left;">中国现当代文学</td>  
  132.                 <td style=" height:25px; line-height:25px; padding:0 5px; text-align:left;"></td>  
  133.                 <td>137</td>  
  134.                 <td>71</td>  
  135.                 <td>66</td>  
  136.                 <td>0</td>  
  137.                 <td>0</td>  
  138.                 <td>18********74</td>  
  139.                 <td></td>  
  140.                 <td style=" height:25px; line-height:25px; padding:0 5px; text-align:left;">服从调剂</td>  
  141.                 <td>2016-03-01</td>  
  142.             </tr>  
  143.                     </table>  
  144.         <table width="100%" align="center" border="0" cellpadding="2" cellspacing="1" class="tiaoji-fy">  
  145.             <tr>  
  146.               <td colspan="2"> <span>[每页显示:20条/总共:161659条]</span>  <a>上一页</a> <b>1</b> <a href="/tjadm/2.html" >2</a> <a href="/tjadm/3.html" >3</a> <a href="/tjadm/4.html" >4</a> <a href="/tjadm/5.html" >5</a> <a href="/tjadm/6.html" >6</a> <a href="/tjadm/7.html" >7</a> <a href="/tjadm/8.html" >8</a> <a href="/tjadm/9.html" >9</a> <a href="/tjadm/10.html" >10</a> <span>...</span> <a href="/tjadm/8082.html" >8082</a> <a href="/tjadm/8083.html" >8083</a> <a href="/tjadm/2.html">下一页</a></td>  
  147.             </tr>  
  148.           </table>  
  149.     </div>  
  150. </div>  
  151.   
  152. <p class="clearFooter"></p>  
  153. <div class="footer">  
  154. <script src="http://img.kaoyan.com/www/footera.js" type="text/javascript"></script>  
  155.  - <a href="http://www.kaoyan.com/sitemap/">网站地图</a>  
  156.  - <a href="http://www.kaoyan.com/yzsitemap/">院校地图</a>  
  157.  - <a href="http://www.kaoyan.com/update/">最新更新</a>  
  158. <script src="http://img.kaoyan.com/www/footerb.js" type="text/javascript"></script>  
  159. </div>  
  160. <script src='http://img.kaoyan.com/global/js/gcc.js' type='text/javascript'></script>  
  161. <script src="http://img.kaoyan.com/global/js/backtopnew.js?ver=2014092901" type="text/javascript"></script>  
  162. <script type="text/javascript">/*考研网-全站对联*/var cpro_id = "u1773154";</script>  
  163. </body>  
  164. </html>  

要做的就是从以下格式的HTML代码中解析出需要的数据

抓取网页数据并解析Android


抓取网页数据并解析Android

Android程序模拟HTTP请求

经过上述分析,清楚了HTTP的请求地址、请求方式和携带参数格式,所以接下来要开发Android程序编程实现这个过程。(不一定非要Android实现,在PC上直接实现应该也是可以的。但本人比较熟悉Android上的一个HTTP开发库,所以计划Android平台实现)。1、打开Eclipse,新建一个工程TestGet,把实现HTTP库的代码拷入工程中,使用的库android-async-http官网源码:https://github.com/loopj/android-async-http官网教程:http://loopj.com/android-async-http/
这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。

工程目录如下,其中com.loopj.android.http包就是android-async-http的源码抓取网页数据并解析Android

2、新建XcAsyncHttpClientUtil.java,添加请求URL地址,封装AsyncHttpClient的GET和POST请求[java] view plain copy 抓取网页数据并解析Android抓取网页数据并解析Android
  1. package com.example.testget;  
  2.   
  3. import org.apache.http.HttpEntity;  
  4.   
  5. import android.content.Context;  
  6.   
  7. import com.loopj.android.http.AsyncHttpClient;  
  8. import com.loopj.android.http.AsyncHttpResponseHandler;  
  9. import com.loopj.android.http.RequestParams;  
  10.   
  11. public class XcAsyncHttpClientUtil {  
  12.     public static final String BASE_URL = "http://ntiaoji.kaoyan.com";  
  13.     public static final String LOGIN_URL = "/tjadm/login";  
  14.     public static final String INDEX1 = "/tjadm/1.html";  
  15.     private static AsyncHttpClient client = new AsyncHttpClient();  
  16.   
  17.     public static void get(String url, RequestParams params,  
  18.             AsyncHttpResponseHandler responseHandler) {  
  19.         client.get(getAbsoluteUrl(url), params, responseHandler);  
  20.     }  
  21.   
  22.     public static void post(String url, RequestParams params,  
  23.             AsyncHttpResponseHandler responseHandler) {  
  24.         client.post(getAbsoluteUrl(url), params, responseHandler);  
  25.     }  
  26.   
  27.     public static void post(Context context, String url, HttpEntity entity,  
  28.             AsyncHttpResponseHandler responseHandler) {  
  29.         client.post(context, getAbsoluteUrl(url), entity, "", responseHandler);  
  30.     }  
  31.   
  32.     public static String getAbsoluteUrl(String relativeUrl) {  
  33.         return BASE_URL + relativeUrl;  
  34.     }  
  35. }  

3、编辑activity_main.xml,添加两个按钮,一个登陆,一个获取表格数据
[html] view plain copy 抓取网页数据并解析Android抓取网页数据并解析Android
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context="com.example.testget.MainActivity"   
  10.     >  
  11.   
  12.     <TextView  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="@string/hello_world" />  
  16.   
  17.     <Button  
  18.         android:id="@+id/btn"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:text="登陆" >  
  22.     </Button>  
  23.       
  24.      <Button  
  25.         android:id="@+id/btn1"  
  26.         android:layout_width="wrap_content"  
  27.         android:layout_height="wrap_content"  
  28.         android:text="获取表格数据" >  
  29.     </Button>  
  30.   
  31. </LinearLayout>  
效果图如下:
抓取网页数据并解析Android
4、编辑MainActivity.java,添加按钮点击动作,dologin()用来实现登陆,doGetData()用来获取表格数据,参数page用来构建请求的URL,初始化值为1,可自增,获取其他页面的数据
[java] view plain copy 抓取网页数据并解析Android抓取网页数据并解析Android
  1. @Override  
  2.     protected void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.activity_main);  
  5.         btn = (Button) findViewById(R.id.btn);  
  6.         btn.setOnClickListener(new OnClickListener() {  
  7.             @Override  
  8.             public void onClick(View v) {  
  9.                 dologin();  
  10.             }  
  11.         });  
  12.         btn1 = (Button) findViewById(R.id.btn1);  
  13.         btn1.setOnClickListener(new OnClickListener() {  
  14.             @Override  
  15.             public void onClick(View v) {  
  16.                 doGetData();  
  17.             }  
  18.         });  
  19.     }  
  20.       
  21.     private void dologin() {  
  22.         RequestParams params = new RequestParams();  
  23.         params.put("username""kytj1");  
  24.         params.put("password""***********");  
  25.         XcAsyncHttpClientUtil.post(XcAsyncHttpClientUtil.LOGIN_URL, params,  
  26.                 new AsyncHttpResponseHandler() {  
  27.                     @Override  
  28.                     public void onSuccess(int statusCode, Header[] headers,  
  29.                             byte[] responseBody) {  
  30.                         try {  
  31.                             String jsonString = new String(responseBody,  
  32.                                     "UTF-8");  
  33.                             Log.e("TAG", jsonString);  
  34.   
  35.                         } catch (UnsupportedEncodingException e) {  
  36.                             e.printStackTrace();  
  37.                         }  
  38.                     }  
  39.   
  40.                     @Override  
  41.                     public void onFailure(int statusCode, Header[] headers,  
  42.                             byte[] responseBody, Throwable error) {  
  43.                         Log.e("Login""onFailure");  
  44.                     }  
  45.                 });  
  46.     }  
  47.     protected void doGetData() {  
  48.         RequestParams params = new RequestParams();  
  49.         XcAsyncHttpClientUtil.get("/tjadm/" + page + ".html", params,  
  50.                 new AsyncHttpResponseHandler() {  
  51.                     @Override  
  52.                     public void onSuccess(int statusCode, Header[] headers,  
  53.                             byte[] responseBody) {  
  54.                         try {  
  55.                             String jsonString = new String(responseBody,  
  56.                                     "UTF-8");  
  57.                             parse(jsonString);  
  58.                         } catch (UnsupportedEncodingException e) {  
  59.                             e.printStackTrace();  
  60.                         }  
  61.                     }  
  62.   
  63.                     @Override  
  64.                     public void onFailure(int statusCode, Header[] headers,  
  65.                             byte[] responseBody, Throwable error) {  
  66.                     }  
  67.                 });  
  68.     }  
取到网页数据内容还不算完,还得解析出所需数据。doGetData()取到的respoBody由UTF-8编码,解码后得到字符串格式数据交由parse()解析。

Java解析HTML数据

之前没有做过如何解析HTML数据,开始还有点头疼,不知道如何下手,在网上搜索解决办法。然后发现了这个库jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。官方网站:http://jsoup.org/
点击下载jsoup库

把下载到的jsoup-1.8.3.jar库添加到Android工程libs文件夹下
解析如下HTML数据抓取网页数据并解析Android抓取网页数据并解析Android

原数据里table下有21条数据,第1条为表格title信息,如姓名、报考学校、报考专业等字段,第2-21条为实际的学生信息。Java代码如下:[java] view plain copy 抓取网页数据并解析Android抓取网页数据并解析Android
  1. protected void parse(String html) {  
  2.         Document doc = Jsoup.parse(html);  
  3.         Element tiaojiTab = doc.select("table.tiaoji-tab").first();  
  4.         Elements lists = tiaojiTab.getElementsByTag("tr");  
  5.         int size = lists.size();  
  6.         for (int i = 1; i < size; i++) {  
  7.             Element item = lists.get(i);  
  8.             Elements els = item.getElementsByTag("td");  
  9.             String all = "";  
  10.             for (int j = 0; j < els.size(); j++) {  
  11.                 Element value = els.get(j);  
  12.                 String text = value.text();  
  13.                 all = all + text + "#";  
  14.             }  
  15.             initData(all);  
  16.             Log.e("tag", all);  
  17.         }  
  18.         page++;  
  19.         if (page < totalsize + 1) {  
  20.             doGetData();  
  21.         } else {  
  22.             page = 1;  
  23.         }  
  24.     }  
[java] view plain copy 抓取网页数据并解析Android抓取网页数据并解析Android
  1. doc.select("table.tiaoji-tab").first();  
从整个HTML文档里取出要解析的内容信息,根据“tr”取得元素组,从第2条开始取数据,调用for循环。
对于单个字段间添加“#”号,以方便后续在Excel中处理数据。initData(all)把单独html页上取得的数据写到txt文件里。[java] view plain copy 抓取网页数据并解析Android抓取网页数据并解析Android
  1. page++;  
  2.         if (page < totalsize + 1) {  
  3.             doGetData();  
  4.         } else {  
  5.             page = 1;  
  6.         }  
继续取下一页,设置的totalSize=200,即每运行一次程序,抓取200页数据。

把数据写入到本地txt文件里代码:[java] view plain copy 抓取网页数据并解析Android抓取网页数据并解析Android
  1. private void initData(String msg) {  
  2.         String filePath = "/sdcard/Test/";  
  3.         String fileName = "tiaoji.txt";  
  4.         makeFilePath(filePath, fileName);  
  5.         writeTxtToFile(msg, filePath, fileName);  
  6.     }  
  7.   
  8.     // 将字符串写入到文本文件中  
  9.     public void writeTxtToFile(String strcontent, String filePath,  
  10.             String fileName) {  
  11.         // 生成文件夹之后,再生成文件,不然会出错  
  12.         String strFilePath = filePath + fileName;  
  13.         // 每次写入时,都换行写  
  14.         String strContent = strcontent + "\r\n";  
  15.         try {  
  16.             File file = new File(strFilePath);  
  17.             if (!file.exists()) {  
  18.                 Log.d("TestFile""Create the file:" + strFilePath);  
  19.                 file.getParentFile().mkdirs();  
  20.                 file.createNewFile();  
  21.             }  
  22.             RandomAccessFile raf = new RandomAccessFile(file, "rwd");  
  23.             raf.seek(file.length());  
  24.             raf.write(strContent.getBytes());  
  25.             raf.close();  
  26.         } catch (Exception e) {  
  27.             Log.e("TestFile""Error on write File:" + e);  
  28.         }  
  29.     }  
  30.   
  31.     // 生成文件  
  32.     public File makeFilePath(String filePath, String fileName) {  
  33.         File file = null;  
  34.         makeRootDirectory(filePath);  
  35.         try {  
  36.             file = new File(filePath + fileName);  
  37.             if (!file.exists()) {  
  38.                 file.createNewFile();  
  39.             }  
  40.         } catch (Exception e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.         return file;  
  44.     }  
  45.   
  46.     // 生成文件夹  
  47.     public static void makeRootDirectory(String filePath) {  
  48.         File file = null;  
  49.         try {  
  50.             file = new File(filePath);  
  51.             if (!file.exists()) {  
  52.                 file.mkdir();  
  53.             }  
  54.         } catch (Exception e) {  
  55.             Log.i("error:", e + "");  
  56.         }  
  57.     }  


导入txt到Excel

1、连接手机到电脑,打开应用宝,工具箱里选择文件管理,把txt文件导入到电脑上2、打开Excel,选择数据-自文本抓取网页数据并解析Android

按照提示,选择导出的txt文件,第2步中分隔符号选择其他,填入“#”,再完成
这样,就把数据成功的在Excel中显示了。

完整MainActivity.java如下:[java] view plain copy 抓取网页数据并解析Android抓取网页数据并解析Android
  1. package com.example.testget;  
  2.   
  3. import java.io.File;  
  4. import java.io.RandomAccessFile;  
  5. import java.io.UnsupportedEncodingException;  
  6.   
  7. import org.apache.http.Header;  
  8. import org.jsoup.Jsoup;  
  9. import org.jsoup.nodes.Document;  
  10. import org.jsoup.nodes.Element;  
  11. import org.jsoup.select.Elements;  
  12.   
  13. import android.app.Activity;  
  14. import android.os.Bundle;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.widget.Button;  
  19.   
  20. import com.loopj.android.http.AsyncHttpResponseHandler;  
  21. import com.loopj.android.http.RequestParams;  
  22.   
  23. public class MainActivity extends Activity {  
  24.     private Button btn, btn1;  
  25.     private int page = 1;  
  26.     private static final int totalsize = 200;  
  27.   
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_main);  
  32.         btn = (Button) findViewById(R.id.btn);  
  33.         btn.setOnClickListener(new OnClickListener() {  
  34.             @Override  
  35.             public void onClick(View v) {  
  36.                 dologin();  
  37.             }  
  38.         });  
  39.         btn1 = (Button) findViewById(R.id.btn1);  
  40.         btn1.setOnClickListener(new OnClickListener() {  
  41.             @Override  
  42.             public void onClick(View v) {  
  43.                 doGetData();  
  44.             }  
  45.         });  
  46.     }  
  47.       
  48.     private void dologin() {  
  49.         RequestParams params = new RequestParams();  
  50.         params.put("username""kytj1");  
  51.         params.put("password""************");  
  52.         XcAsyncHttpClientUtil.post(XcAsyncHttpClientUtil.LOGIN_URL, params,  
  53.                 new AsyncHttpResponseHandler() {  
  54.                     @Override  
  55.                     public void onSuccess(int statusCode, Header[] headers,  
  56.                             byte[] responseBody) {  
  57.                         try {  
  58.                             String jsonString = new String(responseBody,  
  59.                                     "UTF-8");  
  60.                             Log.e("TAG", jsonString);  
  61.   
  62.                         } catch (UnsupportedEncodingException e) {  
  63.                             e.printStackTrace();  
  64.                         }  
  65.                     }  
  66.   
  67.                     @Override  
  68.                     public void onFailure(int statusCode, Header[] headers,  
  69.                             byte[] responseBody, Throwable error) {  
  70.                         Log.e("Login""onFailure");  
  71.                     }  
  72.                 });  
  73.     }  
  74.     protected void doGetData() {  
  75.         RequestParams params = new RequestParams();  
  76.         XcAsyncHttpClientUtil.get("/tjadm/" + page + ".html", params,  
  77.                 new AsyncHttpResponseHandler() {  
  78.                     @Override  
  79.                     public void onSuccess(int statusCode, Header[] headers,  
  80.                             byte[] responseBody) {  
  81.                         try {  
  82.                             String jsonString = new String(responseBody,  
  83.                                     "UTF-8");  
  84.                             parse(jsonString);  
  85.                         } catch (UnsupportedEncodingException e) {  
  86.                             e.printStackTrace();  
  87.                         }  
  88.                     }  
  89.   
  90.                     @Override  
  91.                     public void onFailure(int statusCode, Header[] headers,  
  92.                             byte[] responseBody, Throwable error) {  
  93.                     }  
  94.                 });  
  95.     }  
  96.   
  97.     protected void parse(String html) {  
  98.         Document doc = Jsoup.parse(html);  
  99.         Element tiaojiTab = doc.select("table.tiaoji-tab").first();  
  100.         Elements lists = tiaojiTab.getElementsByTag("tr");  
  101.         int size = lists.size();  
  102.         for (int i = 1; i < size; i++) {  
  103.             Element item = lists.get(i);  
  104.             Elements els = item.getElementsByTag("td");  
  105.             String all = "";  
  106.             for (int j = 0; j < els.size(); j++) {  
  107.                 Element value = els.get(j);  
  108.                 String text = value.text();  
  109.                 all = all + text + "#";  
  110.             }  
  111.             initData(all);  
  112.             Log.e("tag", all);  
  113.         }  
  114.         page++;  
  115.         if (page < totalsize + 1) {  
  116.             doGetData();  
  117.         } else {  
  118.             page = 1;  
  119.         }  
  120.     }  
  121.   
  122.     private void initData(String msg) {  
  123.         String filePath = "/sdcard/Test/";  
  124.         String fileName = "tiaoji.txt";  
  125.         makeFilePath(filePath, fileName);  
  126.         writeTxtToFile(msg, filePath, fileName);  
  127.     }  
  128.   
  129.     // 将字符串写入到文本文件中  
  130.     public void writeTxtToFile(String strcontent, String filePath,  
  131.             String fileName) {  
  132.         // 生成文件夹之后,再生成文件,不然会出错  
  133.         String strFilePath = filePath + fileName;  
  134.         // 每次写入时,都换行写  
  135.         String strContent = strcontent + "\r\n";  
  136.         try {  
  137.             File file = new File(strFilePath);  
  138.             if (!file.exists()) {  
  139.                 Log.d("TestFile""Create the file:" + strFilePath);  
  140.                 file.getParentFile().mkdirs();  
  141.                 file.createNewFile();  
  142.             }  
  143.             RandomAccessFile raf = new RandomAccessFile(file, "rwd");  
  144.             raf.seek(file.length());  
  145.             raf.write(strContent.getBytes());  
  146.             raf.close();  
  147.         } catch (Exception e) {  
  148.             Log.e("TestFile""Error on write File:" + e);  
  149.         }  
  150.     }  
  151.   
  152.     // 生成文件  
  153.     public File makeFilePath(String filePath, String fileName) {  
  154.         File file = null;  
  155.         makeRootDirectory(filePath);  
  156.         try {  
  157.             file = new File(filePath + fileName);  
  158.             if (!file.exists()) {  
  159.                 file.createNewFile();  
  160.             }  
  161.         } catch (Exception e) {  
  162.             e.printStackTrace();  
  163.         }  
  164.         return file;  
  165.     }  
  166.   
  167.     // 生成文件夹  
  168.     public static void makeRootDirectory(String filePath) {  
  169.         File file = null;  
  170.         try {  
  171.             file = new File(filePath);  
  172.             if (!file.exists()) {  
  173.                 file.mkdir();  
  174.             }  
  175.         } catch (Exception e) {  
  176.             Log.i("error:", e + "");  
  177.         }  
  178.     }  
  179.   
  180. }