學校實訓做業:Java爬蟲(WebMagic框架)的簡單操做

項目名稱:java爬蟲php

項目技術選型:Java、Maven、Mysql、WebMagic、Jsp、Servlethtml

項目實施方式:以認知java爬蟲框架WebMagic開發爲主,用所學java知識完成指定網站的數據爬取解析,並使用Servlet和Jsp展現到頁面java

實訓環境:一人一機,邊講邊練mysql

實訓簡介:web

本次實訓的主要目的是加強學生對於WebMagic框架和Servlet的瞭解,並結合所學的理論知識進行爬蟲實戰。須要同窗掌握包括目前市場上使用普遍的Mysql數據、Java語言、WebMagic框架和Servlet的開發,並瞭解大中型大數據行業的基本模式知識。sql

這次實訓選擇的案例有:數據庫

   Mysql數據庫基本操做apache

   Java基本語法使用網絡

   WebMagic框架搭建並開發爬蟲項目app

經過學習這些內容可大大提高學生對計算機知識的理解,促進專業課程的學習,從而潛移默化的提高學生的就業競爭力。

 

步驟:

一、下載、安裝好Maven,並在Eclipse中配置好Maven的相關設置。

  1)、下載、安裝Maven

    下載地址:http://maven.apache.org/download.cgi,根據本身系統選擇合適版本進行下載:

    

    解壓下載的文件到合適的位置即完成了Maven的安裝:

    

 

  2)、設置環境變量

    複製Maven的安裝路徑下bin目錄的路徑,將其添加到電腦的環境變量中去:

    複製bin目錄所在的路徑:

    

    添加環境變量:

    

 

    在cmd下輸入:mvn --version  檢查Maven是否安裝成功,出現如下提示則安裝成功:

    

 

  3)、可忽略:修改Maven安裝目錄 conf下的settings.xml文件(E:\apache-maven-3.5.4\conf\settings.xml),來配置本地倉庫的位置和將遠程倉庫鏡像修改爲阿里雲鏡像:

    配置本地倉庫,在<!-- localRepository........-->下面加上本身所要建立的本地倉庫的地址(根據自身狀況設置):

    

    Maven倉庫默認在國外,使用不免很慢,尤爲是下載依賴的時候,速度賊慢,換成國內阿里雲鏡像後會在速度上有很大的提高:

    <mirror>
      <id>aliyun</id> 
      <name>aliyun Maven</name> 
      <mirrorOf>*</mirrorOf> 
      <url>http://maven.aliyun.com/nexus/content/repositories/central</url> 
    </mirror>

 

    

    4)、Eclipse的配置

      如下步驟,在每一個人的電腦上顯示的內容可能會不同(截圖來自不一樣的項目,請忽略包名、類名等信息,部分截圖來自網絡,不一樣截圖裏的相關信息可能不一樣),但操做步驟是同樣的,只要照着作就好了,在Eclipse上安裝maven,打開Eclipse點擊window>prferences以後會彈出:

      

      

      點擊肯定以後會出現:

      

      點擊finish以後:

      

      在Eclipse中配置Maven:

      打開Eclipse的首選項設置

      

      找到Maven的配置項目

      

      設置Maven的全局配置文件settings.xml

      

      更新配置信息

      

二、在Eclipse中建立Maven項目

  1)、開啓eclipse,右鍵new——》other,以下圖找到maven project或者直接搜索maven projec:

    建立項目:

    

 

  2)、選擇Maven Project,請選中Create a simple project(skip archetype selection),以後點擊Next :

    

 

  3)、填寫Group id和Artifact id, Version默認,Packaging默認爲jar,Name,Description選填,其餘的能夠都不填寫:

    

  以後點擊Finish便可,此時須要等待一段時間下載所須要的文件,建立後的完整項目結構應以下圖所示:

    

三、編寫Java爬蟲項目代碼,抓取https://hr.tencent.com/position.php網站的相關信息:

  1)、所須要抓取網頁內容:職位名稱、職位類別、人數、地點、發佈時間

    

 

  2)、根據所要抓取的內容(抓取內容包括:職位名稱、職位類別、人數、地點、發佈時間),可參照下面的SQL語句設計數據庫(mysql):

