整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Java 如何读取网页内容

得之前在公众号提过曾经在 T 公司做 Java 爬虫,有读者对爬虫的实现很感兴趣。在 Java 应用中读取远程 URL 内容是一个比较常见的需求,可以使用 Apache 旗下的开源项目 Httpclient 来实现。


Httpclient 基于 Java 语言,实现了 HTTP 1.0 和 HTTP 1.1 协议。实现了 GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE 等全部方法。支持使用代理建立连接。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。能够自动处理 cookie,支持用 KeepAlive 来保持持久连接。


使用 Httpclient 很简单,在如下的示例代码中,分为以下几个步骤:

  1. 创建 HttpClient 对象,这里使用了默认设置;
  2. 创建请求对象 httpGet,对应一次 get 请求;
  3. 调用 HttpClient.execute 执行一次请求,得到的返回是 response;
  4. 通过 response 可以获取返回的状态和HTML内容;
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://www.baidu.com");
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
    System.out.println(response.getStatusLine());
    HttpEntity entity = response.getEntity();
    System.out.println(EntityUtils.toString(entity));
} finally {
    response.close();
}


发送 get 请求,需要创建 HttpGet 请求。发送 post 请求,需要创建 HttpPost 请求。如果是带参数的请求,可以直接拼接在 URL 中,也可以使用 URIBuilder 创建对象然后通过 addParameter 或 setParameter 方法添加 。如果需要设置请求 header,可以调用 addHeader 或 setHeader 方法设置 header。


对于 post 请求,可以调用 setEntity 方法设置请求的数据。如 post.setEntity(new StringEntity(body, "utf-8"))。支持提交多种数据:

  • StringEntity:纯文本内容,比如提交 json 数据;
  • FileEntity:文件,比如文件上传;
  • ByteArrayEntity:字节流数据,比如提交序列化数据;
  • UrlEncodedFormEntity:表单数据,比如提交 form 表单;
  • InputStreamEntity:输入流数据,比如文件上传;
  • SerializableEntity:序列化数据,支持提交 Serializable 序列化对象;
  • BasicHttpEntity:通用数据,使用者自行写入流和内容长度。


调用 HttpClient 的 execute 方法发送请求,返回的是一个 HttpResponse 对象。通过该对象可以获取返回的所有数据:

  • getStatusLine:获取返回状态 StatusLine 对象,如 HTTP/1.1 200 OK;
  • getEntity:获取返回的内容,如 HTML 数据;
  • getHeaders / getAllHeaders:获取返回的 header 内容;


设置请求参数

HttpClient 支持设置 RequestConfig 来配置请求默认参数。一般使用 RequestConfig.Builder 来构建 RequestConfig。Builder 支持进行如下设置:

  • setProxy:设置代理服务器,需要传入 HttpHost 对象;
  • setLocalAddress:设置本地地址;
  • setCookieSpec:设置 cookie 处理策略;
  • setRedirectsEnabled:设置是否允许自动跳转,处理 302 等响应;
  • setMaxRedirects:设置最大跳转数量,302 跳转次数;
  • setAuthenticationEnabled:设置是否启用认证,如启用需要提供密码;
  • setConnectionRequestTimeout:设置连接请求超时时间,指从连接池获取连接的timeout;
  • setConnectTimeout:设置连接超时时间,指客户端和服务器建立连接的timeout;
  • setSocketTimeout:设置 socket 时间,指客户端从服务器读取数据的timeout;

RequestConfig 构建后,需要调用 HttpClient setDefaultRequestConfig 方法设置到客户端中。


使用代理

通过 RequestConfig.setProxy 可以设置请求的代理,在爬虫等场景非常实用。代理的对象类型是 HttpHost,一般设置代理的 ip 和端口。如果代理有密码,可以使用 CredentialsProvider 配置用户名和密码自动完成认证。

CredentialsProvider credsProvider = new BasicCredentialsProvider();
//使用密码的代理端口
credsProvider.setCredentials(new AuthScope(null,port),
//用户名和密码
new UsernamePasswordCredentials(username,password)
);
httpClientBuilder.setDefaultCredentialsProvider(credsProvider);


支持 HTTPS 协议

