网络爬虫

1、首先你要知道什么是抓包html

抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操做,也用来检查网络安全,但每每被某些无耻之徒用来网游做弊。web

这是我大三上学期经过抓包作的小型教务系统--La吧(喇叭),能够查成绩,查全部班级的课表,公告栏,机构通知,图书馆查询书籍,查询借书状况、意见反馈等等的功能。后台数据经过Bmob移动后端云服务进行数据存储。数据库

下面就让我经过我作的小项目进行阐述如何抓包吧。json

2、你所须要的工具后端

抓取数据的分析工具备不少,不一样浏览器也自带不少开发人员工具,若是你的是IE内核的浏览器的话,好比360安全浏览器,你能够安装一个HttpWatch,相对web开发的人员来讲对这个工具很熟悉,HttpWatch是一款强大的网页数据分析工具。集成在Internet Explorer工具栏。包括网页摘要。Cookies管理。缓存管理。消息头发送/接受。字符查询。浏览器

若是你的是Firefox火狐浏览器的话,恭喜你,它里面自带了一个比较好用的工具firebug,它的功能是和HttpWatch差很少,区别不大,我就是用Firefox自带的工具进行抓包分析的。缓存

下面就让我用图片展现firebug的安装吧:安全

 

 

 

 3、你最关心的代码实现。服务器

我作的做品是经过抓取我校(广东石油化工学院)的教务系统的数据进行分析和操做的,看到图片上的我画的,诶,是否是真是你想作和抓取的呀?cookie

 

好了,如今要用的firebug终于到场了,咱们点击浏览器小虫子的图标,或者直接按下F12快捷键,便出现这个页面,这个页面正是咱们所须要的抓包分析页面。

有木有很激动,看到数据了没有?这些数据正是咱们所须要的抓取的数据。

可是问题来了。我是先登陆才能到这个页面的啊。

其实咱们登录时是经过cookie进行验证的,若是返回的cookie不为null,那么则是登录成功

