架构师

您现在的位置是:首页 > 程序人生 > 网络爬虫

网络爬虫

Java爬虫第5课:jsonp解析示例

架构师小跟班 2020-07-16 网络爬虫
5.2.jsoup解析5.2.1.解析url引入jsonp依赖jar包,<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.3</version></depende

5.2.jsoup解析

5.2.1.解析url

引入jsonp依赖jar包,

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.3</version>
</dependency>
<!--测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<!--工具-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

Jsoup可以直接输入url,它会发起请求并获取数据,封装为Document对象

package com.jiagou1216.crawler.test;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.junit.Test;

import java.net.URL;

/**
 * @author 架构师小跟班
 * @Description: https://www.jiagou1216.com
 * @date 2020/7/16 11:41
 */
public class CrawlerDemo {

    @Test
    public void testJsoupUrl() throws Exception {
        //解析url地址
        Document document = Jsoup.parse(new URL("http://www.jiagou1216.com"), 1000);
        //获取title的内容
        Element title = document.getElementsByTag("title").first();
        System.out.println(title.text());
    }
}

注意:虽然使用Jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用。

因为实际的开发过程中,需要使用到多线程,连接池,代理等等方式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup仅仅作为Html解析工具使用。

5.2.2.解析字符串

先准备以下jsonp.html文件

<html>
	<head>
		<title>架构师小跟班,让一部分人先牛逼起来</title>
	</head>
	<body>
		<div class="city">
			<h3 id="city_bj">南京</h3>
			<fb:img src="/2018czgw/images/slogan.jpg" class="slogan" />
			<div class="city_in">
				<div class="city_con" style="display: none;">
					<ul>
						<li id="test" class="class_a class_b">
							<a href="http://www.jiagou1216.com" target="_blank">
								<span class="s_name">南京</span>
							</a>
						</li>
						<li>
							<a href="http://sh.itcast.cn" target="_blank">
								<span class="s_name">上海</span>
							</a>
						</li>
						<li>
							<a href="http://gz.itcast.cn" target="_blank">
								<span abc="123" class="s_name">广州</span>
							</a>
						</li>
						<ul>
							<li>天津</li>
						</ul>
					</ul>
				</div>
			</div>
		</div>
	</body>
</html>

Jsoup可以直接输入字符串,并封装为Document对象

package com.jiagou1216.crawler.test;

import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.junit.Test;

import java.io.File;
import java.net.URL;

/**
 * @author 架构师小跟班
 * @Description: https://www.jiagou1216.com
 * @date 2020/7/16 11:41
 */
public class CrawlerDemo {

    @Test
    public void testJsoupUrl() throws Exception {
        //解析url地址
        Document document = Jsoup.parse(new URL("http://www.jiagou1216.com"), 1000);
        //获取title的内容
        Element title = document.getElementsByTag("title").first();
        System.out.println(title.text());
    }

    @Test
    public void testJsoupString() throws Exception {
        //读取文件获取
        String html = FileUtils.readFileToString(new File("C:\\Users\\WANGXIANGYU\\Desktop\\jsonp.html"), "UTF-8");
        //解析字符串
        Document document = Jsoup.parse(html);
        //获取title的内容
        Element title = document.getElementsByTag("title").first();
        System.out.println(title.text());
    }
}

5.2.3.解析文件

Jsoup可以直接解析文件,并封装为Document对象

package com.jiagou1216.crawler.test;

import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.junit.Test;

import java.io.File;
import java.net.URL;

/**
 * @author 架构师小跟班
 * @Description: https://www.jiagou1216.com
 * @date 2020/7/16 11:41
 */
public class CrawlerDemo {

    @Test
    public void testJsoupUrl() throws Exception {
        //解析url地址
        Document document = Jsoup.parse(new URL("http://www.jiagou1216.com"), 1000);
        //获取title的内容
        Element title = document.getElementsByTag("title").first();
        System.out.println(title.text());
    }

    @Test
    public void testJsoupString() throws Exception {
        //读取文件获取
        String html = FileUtils.readFileToString(new File("C:\\Users\\WANGXIANGYU\\Desktop\\jsonp.html"), "UTF-8");
        //解析字符串
        Document document = Jsoup.parse(html);
        //获取title的内容
        Element title = document.getElementsByTag("title").first();
        System.out.println(title.text());
    }