请求 HTTPS 需要在 HttpClient 中设置 ssl 协议。主要分为以下几个步骤:

  1. 创建 SSL 协议上下文 SSLContext,通常使用 SSLContextBuilder 构建;
  2. 创建 SSLConnectionSocketFactory,是 TLS/SSL 连接的 socket 工厂;
  3. 向连接工厂中注册 https 协议使用 SSLConnectionSocketFactory 处理;
  4. 创建连接池管理器 PoolingHttpClientConnectionManager,并注册 HTTPS;
  5. 向 HttpClient 设置连接池管理器。

如果请求报错 HTTPS 证书问题,可以设置忽略证书。设置系统变量 System.setProperty("jsse.enableSNIExtension", "false"); 即可。

// 需要通过以下代码声明对https连接支持
SSLContext sslcontext = SSLContexts.custom()
    .loadTrustMaterial(null, new TrustSelfSignedStrategy())
    .build();
// SSL 连接工厂
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE);
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
    .<ConnectionSocketFactory> create()
    .register("http",PlainConnectionSocketFactory.getSocketFactory())
    .register("https", sslsf).build();
// 初始化连接管理器
PoolingHttpClientConnectionManager poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
client = HttpClients.custom()
    .setConnectionManager(poolConnManager)
    .build();


推荐阅读

30 个 Spring 常用注解与差异总结

又到黄金季节,该跳槽吗?怎么跳?

分布式事务 6 个技术方案

15 个 MyBatis 技巧,赶紧收藏吧!

你的工资被倒挂了吗

络爬虫基本思路

基本思路:由关键字指定的url把所有相关的html页面全抓下来(html即为字符串),然后解析html文本(通常是正则表达式或者现成工具包如jsoup),提取文本信息,然后把文本信息存储起来。

网络爬虫操作步骤

URL(统一资源定位符)

下载资源

分析下载资源(正则表达式)

抽取、清洗、储存

该文章只会操作两步步骤URL和下载html资源。

网络编程小知识

URI:(Universal Resource Identifier)统一资源标记符,用来标记抽象或物理资源的一个紧凑字符串。

URL:(Universal Resource Locator)统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocal(协议)、host(主机)、port(端口号)、path(路径)、parameter(参数)、anchor(锚)。

URN:(Universal Resource Name)统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。

URL和URN都是URI,但是URI不一定是URL或者URN。

SEO搜索引擎优化

SEO是搜索引擎优化(Search Engine Optimization)的英文缩写,中文译为“搜索引擎优化”。在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中的关键词自然排名,获得更多流量,从而达成网站销售及品牌建设的预期目标。

网络爬虫技术是SEO搜索引擎优化的基础(对网络爬虫感兴趣的同学可以深入研究)

JAVA中的JDK已经对URL(资源定位符)封装完毕,使用者只要会用即可。

使用JAVA代码下载网站资源有如下两种情况:


该代码主要是通过URL类的openStream方法来获取网络资源,如果还想了解URL类的信息的同学可以去看看JDK中URL类的源代码。

二、网站不允许外来访问(模仿浏览器使用HTTP协议交流)代码如下


注意事项

JAVA中的控制台储存空间有限,所以有时候HTML源代码会显示不全,但你可以通过IO操作来拷贝到文件中去。

HttpURLConnection类的setRequestProperty方法中的(String key,String value)参数需要到浏览器相应网页中去拷贝。

拷贝如下:

1、进入浏览器相关网页。

2、按住F12进入devtools。

3、拷贝Request包中最后一行数据。

4、冒号前的对应key参数,冒号后的对应value参数。

点击关注私信小编“资源”即可获得

了编写一个Java爬虫,你需要了解以下几个步骤:

  1. 首先,你需要确定你要抓取的网站。可以从浏览器中复制网站的URL并粘贴到你的Java代码中。
  2. 接下来,你需要使用Java的网络编程API连接到该网站。你可以使用URLConnection或HttpClient等库。
  3. 一旦你建立了一个连接,你就可以开始读取网页内容。你可以使用Java的IO库读取网页。
  4. 在读取网页内容之后,你需要解析网页以提取所需的信息。这可以使用Java的解析器,如Jsoup或XML解析器。
  5. 最后,你需要存储或使用所提取的信息。你可以将信息保存到数据库中,将其输出到文件中,或将其用于其他用途。

