得之前在公众号提过曾经在 T 公司做 Java 爬虫,有读者对爬虫的实现很感兴趣。在 Java 应用中读取远程 URL 内容是一个比较常见的需求,可以使用 Apache 旗下的开源项目 Httpclient 来实现。
Httpclient 基于 Java 语言,实现了 HTTP 1.0 和 HTTP 1.1 协议。实现了 GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE 等全部方法。支持使用代理建立连接。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。能够自动处理 cookie,支持用 KeepAlive 来保持持久连接。
使用 Httpclient 很简单,在如下的示例代码中,分为以下几个步骤:
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"))。支持提交多种数据:
调用 HttpClient 的 execute 方法发送请求,返回的是一个 HttpResponse 对象。通过该对象可以获取返回的所有数据:
设置请求参数
HttpClient 支持设置 RequestConfig 来配置请求默认参数。一般使用 RequestConfig.Builder 来构建 RequestConfig。Builder 支持进行如下设置:
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 协议。主要分为以下几个步骤:
如果请求报错 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爬虫,你需要了解以下几个步骤:
下面是一个基本的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是一款用于解析HTML和XML文档的Java库。它提供了类似于jQuery的语法来操作文档,使得解析和处理文档变得非常简单。
以下是Jsoup解析器的一些常用功能:
总之,Jsoup是一款非常实用的HTML和XML解析器,可以帮助Java开发者快速、简单地解析和处理HTML文档,使得爬虫开发变得更加容易。
使用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文档等等,可以根据具体需求灵活运用。
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 等,大家可以自己去了解!
有不足之处大家也可以在评论区指出!
*请认真填写需求信息,我们会在24小时内与您取得联系。