    @Test
    public void testJsoupHtml() throws Exception {
        //解析文件
        Document document = Jsoup.parse(new File("C:\\Users\\WANGXIANGYU\\Desktop\\jsonp.html"), "UTF-8");
        //获取title的内容
        Element title = document.getElementsByTag("title").first();
        System.out.println(title.text());
    }
}

5.2.4.使用dom方式遍历文档

元素获取

1.根据id查询元素    getElementById

2.根据标签获取元素    getElementsByTag

3.根据class获取元素    getElementsByClass

4.根据属性获取元素    getElementsByAttribute

//1.根据id查询元素getElementById
Element element1 = document.getElementById("city_bj");
//2.根据标签获取元素getElementsByTag
Element element2 = document.getElementsByTag("title").first();
//3.根据class获取元素getElementsByClass
Element element3 = document.getElementsByClass("s_name").last();
//4.根据属性获取元素getElementsByAttribute
Element element4 = document.getElementsByAttribute("abc").first();
Element element5 = document.getElementsByAttributeValue("class", "city_con").first();
System.out.println(element1.text());

元素中获取数据

1.从元素中获取id

2.从元素中获取className

3.从元素中获取属性的值attr

4.从元素中获取所有属性attributes

5.从元素中获取文本内容text

//获取元素
Element element = document.getElementById("test");
//1.从元素中获取id
String str1 = element.id();
//2.从元素中获取className
String str2 = element.className();
//3.从元素中获取属性的值attr
String str3 = element.attr("id");
//4.从元素中获取所有属性attributes
String str4 = element.attributes().toString();
//5.从元素中获取文本内容text
String str5 = element.text();

5.2.5.使用选择器语法查找元素

jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。

这个select 方法在Document, Element,或Elements对象中都可以使用,且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。

Select方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。

5.2.6.Selector选择器概述

tagname:     通过标签查找元素,比如:span

#id:     通过ID查找元素,比如:# city_bj

.class:     通过class名称查找元素,比如:.class_a

[attribute]:     利用属性查找元素,比如:[abc]

[attr=value]:     利用属性值来查找元素,比如:[class=s_name]

//tagname: 通过标签查找元素,比如:span
Elements span = document.select("span");
for (Element element : span) {
    System.out.println(element.text());
}
//#id: 通过ID查找元素,比如:#city_bjj
String str = document.select("#city_bj").text();
//.class: 通过class名称查找元素,比如:.class_a
str = document.select(".class_a").text();
//[attribute]: 利用属性查找元素,比如:[abc]
str = document.select("[abc]").text();
//[attr=value]: 利用属性值来查找元素,比如:[class=s_name]
str = document.select("[class=s_name]").text();

5.2.7.Selector选择器组合使用

el#id:     元素+ID,比如: h3#city_bj

el.class:     元素+class,比如: li.class_a

el[attr]:     元素+属性名,比如: span[abc]

任意组合:     比如:span[abc].s_name

ancestor child:     查找某个元素下子元素,比如:.city_con li 查找"city_con"下的所有li

parent > child:     查找某个父元素下的直接子元素,比如:

.city_con > ul > li     查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li

parent > *:     查找某个父元素下所有直接子元素

//el#id: 元素+ID,比如: h3#city_bj
String str = document.select("h3#city_bj").text();
//el.class: 元素+class,比如: li.class_a
str = document.select("li.class_a").text();
//el[attr]: 元素+属性名,比如: span[abc]
str = document.select("span[abc]").text();
//任意组合,比如:span[abc].s_name
str = document.select("span[abc].s_name").text();
//ancestor child: 查找某个元素下子元素,比如:.city_con li 查找"city_con"下的所有li
str = document.select(".city_con li").text();
//parent > child: 查找某个父元素下的直接子元素,
//比如:.city_con > ul > li 查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li
str = document.select(".city_con > ul > li").text();
//parent > * 查找某个父元素下所有直接子元素.city_con > *
str = document.select(".city_con > *").text();


文章评论