那么问题来了。我要怎么才能到到cookie了。cookie其实就至关于咱们的身份证同样,里面有惟一的信息。很少说,直接上代码:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
   
  /**
   * 登陆时获得cookie
   * @param xueHao 学号,便是登录帐号
   * @param password 登录密码
   * @return
   */
  public  List<Cookie> getCookie(String xueHao,String password) {
    List<Cookie> cookies =  null // 保存获取的cookie
   try  {
    HttpClient client =  new  DefaultHttpClient();
    String uriAPI =  "http://218.15.22.136:3008/" ;
    HttpPost httpPost =  new  HttpPost(uriAPI);
    List<NameValuePair> params =  new  ArrayList<NameValuePair>();
    params.add( new  BasicNameValuePair(
      "Window1$SimpleForm1$rdl_shenFen" "学生" ));
    params.add( new  BasicNameValuePair( "Window1$SimpleForm1$tbx_XueHao" ,
      xueHao));
    params.add( new  BasicNameValuePair( "Window1$SimpleForm1$tbx_pwd" ,
      password));
    params.add( new  BasicNameValuePair( "Window1_Collapsed" "false" ));
    params.add( new  BasicNameValuePair( "Window1_Hidden" "false" ));
    params.add( new  BasicNameValuePair( "Window1_SimpleForm1_Collapsed" ,
      "false" ));
    params.add( new  BasicNameValuePair( "X_AJAX" "true" ));
    params.add( new  BasicNameValuePair( "X_CHANGED" "true" ));
    params.add( new  BasicNameValuePair( "X_STATE" "e30=" ));
    params.add( new  BasicNameValuePair( "X_TARGET" ,
      "Window1_Toolbar1_btn_login" ));
    params.add( new  BasicNameValuePair( "__EVENTARGUMENT" "" ));
    params.add( new  BasicNameValuePair( "__EVENTTARGET" ,
      "Window1$Toolbar1$btn_login" ));
    // 发出HTTP request
    httpPost.setEntity( new  UrlEncodedFormEntity(params, HTTP.UTF_8));
    // 取得HTTP response
    HttpResponse httpResponse = client.execute(httpPost);  // 执行
    // 若状态码为200 ok
    if  (httpResponse.getStatusLine().getStatusCode() ==  200 ) {  // 返回值正常
     // 获取返回的cookie
     cookies = ((AbstractHttpClient) client).getCookieStore()
       .getCookies();
     //System.out.println("cookies=" + cookies);
     if  (cookies.isEmpty())
      System.out.println( "cookies empty" );
    else  {
    }
   catch  (Exception e) {
    System.out.println( "getCookie error:"  + e);
   }
   return  cookies;
  }

你会问params.add(new BasicNameValuePair("X_AJAX", "true")) 这些东西是什么啊?别急!再看图 

 怎么样?懂了吧?其实就是post传带的参数。

ok,进入系统以后,咱们就要对本身感兴趣的数据进行抓取了,继续如图:

选择本身想要抓取的页面,点击cookies能够知道,我本身已经登录,cookie不为空。点击响应能够看到

 

本身想要抓取的数据已经存在,不难发现本身想要数据部分是以json的形式显示出来的,如今就是获得这些数据进行分解抓取了。你会说,这个什么东西,我看不懂,看不懂不要紧,你只要数据就好了,对于这响应的数据,实际上是asp的格式而已,若是点击的网页时htmll的话,那么响应的即是html,一样是能够进行解析的。

那怎么获得这个页面呢,先看代码,再解释吧:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   /**
   * 获得成绩数据
   */
  public  ArrayList<HashMap<String, Object>> getMyGrade(List<Cookie> cookies) {
   String result =  null ;
   ArrayList<HashMap<String, Object>> list =  null ;
   String uriPath =  "http://218.15.22.136:3008/ChengJiChaXun.aspx" ;
   try  {
    HttpPost httpPost =  new  HttpPost(uriPath);
    httpPost.setHeader( "Cookie" "ASP.NET_SessionId="
      + cookies.get( 0 ).getValue() +  ";XingMing="
      + cookies.get( 1 ).getValue());
    HttpResponse httpResponse =  new  DefaultHttpClient()
      .execute(httpPost);
    if  (httpResponse.getStatusLine().getStatusCode() ==  200 ) {
     result = EntityUtils.toString(httpResponse.getEntity());
     if  (result !=  null  && !result.isEmpty()) {
      list =  new  ArrayList<HashMap<String, Object>>();
      list = toGradeData(result);
     }
    }
   catch  (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   catch  (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return  list;
  }

首先呢,你的获得你想要抓取的页面的地址,如http://218.15.22.136:3008/ChengJiChaXun.aspx,可是这仅仅是不够的,由于你要告诉系统的你的身份,否则谁均可以查分数了。没错,你要把cookie的内容传到系统中, httpPost.setHeader("Cookie", "ASP.NET_SessionId="  + cookies.get(0).getValue() + ";XingMing=" + cookies.get(1).getValue());让系统知道你是否有权限查询数据。很少说,看下图:

固然代码中的  list = toGradeData(result)你可能看不懂,这是我本身写的获取我须要的数据的方法,最后把数据装进ArrayList<HashMap<String,Object>>中返回,那么接下来,你应该知道怎么作了吧?和listview绑定,就能够把数据显示在手机界面了。如图:

固然,个人项目作了消息通知,公告栏,机构通知,如图:

 那么我是怎么作的呢?

在这里。我就得向你们介绍一个很好用的移动云服务器了。Bmob移动后端云服务,它是一个很是好用的免费的云数据库,咱们作的项目若是不能联网获取数据那么这样的应用是没人用的,或者说是失败的,可是联网获得数据咱们得有服务器啊,通常我的开发者是没有本身的服务器,特别是学生来讲更是如此,可是,如今你不用担心了,Bmob能够帮你搞定全部的繁琐的后台开发,而让你更有时间和精力去开发你的应用。

具体我很少说,省得觉得我在打广告,若是本身感兴趣的话,能够到Bmob官网了解。

首先来看,上图的数据我并非存在SQLite的,也不是存在文件中的,我是直接经过联网从个人云服务中获得的,一旦个人云服务器中的数据有改变,我下拉就能够获得最新消息。即可以作到相似新闻同样的消息通知了。

你们请看我后台的云端数据库

 

 

怎么样?不错吧?其实你看Bmob的文档,你会发现,其实这些都不难,代码说真的挺简单的。里面能够设置本身应用的的官网之类的一堆功能,建议都去看看吧,相信大家能作的更好更厉害。这个就是我在Bmob中下载个人应用的官网http://downloadlaba.bmob.cn

最后呢,但愿我写的这些对大家有帮助吧,尊重原创,转发请写上原创地址。谢谢啦~若有疑问欢迎245105136@qq.com

相关文章
相关标签/搜索