页面爬取阶段

(1)获取列表页

(2)获取详情页
获取到每一首唐诗的详情页

根据其html文件的标签属性等,筛选出我们需要的东西,如 题目、朝代、作者、正文等……

插入数据库阶段:

拿到我们需要的东西之后,我们要把每一首唐诗的所有内容插入到数据库,由于我们的项目还有一个功能是提取所有唐诗里包含的词语来进行最后的可视化,所以我们需要对每一首诗进行分词,并将分词的内容插入数据库。

(1)计算sha256
为避免重复插入数据库,我们给每一首诗分配一个唯一的id,用"sha256"实现。

sha256安全散列算法
sha256其实就是一个哈希函数。
哈希函数,又称散列算法,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。
对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。

说白了,我们要给每一首诗根据其内容计算出一个唯一的绝不会重复的哈希值,避免重复插入数据库。

(2)分词
分词需要第三方库,我们直接引用别人的jar包。

分词可将词语和词性全部解析出来:

例:我爱敲代码!
r(代词):我
v(动词):爱
v(动词):敲
n(名词):代码
w(标点符号):!

配置本地Maven仓库后,就可以直接对你需要分词的内容进行分词。

<dependency><groupId>org.ansj</groupId><artifactId>ansj_seg</artifactId><version>5.1.6</version>
</dependency>

(3)将数据插入数据库
我们将之前获取到的题目、朝代、作者、正文、计算出来的sha256、分词等插入到我们的数据库中。

总结下来,我们的页面爬取即插入数据库阶段总分为以下五步:
(1)列表页的获取
(2)详情页的获取
(3)计算每一首诗的"sha256"
(4)分词
(5)将数据插入数据库

预研:

我们对这五部分进行前期的了解,即明白这五步到底是怎样实现或者完成的。

(1)获取列表页
获取到当前访问的网页,包括其内容及布局等。以便我们后期获取每一首诗。即把当前网页以html文件形式保存至本地。

在获取列表页之前,我们需要配置本地Maven仓库。

