案例研究:4.2 抽取Web数据-HTML网页的数据抽取
优采云 发布时间: 2022-10-21 06:15案例研究:4.2 抽取Web数据-HTML网页的数据抽取
超文本标记语言,简称HTML,是超文本标记语言
它收录一组标记标签,主要用于创建和描述网页。HTML 可以以文档的形式呈现,其中收录 HTML 标记和纯文本。其中 HTML 标记用尖括号 关键词 括起来,例如和
基于数据库技术的HTML网页提取技术研究经历了手动、*敏*感*词*和全自动三个阶段。
在手动方法中,网页的模板由程序员手动分析,并借助某种编程语言针对特定问题生成特定的包装器。
在*敏*感*词*的方法中,使用网页模板提取数据,使得生成具体包装器的部分由计算机接管,网页模板的分析仍然需要人工参与。
在自动化的方法中,网页模板的分析部分也交给了计算机,几乎不需要人工参与,因此更适合*敏*感*词*、系统、连续的Web数据提取。
通过Kettle工具提取HTML网页的数据,保存到数据库提取中的数据表html中。
我们以从“豆瓣电影排行榜”网页中提取超链接数据为例进行数据提取。豆瓣电影排行榜页面的部分内容如图所示。
通过使用Kettle工具,创建一个transform transform html_extract,并添加“自定义常量数据”输入控件、“HTTP客户端”查询控件和“Java代码”脚本控件,如图。
重点是用java爬取
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;
private String result;
private String contents;
private Connection connection = null;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
if (first) {
first = false;
/* TODO: Your code here. (Using info fields)
FieldHelper infoField = get(Fields.Info, "info_field_name");
RowSet infoStream = findInfoRowSet("info_stream_tag");
<p>
Object[] infoRow = null;
int infoRowCount = 0;
// Read all rows from info step before calling getRow() method, which returns first row from any
// input rowset. As rowMeta for info and input steps varies getRow() can lead to errors.
while((infoRow = getRowFrom(infoStream)) != null){
// do something with info data
infoRowCount++;
}
*/
}
try{
URL url = new URL("https://movie.douban.com/");
URLConnection conn = url.openConnection();
conn.setRequestProperty("accept","*/*");
conn.setRequestProperty("connection","Keep-Alive");
conn.setRequestProperty("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36");
conn.connect();
InputStream input = conn.getInputStream();
byte[] buffer = new byte[1024];
int hasRead;
int length = 0;
String msg = "";
//输出到一个txt文件中
//FileWriter fw = new FileWriter("D:\\豆瓣电影排行榜.txt");
RandomAccessFile raf = new RandomAccessFile("F:\\kettle\\ETL\\5.数据\\output\\豆瓣电影排行榜.txt","rw");
while((hasRead =input.read(buffer)) != -1)
{
raf.write(buffer);
length += hasRead;
System.out.println("爬取进度:"+length);
}
raf.close();
logDebug("爬取完成!");
} catch (Exception e) {
logDebug("异常");
e.printStackTrace();
}
Object[] r = getRow();
if (r == null) {
setOutputDone();
return false;
}
// It is always safest to call createOutputRow() to ensure that your output row's Object[] is large
// enough to handle any new fields you are creating in this step.
r = createOutputRow(r, data.outputRowMeta.size());
/* TODO: Your code here. (See Sample)
// Get the value from an input field
String foobar = get(Fields.In, "a_fieldname").getString(r);
foobar += "bar";
// Set a value in a new output field
get(Fields.Out, "output_fieldname").setValue(r, foobar);
*/
// Send the row on to the next step.
putRow(data.outputRowMeta, r);
return true;
}
</p>
最终运行如下
可以获得以下内容。
使用navicat工具查看数据表html是否成功插入66行数据。
事实:SEO中流量下降?快来判断网站是否降权!
网站流量突然下降,长尾关键词,核心关键词没有排名?快来看看网站有没有被降级!
1、收录的大幅减少,甚至整个网站都是K或者主页是K,基本上是降级的标志。最可能的原因是 网站 的 原创 度数不高,甚至 采集 或 伪原创 的 文章 也不高。站内文章太相似被百度处罚
从这样的kk中恢复需要很长时间。继续更新 原创 然后发送外部链接是最好的方法。最好能在固定的时间点发送!
2、网站不是第一名,关键词排名下降很多。百度排名是基于权重的。该网站的高权重在前面,而低权重在后面。如果网站首页在内页之后,说明首页的权重不如内页,那么网站一般会降级。但不一定,我们已经看到了很多例外。但是大部分都被降级了,那么如何判断是否正确呢?然后看看核心 关键词 有没有明显下降。如果没有明显下降,则证明它没有被降级。如果显着下降。证明 网站 已被降级!还伴随着不带www的排名比带www的排名要好,一般会降级!
3.domain不在前三页!domain的值一般是一个外链(相关域),如果你的首页没有外链的前三页,就证明你的首页的权重很低。可能降级。但也不一定,比如一个特例:新站初期网站没有权重,那么就不是这样了。判断时,之前的域在前三页。后来没有这个,很有可能网站被降级了!
4.第一个不带www的站点是一般不带www的站点:第一个是所有与百度相关的域名都会按照权重进行排名。第一个站点应该是权重最高的站点。,我们一般会推广带www的,但是如果你的网站第一个不带www,那么证明不带www的权重比带www的要高,那么网站很可能会被降级!
总结:网站被降级了别着急,赶紧找原因,找到原因后再解决!