1 使用 Jsoup 完成网页爬虫
网络爬虫(web crawler):自动抓取互联网信息的程序。
Jsoup 可以通过 URL 获取网页的 HTML 源文件,源文件中包含着网站数据,我们可以解析 HTML 源文件的数据来获取我们需要的信息。
步骤:
1. 引入 jar 包。(jsoup的包)
2. 使用 Jsoup 获取网页 HTML 源文件,转为 Document 对象
3. 通过 Document 对象,获取需要的 Element 对象
4. 获取 Element 对象的数据。
5. 设置循环自动爬取
2 使用 XML 配置爬虫程序的参数
爬虫程序有一些参数需要配置,如果直接将参数写在 JAVA 程序中,则修改参数非常不方便,所以此时我们将参数写在 XML 配置文件中,通过解析 XML 文件获取参数的配置信息。
感悟:
因为虚拟机会先将java文件编译为class文件,如果我们的朋友也想用,我们直接发给他们class文件即可,运行时无需编译,直接命令行即可运行,但是如果过了半年,可能程序就不适用了,因为
文章链接最后的数字(及程序for循环的临界值)可能就变了,但class文件又无法修改,打开是只有虚拟机才懂的一堆乱码,所以要直接将这个数字放到配置文件中(这样方便修改),运行时会读取配置文件。
步骤:
1. 写爬虫程序的 XML 配置文件
2. 解析 XML 配置文件:加载 XML 文件到内存,转为 Document 对象。
3. 获取 XML 配置文件的配置信息
4. 将配置信息应用于爬虫程序中
crawler.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Clawler>
<min>9744898</min>
<max>9745020</max>
</Clawler>
CrawlerDemo.java
package com.baizhan.xml.crawler;
import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.List;
public class CrawlerDemo {
public static void main(String[] args) {
int min=0,max=0;
try {
//2. 解析 XML 配置文件:加载 XML 文件到内存,转为 Document 对象。
//获得xml文件绝对路径
String path=CrawlerDemo.class.getClassLoader().getResource(
"com/baizhan/xml/crawler/crawler.xml").getPath().replace(
"%20"," ");
//转为 Document 对象
Document document=Jsoup.parse(new File(path),"utf-8");
//3. 获取 XML 配置文件的配置信息
//XPath方式获取
JXDocument jxDocument=new JXDocument(document);
List<JXNode> minNodes=jxDocument.selN("//min");
List<JXNode> maxNodes=jxDocument.selN("//max");
Element minElement=minNodes.get(0).getElement();
Element maxElement=maxNodes.get(0).getElement();
String maxStr=maxElement.text();
String minStr=minElement.text();
//4. 将配置信息应用于爬虫程序中
min=Integer.parseInt(minStr);
max=Integer.parseInt(maxStr);
System.out.println(min+"======="+max);
} catch (IOException e) {
e.printStackTrace();
} catch (XpathSyntaxErrorException e) {
e.printStackTrace();
}
//5. 设置循环自动爬取
for (int i=min;i<=max;i++){
try {
//2. 使用 Jsoup 获取网页 HTML 源文件,转为 Document 对象
Document document= Jsoup.parse(new URL("http://daily.zhihu.com/story/"+i),1000);
//3. 通过 Document 对象,获取需要的 Element 对象
//获取头图,标题,作者,正文
//头图
Elements headerImgEle=document.getElementsByAttributeValue("alt","头图");
//标题
Elements headerEle=document.select(".DailyHeader-title");
//作者
Elements authorEle=document.select(".author");
//content是正文
Elements contentEle=document.select(".content");
//4. 获取 Element 对象的数据。
//get是获取第几个元素,get(0)是获取第一个,因为头图就一个,再获取src属性的文本
//头图链接
String headerImg=headerImgEle.get(0).attr("src");
String header=headerEle.text();
String author=authorEle.text();
String content=contentEle.text();
System.out.println(headerImg);
System.out.println(header);
System.out.println(author);
System.out.println(content);
System.out.println("------------------------------------------------------------------");
}catch (Exception ex){
//有的页面不存在
System.out.println("页"+i+"不存在");
}
}//for
}
}
这样就好比形成了一个半自动的软件,和框架原理差不多,用户只需要配置参数即可。