/*
SQLyog Ultimate v12.5.0 (64 bit)
MySQL - 5.5.27 : Database - mysql_java
*********************************************************************
*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mysql_java` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `mysql_java`;

/*Table structure for table `tencent_position` */

DROP TABLE IF EXISTS `tencent_position`;

CREATE TABLE `tencent_position` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `p_name` varchar(200) NOT NULL,
  `p_link` varchar(200) NOT NULL,
  `p_type` varchar(100) NOT NULL,
  `p_num` varchar(20) NOT NULL,
  `p_location` varchar(20) NOT NULL,
  `p_publish_time` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1125 DEFAULT CHARSET=utf8;

 

  3)、在建立的項目下,首先須要配置好pom.xml,而後分別建立四個類和一個接口(名字本身取):MySQLUtils、TencentPageProcessor、TencentPosition、TencentPositionDao(接口)、TencentPositionDaoImpl

    

    配置pom.xml:

    pom.xml文件的設置:填寫好<dependency..../dependency>後的內容後,必定記得要按Ctrl+S/保存按鈕,以後Eclipse會自動從設置好的Maven倉庫中下載所須要的文件,可能須要必定的時間:

    

 

    dependency數據來自:http://mvnrepository.com/  分別搜索:webmagic、mysql會顯示相關內容

    

    點擊搜索獲得的內容,複製框內的代碼到pom.xml的<dependency..../dependency>代碼塊中:

     

    能夠在Maven Dependencies庫中查看是否下載完成:

    

    

    如下是示例代碼,本身編碼時,請記得必定要改動代碼。

    MySQLUtils類代碼以下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MySQLUtils {
    
    private static Connection connection;
    
    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        if (connection == null) {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mysql_java";//URL、User、Password需根據本身的實際狀況填寫
            String user = "root";
            String password = "root";
            return DriverManager.getConnection(url, user, password);
        }
        return connection;
    }
    
}

    TencentPosition代碼以下:

public class TencentPosition {

    private String positionName;
    private String positionLink;
    private String positionType;
    private String positionNum;
    private String workLocation;
    private String publishTime;

    public TencentPosition() {
        super();
    }

    public TencentPosition(String positionName, String positionLink, String positionType, String positionNum,
            String workLocation, String publishTime) {
        super();
        this.positionName = positionName;
        this.positionLink = positionLink;
        this.positionType = positionType;
        this.positionNum = positionNum;
        this.workLocation = workLocation;
        this.publishTime = publishTime;
    }

    public String getPositionName() {
        return positionName;
    }

    public void setPositionName(String positionName) {
        this.positionName = positionName;
    }

    public String getPositionLink() {
        return positionLink;
    }

    public void setPositionLink(String positionLink) {
        this.positionLink = positionLink;
    }

    public String getPositionType() {
        return positionType;
    }

    public void setPositionType(String positionType) {
        this.positionType = positionType;
    }

    public String getPositionNum() {
        return positionNum;
    }

    public void setPositionNum(String positionNum) {
        this.positionNum = positionNum;
    }

    public String getWorkLocation() {
        return workLocation;
    }

    public void setWorkLocation(String workLocation) {
        this.workLocation = workLocation;
    }

    public String getPublishTime() {
        return publishTime;
    }

    public void setPublishTime(String publishTime) {
        this.publishTime = publishTime;
    }

    @Override
    public String toString() {
        return "TencentPosition [positionName=" + positionName + ", positionLink=" + positionLink + ", positionType="
                + positionType + ", positionNum=" + positionNum + ", workLocation=" + workLocation + ", publishTime="
                + publishTime + "]";
    }

}

    TencentPositionDao接口代碼以下:

public interface TencentPositionDao {

    int add(TencentPosition position);

}

    TencentPositionDaoImpl類代碼以下:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TencentPositionDaoImpl implements TencentPositionDao {

    public int add(TencentPosition position) {
        String sql = "INSERT INTO tencent_position(p_name, p_link, p_type, p_num, p_location, p_publish_time)"
                + " VALUES(?, ?, ?, ?, ?, ?)";
        Connection conn = null;
        PreparedStatement pst = null;
        try {
            conn = MySQLUtils.getConnection();
            pst = conn.prepareStatement(sql);
            pst.setString(1, position.getPositionName());
            pst.setString(2, position.getPositionLink());
            pst.setString(3, position.getPositionType());
            pst.setString(4, position.getPositionNum());
            pst.setString(5, position.getWorkLocation());
            pst.setString(6, position.getPublishTime());
            return pst.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (pst != null) {
                try {
                    pst.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    pst = null;
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    conn = null;
                }
            }
        }
        return 0;
    }

}

    TencentPageProcessor類代碼以下:

import java.util.List;
import java.util.concurrent.atomic.AtomicLong;import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.JsonFilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;

public class TencentPageProcessor implements PageProcessor {

    private Site site = Site.me().setRetryTimes(5).setSleepTime(1000);

    private static TencentPositionDao dao = new TencentPositionDaoImpl();
    
    public static AtomicLong count = new AtomicLong();
    public static AtomicLong total = new AtomicLong();

    public Site getSite() {
        return site;
    }

    public void process(Page page) {
        List<String> urlList = page.getHtml().links().regex("https://hr.tencent.com/position.php\\?&start=\\d+").all();
        System.out.println(urlList);
        page.addTargetRequests(urlList);
        
        List<String> positionNames = page.getHtml().xpath("//tr[@class='odd']/td[1]/a/text()").all();
        List<String> positionLinks = page.getHtml().xpath("//tr[@class='odd']/td[1]/a/@href").all();
        List<String> positionTypes = page.getHtml().xpath("//tr[@class='odd']/td[2]/text()").all();
        List<String> positionNums = page.getHtml().xpath("//tr[@class='odd']/td[3]/text()").all();
        List<String> workLocations = page.getHtml().xpath("//tr[@class='odd']/td[4]/text()").all();
        List<String> publishTimes = page.getHtml().xpath("//tr[@class='odd']/td[5]/text()").all();
        for (int i = 0; i < positionNames.size(); i++) {
            TencentPosition position = new TencentPosition();
            position.setPositionName(positionNames.get(i));
            position.setPositionLink(positionLinks.get(i));
            position.setPositionType(positionTypes.get(i));
            position.setPositionNum(positionNums.get(i));
            position.setPublishTime(publishTimes.get(i));
            position.setWorkLocation(workLocations.get(i));
            dao.add(position);
        }
        
        //String positionName = page.getHtml().xpath("//tr[@class='odd']/td[1]/a/text()").get();
        //String positionType = page.getHtml().xpath("//tr[@class='odd']/td[2]/text()").get();
        //String positionLink = "https://hr.tencent.com/" + page.getHtml().xpath("//tr[@class='odd']/td[1]/a/@href").get();
        //String positionNum = page.getHtml().xpath("//tr[@class='odd']/td[3]/text()").get();
        //String workLocation = page.getHtml().xpath("//tr[@class='odd']/td[4]/text()").get();
        //String publishTime = page.getHtml().xpath("//tr[@class='odd']/td[5]/text()").get();
        //page.putField("positionName", positionName);
        //page.putField("positionLink", positionLink);
        //page.putField("positionType", positionType);
        //page.putField("positionNum", positionNum);
        //page.putField("workLocation", workLocation);
        //page.putField("publishTime", publishTime);
        //TencentPosition position = new TencentPosition();
        //position.setPositionName(positionName);
        //position.setPositionLink(positionLink);
        //position.setPositionType(positionType);
        //position.setPositionNum(positionNum);
        //position.setPublishTime(publishTime);
        //position.setWorkLocation(workLocation);
        //dao.add(position);
    }

    public static void main(String[] args) {
        Spider.create(new TencentPageProcessor())
            .addUrl("https://hr.tencent.com/position.php?&start=0")
            .addPipeline(new JsonFilePipeline("web_code"))
            .thread(100)
            .run();
    }

}

 

 四、編碼完成,點擊運行、進行測試

  當控制檯顯示以下內容時,則表示抓取成功:

  

  此時能夠查看本身的數據庫看是否有數據,若是有數據,而且數據庫中的數據和網頁中須要抓取的數據一致,則表示Java爬蟲項目已完成:

  

實驗完成。

  注意:實驗完成後,請將源代碼壓縮爲:名字.rar,並在這週五以前發送到個人郵箱:google.app@qq.com

轉載請保留或註明出處:https://www.cnblogs.com/alibaba-inc/p/9242160.html

相關文章
相關標籤/搜索