0x00前言

对比与Python的爬虫机制和java的爬虫机制来详解一下java的爬虫,对于一般性的需求无论java还是python都可以胜任。

如需要模拟登陆、对抗防采集选择python更方便些,如果需要处理复杂的网页,解析网页内容生成结构化数据或者对网页内容精细的解析则可以选择java,简单一点的数据采集我们可以选择python的爬虫,需要具体到结构的化采集存储最好采用java

0x01基础的get和post爬取

0x1post和get的基础代码

public class JAVA_TEST1 {
public static void main(String[] args) throws IOException {
CloseableHttpClient httpClient= HttpClients.createDefault();//创建一个默认对象
HttpGet httpGet=new HttpGet("https://www.itcast.cn");
httpClient.execute(httpGet);//对象去调用
CloseableHttpResponse response=httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode()==200){
HttpEntity httpEntity =response.getEntity();
String s=EntityUtils.toString(response.getEntity(),"utf-8");
System.out.println(s);
}
}
}
public class JAVA_test02 {
public static void main(String[] args) throws Exception {
//创建httpclient对象
//创建httpget对象
//发起请求
//爬到数据进行
CloseableHttpClient httpClinet = HttpClients.createDefault();
URIBuilder uriBuilder=new URIBuilder("https://www.baidu.com");
uriBuilder.setParameter("question","hellow");
System.out.println(uriBuilder.build().toString());
HttpGet httpGet=new HttpGet(uriBuilder.build()); httpClinet.execute(httpGet);
CloseableHttpResponse response=httpClinet.execute(httpGet);
if (response.getStatusLine().getStatusCode()==200){
String s= EntityUtils.toString(response.getEntity(),"utf-8");
System.out.println(s.length());
}
//关闭response
response.close();
httpClinet.close(); }
}

0x2常用方法

1.CloseableHttpClient httpClinet = HttpClients.createDefault();创造一个HttpClients

2.HttpGet httpGet=new HttpGet()创建一个Httpgetm,里面可以直接更如String形的网址

a.也可以更输入一个URI对象,URI对象可以增加额外的参数

URIBuilder uriBuilder=new URIBuilder("https://www.baidu.com");

uriBuilder.setParameter("param","value");跟入参数的方式是:创建对象调用调用方法setParameter前面是参数名后面是

HttpPost httpPost=new HttpPost(uriBuilder.build());

参数值。类似sql注入的id=1=====param=value

b. CloseableHttpResponse response=httpClient.execute(httpPost);

创建一个CloseableHttpResponse去接受返回值

3.类方法

EntityUtils.toString(response.getEntity())//获取的返回值输出出来
httpClient.execute(httpPost);//调用HttpClient对象去执行请求
response.getStatusLine().getStatusCode()==200//判断返回的页面状态

4.post携带参数请求

List<NameValuePair> pairList=new ArrayList<NameValuePair>();
pairList.add(new BasicNameValuePair("qustion","wwww"));
UrlEncodedFormEntity formEntity=new UrlEncodedFormEntity(pairList,"utf-8");
httpPost.setEntity(formEntity);

因为post传输的是表格所有我们需要创建一个list来构建一个表格泛型选择NameValuePair,然后把list转换成功一个UrlEncodedFormEntity 表格

0x03连接池

每次创建一个HttpClient对象需要打开关闭很麻烦,所以有一个连接池实现自动化管理

PoolingHttpClientConnectionManager cm=new PoolingHttpClientConnectionManager();创建连接池

public void setMaxTotal(int max)设置最大连接数

public void setDefaultMaxPerRoute(int max)设置每个主机的并发数

HttpClient的配置

setConnectTimeout(1000) // 设置创建连接的最长时间

setConnectionRequestTimeout(500) //设置获取连接最长时间

setSocketTimeout(500).build();//设置数据传输最长时间

点击查看代码
package is.text;

import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils; import java.io.IOException; public class gethttp1params {
public static void main(String[] args) throws IOException {
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://www.baidu.com");
RequestConfig config = RequestConfig.custom().setConnectTimeout(1000) // 设置创建连接的最长时间
.setConnectionRequestTimeout(500) //设置获取连接最长时间
.setSocketTimeout(500).build(); //设置数据传输最长时间 httpGet.setConfig(config);
CloseableHttpResponse response = client.execute(httpGet);
String s = EntityUtils.toString(response.getEntity());
System.out.println(s); }
}
public class JAVA_test05 {
public static void main(String[] args) {
PoolingHttpClientConnectionManager cm=new PoolingHttpClientConnectionManager();
cm.setMaxTotal(10);
cm.setDefaultMaxPerRoute(2);
doget(cm);
doget(cm);
dopost(cm);
} private static void dopost(PoolingHttpClientConnectionManager cm) {
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
HttpPost httpPost = new HttpPost("https://www.baidu.com");
try {
CloseableHttpResponse response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode()==200);
} catch (IOException e) {
e.printStackTrace();
}
} private static void doget(PoolingHttpClientConnectionManager cm) {
CloseableHttpClient httpClient =HttpClients.custom().setConnectionManager(cm).build();
HttpGet httpGet=new HttpGet("http://www.baicu.com");
try {
httpClient.execute(httpGet);
CloseableHttpResponse response=httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode()==200){
String string = EntityUtils.toString(response.getEntity());
System.out.println(string);
}
} catch (IOException e) {
e.printStackTrace();
}
} }

0x04后文和总结

准备手写一个爬虫去尝试爬出一些文章,java的爬虫主要依赖于Jsoup,它可以实现的python爬虫的正则表达式功能和获取html解析分解内容,需要设计css和html的一些内容这里就把它放在新的板块