<dependency><groupId>net.sourceforge.htmlunit</groupId><artifactId>htmlunit</artifactId><version>2.36.0</version>
</dependency>
package lab;import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;import java.io.File;
import java.io.IOException;
import java.util.List;public class 获取详情页Demo {public static void main(String[] args) throws IOException {//无界面的浏览器(HTTP 客户端)WebClient webClient = new WebClient(BrowserVersion.CHROME);//模拟chrome浏览器//关闭了浏览器的 js 执行引擎,不再执行网页中的 js 脚本webClient.getOptions().setJavaScriptEnabled(false);//关闭了浏览器的 css 执行引擎,不再执行网页中的 css 布局webClient.getOptions().setCssEnabled(false);//访问列表页HtmlPage page = webClient.getPage("https://so.gushiwen.org/gushi/tangshi.aspx");System.out.println (page);File file = new File ("唐诗三百首\\列表页.html");//如何从 html 中提取我们需要的信息//某一结点HtmlElement body = page.getBody ();//取了一组(根据其html文件的标签、属性等)List<HtmlElement> elements = body.getElementsByAttribute ("div","class","typecont");for(HtmlElement e : elements){System.out.println (e);}HtmlElement divElement = elements.get(0);List<HtmlElement> aElements = divElement.getElementsByAttribute("a", "target", "_blank");for (HtmlElement e : aElements) {System.out.println(e);}System.out.println(aElements.size());System.out.println(aElements.get(0).getAttribute("href"));}
}

(2)获取详情页
即我们需要获取每一首诗的详情页,并将其解析出来。

package lab;import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomText;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;import java.io.IOException;public class 详情页下载提取Demo {public static void main(String[] args) throws IOException {WebClient webClient = new WebClient (BrowserVersion.CHROME);webClient.getOptions ().setCssEnabled (false);webClient.getOptions ().setJavaScriptEnabled (false);String url = "https://so.gushiwen.org/shiwenv_f324eea45183.aspx";HtmlPage page = webClient.getPage (url);HtmlElement body = page.getBody ();//根据其html页的格式求取需要的内容//标题{String xpath = "//div[@class='cont']/h1/text()";Object o = body.getByXPath (xpath).get (0);DomText domText = (DomText)o;System.out.println (domText.asText ());}//朝代{String xpath = "//div[@class='cont']/p[@class='source']/a[1]/text()";Object o = body.getByXPath (xpath).get (0);DomText domText = (DomText)o;System.out.println (domText.asText ());}//作者{String xpath = "//div[@class='cont']/p[@class='source']/a[2]/text()";Object o = body.getByXPath (xpath).get (0);DomText domText = (DomText)o;System.out.println (domText.asText ());}//正文{String xpath = "//div[@class='cont']/div[@class='contson']";Object o = body.getByXPath(xpath).get(0);HtmlElement element = (HtmlElement)o;String content = element.getTextContent ().trim ();System.out.println(content);}}}

(3)计算sha256
根据给出的内容得到一个唯一的数列值。

package lab;import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class sha256Demo {public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {//MD5//SHA-256MessageDigest messageDigest = MessageDigest.getInstance ("SHA-256");String s = "你好世界";byte[] bytes = s.getBytes ("UTF-8");messageDigest.update (bytes);byte[] result = messageDigest.digest ();//求hash值System.out.println (result.length);for(byte b : result){System.out.printf ("%02x",b);}System.out.println ();}
}

(4)分词
根据给的内容,将其中的每一个词语分解出来。

package lab;import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.NlpAnalysis;import java.util.List;public class 分词Demo {public static void main(String[] args) {String sentence = "我爱敲代码!";List<Term> termList = NlpAnalysis.parse(sentence).getTerms();for (Term term : termList) {System.out.println(term.getNatureStr() + ":" + term.getRealName());}}
}

(5)插入数据库
提前建好数据库和表,将数据插入。

package lab;import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.*;public class 插入诗词Demo {public static void main(String[] args) throws ClassNotFoundException, SQLException {String 朝代 = "唐代";String 作者 = "白居易";String 标题 = "问刘十九";String 正文 = "绿蚁新醅酒,红泥小火炉。晚来天欲雪,能饮一杯无?";// 1. 注册 Driver// 2. 获取 Connection 通过 DriverManager/*Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1/tangshi?useSSL=false&characterEncoding=utf8";Connection connection = DriverManager.getConnection(url, "root", "");System.out.println(connection);*/// 通过 DataSource 获取 Connection// 这个不带有连接池//DataSource dataSource1 = new MysqlDataSource();// 这个带有连接池,好处参照线程池MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();dataSource.setServerName("127.0.0.1");dataSource.setPort(3306);dataSource.setUser("root");dataSource.setPassword("");dataSource.setDatabaseName("tangshi");dataSource.setUseSSL(false);dataSource.setCharacterEncoding("UTF8");try (Connection connection = dataSource.getConnection()) {String sql = "INSERT INTO tangshi " +"(sha256, dynasty, title, author, " +"content, words) " +"VALUES (?, ?, ?, ?, ?, ?)";try (PreparedStatement statement = connection.prepareStatement(sql)) {statement.setString(1, "sha256");statement.setString(2, 朝代);statement.setString(3, 标题);statement.setString(4, 作者);statement.setString(5, 正文);statement.setString(6, "");statement.executeUpdate();}}}
}

唐诗页面爬取 --- 预研阶段相关推荐

  1. scrapy模拟浏览器爬取51job(动态渲染页面爬取)

    scrapy模拟浏览器爬取51job 51job链接 网络爬虫时,网页不止有静态页面还有动态页面,动态页面主要由JavaScript动态渲染,网络爬虫经常遇见爬取JavaScript动态渲染的页面. ...

  2. python 网络页面爬取

    4.22 python 网络页面爬取 对国家体育总局(例)页面进行简单爬取 运行结果截图: 代码: import requests url="http://www.sport.gov.cn/ ...

  3. python爬虫二级子页面爬取

    python爬虫二级页面爬取 文章目录 python爬虫二级页面爬取 前言 一.流程 二.操作部分 1.请求头设置 2.第一级页面爬取 3.二级页面内容爬取 4.运行结果 前言 推荐一个爬虫的小玩意 ...

  4. scrapy实现二级页面爬取(以小说为例)

    1.scrapy图解 2.创建项目 scrapy startproject 项目名 创建后的目录 3.编写字段 在items.py中编写需要的字段,这里就写小说的章节和内容 class Xiaoshu ...

  5. 爬虫入门—requests模块基础之关键字搜狗搜索信息页面爬取

    爬虫入门-requests模块基础之关键字搜狗搜索信息页面爬取 Author: Labyrinthine Leo   Init_time: 2021.02.16 Key Words: Spider.r ...

  6. 爬虫快速入门(一):静态页面爬取

    在这个数据为王的时代,掌握一手好的模型炼丹技巧还远远不够,有时候就是那么一小撮数据,就会对模型性能产生至关重要的影响.虽说大一点的公司一般都有专门负责爬虫的同学,但求人不如求己,每一位炼丹师都应该掌握 ...

  7. 基于python爬虫————静态页面和动态页面爬取

    基于python爬虫----静态页面和动态页面爬取 文章目录 基于python爬虫----静态页面和动态页面爬取 1. 爬虫的原理 2. 用正则表达式匹配获取数据 3. 页面源码解析 4. 通过req ...

  8. python爬爬爬之单网页html页面爬取

    python爬爬爬之单网页html页面爬取 作者:vpoet 日期:大约在夏季 注:随意copy 不用告诉我 #coding:utf-8 import urllib2 Response=urllib2 ...

  9. [Python3网络爬虫开发实战] 7-动态渲染页面爬取-4-使用Selenium爬取淘宝商品

    在前一章中,我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过Ajax获取的,但是这些Ajax接口参数比较复杂,可 ...

最新文章

  1. 时序分析:使用卡尔曼滤波
  2. android图片浏览远近,快图浏览编辑图片方法介绍_怎么编辑图片_3DM手游
  3. 数据结构 5-3-2 二叉树前序中序后序遍历非递归实现
  4. jQuery中eq与get的区别(整理)
  5. 面试准备(集合部分)
  6. 如何在heroku上部署你的Django程序
  7. HIVE学习之(三)
  8. 管理感悟:就事不论事
  9. 双面打印无效选择了文件服务器,记得要收藏!如何手动完成双面打印文档
  10. Matlab经纬度坐标转换xy坐标,经纬度坐标系转换为UTM坐标系(matlab)
  11. 在MySQL登录时出现Access denied for user ‘root‘@‘localhost‘ (using password: YES) 拒绝访问问题解决
  12. 安服工程师的岗位职责
  13. 如何查看电脑所有连接过的wifi密码?
  14. 开发对接微信卡包会员卡_微信公众号实现会员卡领取功能
  15. 一些AUTOSAR会议论坛的介绍(附资料下载)
  16. NVIDIA显卡硬件技术交流整理
  17. 云计算之存储虚拟化 -02
  18. python两列时间间隔计算器,Python“距离/时间/燃油计算器”帮助2
  19. dhcp服务器显示dns服务器更新挂起,如何动态更新DNS记录
  20. iOS 一步一步带你实现引导页

热门文章

  1. c语言中的less函数,less的使用-基本语法-编译
  2. 晶联讯12864液晶+STM32+HAL库 IO模拟SPI成功实现显示。
  3. ZUI易入门Android之Git的使用(一)本地仓库
  4. PHP - 命名空间(namespace)概述及实例说明
  5. MapWindow GIS二次开发
  6. 江在川上曰:云服务器上的flask项目部署(Ubuntu+Flask+Gunicorn+Supervisor+Nginx+Anaconda)
  7. python中argument什么意思_Python中parameters与argument区别
  8. 基于.Net Core Web MVC的图书查询系统——第四章,添加模型并使用EF Core生成基架自动生成控制器和视图
  9. 简单教你贴-iPhone新一代超薄卡贴
  10. EfficientNet B0 训练 Standford 汽车图片分类(对比ResNet34)