zoukankan      html  css  js  c++  java
  • java爬虫爬取学校毕设题目

    背景

      最近很多大四学生问我毕业设计如何选题
      “你觉得图书管理系统怎么样?”
      “导师不让做这个,说太简单”
      “那你觉得二手交易平台怎么样?”
      “导师说没新意,都有咸鱼了你做这个有什么意思?要新颖的”
      “那你觉得个人博客平台的搭建怎么样?”
      “啥是博客?”
      “emmmm……在线售票怎么样?”
      “导师说今年不让选xx管理系统,这些都太简单”

      enter description here

     

      “那你觉得做人脸识别或者垃圾自动分类怎么样”
      “导师说这些太难了,我肯定做不出来”

      enter description here

     

      于是,我一气之下,爬取了学校的毕设题目,也顺便学学爬虫。

    效果

      爬取学校教学平台上所有的毕设题目,保存到本地数据库中

      enter description here
     

    思路

      获取要爬取页面的url,爬取数据,发现返回的是HTML,利用jsoup做HTML的解析,从中找出需要的部分,保存进数据库。
    jsoup是用来解析HTML的,具体使用可以参考官网文档:https://jsoup.org/

    代码准备

    • 依赖(jar包)

      解析HTML需要用到jsoup,数据库操作用dbutils,数据库连接池c3p0,数据库驱动
      <dependency>
                <groupId>com.mchange</groupId>
                <artifactId>c3p0</artifactId>
                <version>0.9.5.5</version>
            </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.12.1</version>
        </dependency>
            <dependency>
                <groupId>commons-dbutils</groupId>
                <artifactId>commons-dbutils</artifactId>
                <version>1.7</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.48</version>
            </dependency>
    

      

    • 建表

      想要保存序号,题目,学院,导师四个信息

      enter description here

       
    • 代码

      • 实体类 Project
      enter description here

       
      • 数据库操作类 DataUtil
      enter description here

       
      • 爬取主类

       

    java爬虫过程解析

      进入学校的教务系统,找到了所有毕设题目

      enter description here

     

      按下f12,查看网络信息

      enter description here

     

      从上图可以得到我们要访问的url,同时我们要拿到cookie信息,因为只有登录后才能进来这个url,所以我们先用浏览器登录上,然后复制当前cookie信息,通过代码访问url时附上该登录信息。

     Document document = Jsoup.connect(url).header("Cookie", cookie).get();

      上面代码中,url和cookie自行传入

      enter description here

     

      通过调试模式查看得知,访问该url时,返回的不是json数据而是直接返回了HTML,因此我们需要去解析该页面,从中找出我们想要的数据部分

      首先,先定位表格所在的位置,找到他的嵌套关系,直接看源码的嵌套关系如下图红色,也可以直接从浏览器的下方看到我点中的tr标签的嵌套顺序如下图蓝色

      enter description here

     

      接着通过select方法,我们可以根据css选择器和标签类型一步步定位到我们要的部分

    Elements elements = document.select("div.Nsb_pw > div.Nsb_layout_r > form > table > tbody > tr");

      最后遍历elements,拿到其中的元素赋值给project对象,然后进行保存。这里我是定位到了标签,也就是说elements返回的是所有的tr标签元素。因此,拿到的elements其实相当于一个集合,里面的每一个元素,是一个tr标签及其内部全部内容。
      elements.child(int index)方法,是得到其子元素,也就是说td标签
      接着调用ownText()方法得到该元素的文本内容。

    for(int j=1;j<elements.size();j++){
      Project project=new Project(id++,elements.get(j).child(1).ownText(),elements.get(j).child(2).ownText(),elements.get(j).child(3).ownText());
      DataUtil.insert(project);
      System.out.println(elements.get(j).child(1).ownText());
     }
    

      

      下面是表格的源码,看完源码就可以理解我为什么要这么写了。第一个tr表示表格标题,所以跳过;我们只想得到题目,学院,导师的信息,因此调用child方法时传参分别为1,2,3


     

    如何解决分页问题

      系统用了分页,每次访问时默认都返回的是第一页的十条数据,通过查看源码我发现,下一页按钮对应的是一个js方法,于是我百度找了好久,想通过代码去执行“下一页”功能的那个js方法。
      就在此时,我发现了页面保存的参数

      enter description here

     

      哦?既然有当前页码数,那是否意味着我在url后面加上这个参数就可以访问到任意页面的数据,于是我试了一下用以下url:http://jwxt.qlu.edu.cn/jsxsd/bysj/xsxt.do?pageIndex=15
      我擦,真的访问到了第十五页。那还百度个屁啊。于是就有了这段代码,循环搞定url

      

     
  • 相关阅读:
    推荐几款Silverlight Tools【转载】
    Emit Vs CodeDom
    Silverlight 中实现Service同步调用
    一个配置文件的Mapping
    Silverlight:获取ContentTemplate中的命名控件
    关于计划
    巧用异步委托解决异步并发问题
    我是如何学习NodeJs的 – 笔记1
    应用HttpHandler, Json, JQuery, ASP.Net UserControl等技术处理 Ajax 的解决方案
    关于程序员的那些事一个五年程序员的总结
  • 原文地址:https://www.cnblogs.com/duibd/p/12109755.html
Copyright © 2011-2022 走看看