java学习之爬虫的更多相关文章

  1. Java学习-058-Jsoup爬虫获取中国所有的三级行政区划数据(三),处理二级编码缺失

    通过查看数据可知,直辖市或者某些三级行政区域没有对应的二级区域,为方便后续的地址使用,可自定义缺失的二级地址. 如下示例自定义的二级行政区域的名称为一级区域的名称,对应的源码如下所示: 将此段源码添加 ...

  2. Java学习-055-Jsoup爬虫通过设置获取响应数据大小的最大值,解决因默认获取 1MB 响应数据导致的无法获取全部的响应数据内容问题

    在日常工作中,通常会遇到获取各种网络数据使用的情况,Java中可使用Jsoup(Python中可使用 BeatifulSoup)进行数据的获取及处理. 今天有朋友问,在使用 Jsoup 进行请求数据时 ...

  3. Java学习-057-Jsoup爬虫获取中国所有的三级行政区划数据(二),并生成数据库 SQL 脚本插入语句

    多不废话,直接上马,小主您稳着... package com.fanfengping.zeus.uitl; import com.alibaba.fastjson.JSONObject; import ...

  4. Java学习-056-Jsoup爬虫获取中国所有的三级行政区划数据(一)

    在涉及地址服务时,经常需要用到地址信息的获取,而行政区划可能不定期的发生变化,所以我们需要获取最新的行政区划信息.因行政区划数据量较大,Java中可以使用Jsoup进行数据的获取.处理. 大家经常用到 ...

  5. Java学习-059-Jsoup爬虫获取中国所有的三级行政区划数据(四),生成相应的 JSON 数据并输出

    还是直接上马,对应的源码如下所示: 生成的三级行政区划部分 JSON 数据如下所示:

  6. Java 学习文章汇总

    目前JAVA可以说是产业界和学术界最热门的语言,许多人都很急切想把JAVA学好. 但学习是需要步骤的,除非像电影中演的那样,能够把需要的专业技巧下载到脑海:主角只花了几秒下载资料,就马上具备飞行员的技 ...

  7. 最新java学习路线:含阶段性java视频教程完整版

    最新java学习路线:带阶段性java视频教程版本 第一阶段:Java基础 学习目标: 掌握基本语法.面向对象.常用类.正则.集合.Io流.多线程.Nio.网络编程.JDK新特性.函数式编程 知识点细 ...

  8. 【Python】【爬虫】如何学习Python爬虫?

    如何学习Python爬虫[入门篇]? 路人甲 1 年前 想写这么一篇文章,但是知乎社区爬虫大神很多,光是整理他们的答案就够我这篇文章的内容了.对于我个人来说我更喜欢那种非常实用的教程,这种教程对于想直 ...

  9. Python学习网络爬虫--转

    原文地址:https://github.com/lining0806/PythonSpiderNotes Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scra ...

随机推荐

  1. HandInDevil 的头发 (分 块)

    题面 H a n d I n D e v i l \rm HandInDevil HandInDevil 的头发很油,因此随时有跳蚤跳上 H a n d I n D e v i l \rm HandI ...

  2. ifort + mkl + impi (全套intel)编译安装量子化学软件GAMESS 2022 R1版本

    说明:linux下编译软件都需要先配置好该软件依赖的系统环境.系统环境可以通过软件的安装说明了解,例如:readme.md等文件或网页.这个前提条件很重要!后面正式编译出错基本都可以归结到系统环境配置 ...

  3. 服务端挂了,客户端的 TCP 连接还在吗?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. 如果「服务端挂掉」指的是「服务端进程崩溃」,服务端的进程在发生崩溃的时候,内核会发送 ...

  4. KingbaseES R6 通过脚本构建集群案例

      案例说明: KingbaseES V8R6部署一般可采用图形化方式快速部署,但在生产一线,有的服务器系统未启用图形化环境,所以对于KingbaseES V8R6的集群需采用手工字符界面方式部署,本 ...

  5. 华南理工大学 Python第3章课后小测-1

    1.(单选)给出如下代码 s = 'Hello scut' print(s[::-1]) 上述代码的输出结果是(本题分数:4)A) HelloB) Hello scutC) olleH tucsD)  ...

  6. std:move() 作用 和 移动语义后 右值行为,unique_ptr的"移动"操作问题

    unique_ptr 不能进行赋值操作,但是可以有返回unique_ptr的函数,由此产生的问题: 结论1:std:move() 只是将一个实参强行转换为右值引用. 我们知道对象初始化时有 构造函数, ...

  7. Prometheus 监控 Kubernetes Job 资源误报的坑

    转载自:https://www.qikqiak.com/post/prometheus-monitor-k8s-job-trap/ 昨天在 Prometheus 课程辅导群里面有同学提到一个问题,是关 ...

  8. mysql8.0.25版本设置主从数据库,并且从库只读

    具体操作步骤 说明:主从数据库版本一致 1.主库创建同步使用的用户 create user 'repl'@'%' identified with 'mysql_native_password' by ...

  9. go-fastdfs和配套使用的web页面

    go-fastdfs go-fastdfs是一个基于http协议的分布式文件系统,它基于大道至简的设计理念,一切从简设计,使得它的运维及扩展变得更加简单,它具有高性能.高可靠.无中心.免维护等优点. ...

  10. C#并发编程-1 并发编程概述

    一 并发编程简介 1.1 关于并发和并行 并发和并行的概念: 并发:(Concurrent),在某个时间段内,如果有多个任务执行,即有多个线程在操作时,如果系统只有一个CPU,则不能真正同时进行一个以 ...