爬虫一式—— Jsoup

5 篇文章 0 订阅

1.Jsoup类的一些重要方法如下:

方法描述
static Connection connect(String url)创建并返回URL的连接。
static Document parse(File in, String charsetName)将指定的字符集文件解析成文档。
static Document parse(String html)将给定的html代码解析成文档。
static String clean(String bodyHtml, Whitelist whitelist)从输入HTML返回安全的HTML,通过解析输入HTML并通过允许的标签和属性的白名单进行过滤。

2. 应用实例

现在我们来看一些使用Jsoup API处理HTML文档的例子。

1. 载入文件

从URL加载文档,使用Jsoup.connect()方法从URL加载HTML。

try
{
    Document document = Jsoup.connect("http://www.yiibai.com").get();
    System.out.println(document.title());
} 
catch (IOException e) 
{
    e.printStackTrace();
}

 

2. 从文件加载文档

使用Jsoup.parse()方法从文件加载HTML。

try
{
    Document document = Jsoup.parse( new File( "D:/temp/index.html" ) , "utf-8" );
    System.out.println(document.title());
} 
catch (IOException e) 
{
    e.printStackTrace();
}

 

3. 从String加载文档

使用Jsoup.parse()方法从字符串加载HTML。

try
{
    String html = "<html><head><title>First parse</title></head>"
                    + "<body><p>Parsed HTML into a doc.</p></body></html>";
    Document document = Jsoup.parse(html);
    System.out.println(document.title());
} 
catch (IOException e) 
{
    e.printStackTrace();
}

 

4. 从HTML获取标题

如上图所示,调用document.title()方法获取HTML页面的标题。

try
{
    Document document = Jsoup.parse( new File("C:/Users/xyz/Desktop/yiibai-index.html"), "utf-8");
    System.out.println(document.title());
} 
catch (IOException e) 
{
    e.printStackTrace();
}

 

5. 获取HTML页面的Fav图标

假设favicon图像将是HTML文档的<head>部分中的第一个图像,您可以使用下面的代码。

String favImage = "Not Found";
try {
    Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/yiibai-index.html"), "utf-8");
    Element element = document.head().select("link[href~=.*\\.(ico|png)]").first();
    if (element == null) 
    {
        element = document.head().select("meta[itemprop=image]").first();
        if (element != null) 
        {
            favImage = element.attr("content");
        }
    } 
    else
    {
        favImage = element.attr("href");
    }
} 
catch (IOException e) 
{
    e.printStackTrace();
}
System.out.println(favImage);

 

6. 获取HTML页面中的所有链接

要获取网页中的所有链接,请使用以下代码。

try
{
    Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/yiibai-index.html"), "utf-8");
    Elements links = document.select("a[href]");  
    for (Element link : links) 
    {
         System.out.println("link : " + link.attr("href"));  
         System.out.println("text : " + link.text());  
    }
} 
catch (IOException e) 
{
    e.printStackTrace();
}

 

7. 获取HTML页面中的所有图像

要获取网页中显示的所有图像,请使用以下代码。

try
{
    Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/yiibai-index.html"), "utf-8");
    Elements images = document.select("img[src~=(?i)\\.(png|jpe?g|gif)]");
    for (Element image : images) 
    {
        System.out.println("src : " + image.attr("src"));
        System.out.println("height : " + image.attr("height"));
        System.out.println("width : " + image.attr("width"));
        System.out.println("alt : " + image.attr("alt"));
    }
} 
catch (IOException e) 
{
    e.printStackTrace();
}

 

8. 获取URL的元信息

元信息包括Google等搜索引擎用来确定网页内容的索引为目的。 它们以HTML页面的HEAD部分中的一些标签的形式存在。 要获取有关网页的元信息,请使用下面的代码。

try
{
    Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/yiibai-index.html"), "utf-8");

    String description = document.select("meta[name=description]").get(0).attr("content");  
    System.out.println("Meta description : " + description);  

    String keywords = document.select("meta[name=keywords]").first().attr("content");  
    System.out.println("Meta keyword : " + keywords);  
} 
catch (IOException e) 
{
    e.printStackTrace();
}

 

9. 在HTML页面中获取表单属性

在网页中获取表单输入元素非常简单。 使用唯一ID查找FORM元素; 然后找到该表单中存在的所有INPUT元素。

Document doc = Jsoup.parse(new File("c:/temp/yiibai-index.html"),"utf-8");  
Element formElement = doc.getElementById("loginForm");  

Elements inputElements = formElement.getElementsByTag("input");  
for (Element inputElement : inputElements) {  
    String key = inputElement.attr("name");  
    String value = inputElement.attr("value");  
    System.out.println("Param name: "+key+" \nParam value: "+value);  
}

 

10. 更新元素的属性/内容

只要您使用上述方法找到您想要的元素; 可以使用Jsoup API来更新这些元素的属性或innerHTML。 例如,想更新文档中存在的“rel = nofollow”的所有链接。

try
{
    Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/yiibai.com.html"), "utf-8");
    Elements links = document.select("a[href]");  
    links.attr("rel", "nofollow");
} 
catch (IOException e) 
{
    e.printStackTrace();
}

 

10. 消除不信任的HTML(以防止XSS)

假设在应用程序中,想显示用户提交的HTML片段。 例如 用户可以在评论框中放入HTML内容。 这可能会导致非常严重的问题,如果您允许直接显示此HTML。 用户可以在其中放入一些恶意脚本,并将用户重定向到另一个脏网站。

为了清理这个HTML,Jsoup提供Jsoup.clean()方法。 此方法期望HTML格式的字符串,并将返回清洁的HTML。 要执行此任务,Jsoup使用白名单过滤器。 jsoup白名单过滤器通过解析输入HTML(在安全的沙盒环境中)工作,然后遍历解析树,只允许将已知安全的标签和属性(和值)通过清理后输出。

它不使用正则表达式,这对于此任务是不合适的。

清洁器不仅用于避免XSS,还限制了用户可以提供的元素的范围:您可以使用文本,强元素,但不能构造div或表元素。

String dirtyHTML = "<p><a href='http://www.yiibai.com/' onclick='sendCookiesToMe()'>Link</a></p>";

String cleanHTML = Jsoup.clean(dirtyHTML, Whitelist.basic());

System.out.println(cleanHTML);

 

执行后输出结果如下 -

<p><a href="http://www.yiibai.com/" rel="nofollow">Link</a></p>

11.测试demo

		//***** 网址
		String url = "https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php";

		//***** 请求参数
		Map<String, String> parameMap = new HashMap<>();
		// 资源ID
		parameMap.put("resource_id", "6899");
		// 查询类目
		parameMap.put("query", "被执行人名单");
		// 根据身份证号查询
		parameMap.put("cardNum", cardNum);
		// 根据姓名查询
		// parameMap.put("iname", cardNum);
		// 返回数据格式
		parameMap.put("format", "json");

        //*****请求头
		Map<String, String> headerMap = new HashMap<>();
		// 伪装浏览器
		headerMap.put("User-Agent",
				" Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36");
		headerMap.put("Referer", "https://www.baidu.com/s?wd=被执行人查询");
		Document doc = null;

		try {
			doc = Jsoup.connect(url).data(parameMap).headers(headerMap).ignoreContentType(true).get();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			LOGGER.error("从百度爬取失信被执行人出错!", e);
			e.printStackTrace();
		}

详细内容请参考:Jsoup文档

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值