項目名稱: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