项目名称: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