下面是一个基本的Java爬虫代码示例,它使用Jsoup解析器和URLConnection库连接到目标网站并提取标题和链接信息:

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class SimpleWebCrawler {
  
  public static void main(String[] args) {
    String url = "https://www.example.com/";
    try {
      URLConnection conn = new URL(url).openConnection();
      conn.addRequestProperty("User-Agent", "Mozilla/5.0");
      Scanner scanner = new Scanner(conn.getInputStream());
      String html = scanner.useDelimiter("\\Z").next();
      scanner.close();
      Document doc = Jsoup.parse(html);
      Elements links = doc.select("a[href]");
      for (Element link : links) {
        System.out.println(link.attr("href") + " - " + link.text());
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Jsoup

Jsoup是一款用于解析HTML和XML文档的Java库。它提供了类似于jQuery的语法来操作文档,使得解析和处理文档变得非常简单。

以下是Jsoup解析器的一些常用功能:

  1. 解析HTML文档:使用Jsoup可以轻松解析HTML文档,并且可以处理各种标签、属性、文本内容等。
  2. 获取元素:可以使用类似于jQuery的选择器语法来获取HTML文档中的元素,例如获取所有的链接、图片等。
  3. 修改元素:可以使用Jsoup修改HTML文档中的元素,例如修改元素的属性、添加或删除元素等。
  4. 过滤HTML文档:可以使用Jsoup过滤HTML文档中的不必要的元素,例如过滤掉广告、统计代码等。
  5. 处理字符编码:可以使用Jsoup来处理HTML文档中的字符编码,例如将文档中的ISO-8859-1编码转换为UTF-8编码等。
  6. 支持HTTPS:Jsoup还支持使用HTTPS协议获取HTML文档,可以使用它来爬取一些需要登录才能访问的网站。

总之,Jsoup是一款非常实用的HTML和XML解析器,可以帮助Java开发者快速、简单地解析和处理HTML文档,使得爬虫开发变得更加容易。

Jsoup的使用

使用Jsoup解析器需要先将其添加到项目的依赖中。可以通过Maven或者Gradle来添加依赖。

例如,使用Maven添加Jsoup的依赖:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.14.3</version>
</dependency>

添加依赖之后,就可以在Java代码中使用Jsoup了。以下是使用Jsoup解析器获取HTML文档中所有链接的示例代码:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><head><title>Jsoup Example</title></head>"
                + "<body><p>Jsoup is a Java library for working with real-world HTML.</p>"
                + "<a href=\"http://example.com\">Example</a></body></html>";

        Document doc = Jsoup.parse(html); // 将HTML字符串解析为文档对象

        Elements links = doc.select("a"); // 获取所有的链接元素

        for (Element link : links) {
            String href = link.attr("href"); // 获取链接的URL地址
            String text = link.text(); // 获取链接的文本内容
            System.out.println(href + ": " + text);
        }
    }
}

以上代码使用Jsoup将HTML字符串解析为文档对象,然后使用选择器语法获取所有的链接元素,并输出它们的URL地址和文本内容。

除此之外,Jsoup还有很多其他的功能,例如修改元素、过滤HTML文档等等,可以根据具体需求灵活运用。

Jsoup 解析器的常见功能和代码片段示例

1.获取网页的 Title:

Document doc = Jsoup.connect("http://example.com/").get();
String title = doc.title();

2.获取指定标签的文本内容:

Element element = doc.select("div.content").first();
String text = element.text();

3.获取指定属性的值:

Element element = doc.select("img").first();
String src = element.attr("src");

4.过滤 HTML 标签:

String html = "<p>这是一段 <b>加粗</b> 的文本。</p>";
String text = Jsoup.parse(html).text();

5.修改 HTML 内容:

Element element = doc.select("div.content").first();
element.append("<p>这是新增的文本内容。</p>");

6.提取网页中的链接:

Elements links = doc.select("a[href]");
for (Element link : links) {
    String href = link.attr("href");
    System.out.println(href);
}

7.提取网页中的图片:

Elements imgs = doc.select("img[src~=(?i)\\.(png|jpe?g|gif)]");
for (Element img : imgs) {
    String src = img.attr("src");
    System.out.println(src);
}

这些只是 Jsoup 解析器的常见用法之一。Jsoup 还有更多的功能,如解析 XML、处理表单、处理 Cookie 等,大家可以自己去了解!

有不足之处大家也可以在评论区指出!