JAVA日记之javaJDK原生简单爬虫

2023-05-16

java原生爬虫

① 指定一个种子url放入到队列中
② 从队列中获取某个URL
③ 使用HTTP协议发起网络请求
④ 在发起网络请求的过程中,需要将域名转化成IP地址,也就是域名解析
⑤ 得到服务器的响应,此时是二进制的输入流
⑥ 将二进制的输入流转换成HTML文档,并解析内容(我们要抓取的内容,比如标题)。
⑦ 将解除出来的内容保持到数据库
⑧ 记录当前URL,并标记为已爬取,避免下次重复爬取。
⑨ 从当前的HTML文档中,解析出页面中包含的其它URL,以供下次爬取
⑩ 判断解析出来的URL是否已经爬取过了,如果已经爬取就丢弃掉
⑪将还没爬取过的URL,存放到等待爬取的URL队列中。
⑫ 重复以上的步骤,指导等待爬取的URL队列中没有数据

1.Get请求

package code.demo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import java.net.URL;
import java.net.URLConnection;

/*
模拟浏览器运行原理

发送请求得到响应


 */
public class GET {

    public static void main(String[] args) throws IOException {

        //1.资源地址url

        String zy= "https://www.baidu.com";

        //2.发送一网络请求client-server(web容器)
        //JDK  url
        URL url = new URL(zy);
        URLConnection urlConnection = url.openConnection();

        //3.发送数据get请求
        //4.得到相应数据,输入流(html二进制文档,字符流0)
        InputStream is = urlConnection.getInputStream();
        //5打印结果
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));


        String line=null;
        while ((line=bufferedReader.readLine())!=null){

            System.out.println(line);
        }



    }

}

2.Post请求

package code.demo;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

/*
模拟浏览器运行原理

发送请求得到响应


 */
public class POST {

    public static void main(String[] args) throws IOException {

        //1.指定资源地址url

        String zy = "https://www.baidu.com";

        //2.发送一网络请求client-server(web容器)
        //JDK  url
        URL url = new URL(zy);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        //设置请求头属性
        urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36");
        //打开dooutput,post必须加上,get默认即ok
        urlConnection.setDoOutput(true);
        //设置请求方式
        urlConnection.setRequestMethod("POST");

        //3.发送数据POST请求
        OutputStream outputStream = urlConnection.getOutputStream();
        outputStream.write("username=zhangsan&password=lisi".getBytes());
        outputStream.flush();
        outputStream.close();

        //4.得到相应数据,输入流(html二进制文档,字符流0)
        InputStream is = urlConnection.getInputStream();
        //5打印结果
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }


    }

}

使用阿帕奇的HttpClient包框架
1.get请求

导入pom
		<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>
package code.demo;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
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;
import java.net.URL;
import java.nio.charset.Charset;

public class HttpClienGet {

    public static void main(String[] args) throws IOException {

        //1.指定url

        String url= "http://www.baidu.com";
        //2.打开一个连接
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpClient httpclient = HttpClients.createDefault();

        //3.发送数据

        //4.执行并获得数据
        CloseableHttpResponse execute = httpclient.execute(httpGet);
        HttpEntity entity = execute.getEntity();

        //5.打印
        String s = EntityUtils.toString(entity, Charset.forName("utf-8"));
        System.out.println(s);
    }
}

2.post请求

package code.demo;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

public class HttpClienPost {

    public static void main(String[] args) throws IOException {

        //1.指定url

        String url= "http://www.baidu.com";
        //2.打开一个连接
        HttpPost httpPost = new HttpPost(url);
        CloseableHttpClient httpclient = HttpClients.createDefault();

        //3.发送数据
        List<NameValuePair> paramerter= new ArrayList<NameValuePair>();
        paramerter.add(new BasicNameValuePair("username","zhangsan"));
        paramerter.add(new BasicNameValuePair("password","lisi"));
        httpPost.setEntity(new UrlEncodedFormEntity(paramerter));

        //4.执行并获得数据
        CloseableHttpResponse execute = httpclient.execute(httpPost);
        HttpEntity entity = execute.getEntity();

        //5.打印
        String s = EntityUtils.toString(entity, Charset.forName("utf-8"));
        System.out.println(s);
    }
}


使用阿帕奇fluent更加加简洁

导入坐标
 		<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>fluent-hc</artifactId>
            <version>4.5.3</version>
        </dependency>

1.get and post请求

package code.demo;

import org.apache.http.client.fluent.Form;
import org.apache.http.client.fluent.Request;

import java.io.IOException;
import java.nio.charset.Charset;

/*

流畅的api
更简练
 */
public class HttpClientFluent {

    public static void main(String[] args) throws IOException {
        //get请求
        String s = Request.Get("http://www.baidu.com").execute().returnContent().asString(Charset.forName("utf-8"));
        System.out.println(s);

        //post请求,最好写上正确的地址和提交数据,不然报错
        String request = Request.Post("http://www.baidu.com").bodyForm(Form.form().add("username", "vip").add("password", "123").build()).execute().returnContent().asString(Charset.forName("utf-8"));
        System.out.println(request);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA日记之javaJDK原生简单爬虫 的相关文章

  • C++ 实现阻塞队列

    文章出处 xff0c 来源自地址 xff1a C 43 43 实现阻塞队列 文章 详细代码 xff1a include lt queue gt include lt thread gt include lt mutex gt include
  • 浏览器请求nodejs搭建的web服务器上的html文件时引用不了jQuery.js文件解决办法

    构建web服务器代码 nodejs构建 span class token comment 引入核心模块http和fs span span class token keyword var span http span class token
  • AI 到底是怎么「想」的?

    本文作者 xff1a kurffzhou xff0c 腾讯 TEG 安全工程师 最近 xff0c Nature发表了一篇关于深度学习系统被欺骗的新闻文章 xff0c 该文指出了对抗样本存在的广泛性和深度学习的脆弱性 xff0c 以及几种可能
  • kafka3.1 docker-compose方式安装(二)

    ZooKeeper 是为 Kafka 提供协调服务的工具 xff0c 所以得启动一个ZooKeeper 容器 配置文件 docker compose yml span class token key atrule version span
  • 效能优化实践:C/C++单元测试万能插桩工具

    作者 xff1a mannywang xff0c 腾讯安全平台后台开发 研发效能是一个涉及面很广的话题 xff0c 它涵盖了软件交付的整个生命周期 xff0c 涉及产品 架构 开发 测试 运维 xff0c 每个环节都可能影响顺畅 高质量地持
  • Windows使用cmd刷入recovery.img

    Windows使用cmd刷入recovery img Windows键 43 R回车后进入cmd命令终端 进入fastboot 手机进入fastboot模式有2种方法 第一种进入方法是 xff0c 如果你的手机能用adb识别到 xff0c
  • Linux系统安装环境桌面

    最近工作加班还有在弄大数据 xff0c 有段时间没有记录了 xff0c 后续有空的话整理下大数据的东西分享 xff0c 今天记录下Linux安装环境桌面 之前弄了个阿里云服务器玩玩 xff0c CentOS 7的版本 xff0c CentO
  • 【Linux学习笔记】关于ubuntu开机菜单栏和任务栏不见了的有效解决方法

    一 问题描述 ubuntu开机只有桌面 xff0c 没有菜单栏和任务栏 xff0c 如下图 xff1a 二 问题解决 刚学习ubuntu xff0c 总有些像我这样不折腾就不舒服的人 xff0c 今天改了一下主题 xff0c 图标什么的 x
  • 【数据结构与算法】深入浅出递归和迭代的通用转换思想

    深入浅出递归和迭代的通用转换思想 一般来说 xff0c 能用迭代的地方就不要用递归 xff01 理论上讲 xff0c 所有的递归和迭代之间都能相互转换 xff01 刷题碰到 一天一道LeetCode 130 Surrounded Regio
  • 【unix网络编程第三版】阅读笔记(二):套接字编程简介

    unp第二章主要将了TCP和UDP的简介 xff0c 这些在 TCP IP详解 和 计算机网络 等书中有很多细致的讲解 xff0c 可以参考本人的这篇博客 计算机网络 第五版 阅读笔记之五 xff1a 运输层 xff0c 这篇博客就不再赘述
  • 带你深入理解STL之Deque容器

    在介绍STL的deque的容器之前 xff0c 我们先来总结一下vector和list的优缺点 vector在内存中是分配一段连续的内存空间进行存储 xff0c 其迭代器采用原生指针即可 xff0c 因此其支持随机访问和存储 xff0c 支
  • 带你深入理解STL之Set和Map

    在上一篇博客 带你深入理解STL之RBTree中 xff0c 讲到了STL中关于红黑树的实现 xff0c 理解起来比较复杂 xff0c 正所谓前人种树 xff0c 后人乘凉 xff0c RBTree把树都种好了 xff0c 接下来就该set
  • Redis源码剖析--字符串t_string

    前面一直在分析Redis的底层数据结构 xff0c Redis利用这些底层结构设计了它面向用户可见的五种数据结构 xff0c 字符串 哈希 xff0c 链表 xff0c 集合和有序集合 xff0c 然后用redisObject对这五种结构进
  • 制作启动盘安装Ubuntu 18.04.1

    1 使用UltraISO制作启动盘 首先 xff0c 下载Ubuntu镜像文件 链接 xff1a https pan baidu com s 1saIJuLzAR5ojc7 F3EQ Q 提取码 xff1a 1hc1 打开UItralISO
  • Redis源码剖析--快速列表quicklist

    在RedisObject这一篇博客中 xff0c 有介绍到list结构的底层编码类型有OBJ ENCODING QUICKLIST xff0c 当时就发现这个底层数据结构被我遗漏了 昨天花了点时间补了补这个知识 xff0c 看完发现这货就跟
  • Redis源码剖析--列表list

    上一篇博客Redis源码剖析 快速列表 带大家一起剖析了quicklist这个底层数据结构的实现原理 Redis对外开放的列表list结构就是采用quicklist作为底层实现 xff08 在新版本的Redis源码中 xff0c 不再采用z
  • lottie图片图层的json参数

    https juejin cn post 6992014666159357989
  • Android 各镜像文件img详解

    Android编译后生成文件 xff0c 在out target product xxx下 xff1a cache img cust img metadata img misc img xff08 本地无 xff09 recovery im
  • Android 10 来袭

    Android 10围绕三个重要主题构建 首先 xff0c Android 10正在塑造移动创新的领先优势 xff0c 具有先进的机器学习功能 xff0c 并支持新兴设备 xff0c 如可折叠和5G手机 接下来 xff0c Android
  • python代码规范 以及如何处理Pycharm的波浪号警告

    一 命名规范 1 模块名和包名采用小写字母并且以下划线分隔单词的形式 xff1b 如 regex syntax py compile winreg 2 类名或异常名采用每个单词首字母大写的方式 xff1b 如 xff1a BaseServe

随机推荐

  • java 两数相除 四舍五入 精确 保留2位小数点、任意位小数点

    java 四舍五入 精确 保留2位小数点 任意位小数点 int i 61 4 int j 61 14 float result 61 float i j java text DecimalFormat format 61 java text
  • 电脑关机或重启C盘数据被清空还原问题

    电脑关机后清空数据是因为电脑装有还原精灵 xff0c 可以下载冰点破坏工具 还原精灵破坏工具 硬盘保护卡破坏工具来取消数据的清空 电脑重启不还原 xff0c 方法如下 xff1a 方案一 一般情况下可以用带FDISK的启动盘启动电脑 xff
  • 敏捷教练的十种能力

    1 具备神奇的 读懂一个房间 的能力 只要走进一个房间 xff0c 就能判断出不在的过程中 xff0c 房间里发生了什么事情 xff0c 能立即读出空气中蕴含的情绪 xff0c 从而判断是否一切正常 xff1b 2 关心人本身胜过关心产品
  • Java数组之二分法查找数

    数组的二分法查找数据 使用前提 xff1a 查找的数组必须是有序的 span class token keyword public span span class token keyword class span span class to
  • MQ 队列管理器常见错误解析

    消息管理器无法连接到目标队列管理器 请确保以下事项 xff1a 在 消息管理器 队列管理器定义中所定义的端口与通道侦听器使用的端口相匹配 WebSphere MQ 队列管理器通道侦听器已启动 WebSphere MQ 队列管理器命令服务器已
  • 【简单理解】ubuntu中的sudo和su

    参考 xff1a https blog csdn net liberty12345678 article details 87686284 https cloud tencent com developer article 1721753
  • 那些女程序员们的故事

    点击上方蓝字 关注我们 xff0c 和小伙伴一起聊技术 xff01 程序媛是程序员大军中一道美丽的风景线 xff0c 今天的这篇文章就选取了一些女程序员们的故事 xff0c 希望当所有人了解了他们的经历后 xff0c 能让这个 重男轻女 的
  • 直播分享丨前沿技术讲习班:知识图谱前沿技术与应用(CIPS ATT27)

    本文转载自公众号 xff1a 智源社区助手 作为大数据时代重要的知识表示方式 xff0c 知识图谱是人工智能领域构建和应用知识的新阶段 xff0c 它能够更好地实现大规模数据的认知与推理 同时 xff0c 知识图谱和深度学习相互协作 xff
  • 图谱实战 | 京东基于时序知识图谱的问答系统

    转载公众号 DataFunSummit 分享嘉宾 xff1a 商超博士 京东硅谷研究院 研究员 编辑整理 xff1a 张存旺 北航杭州创新研究院 出品平台 xff1a DataFunTalk 导读 xff1a 本文将分享Temporal K
  • 肖仰华 | 基于知识图谱的问答系统

    本文转载自公众号知识工场 本文整理自复旦大学知识工场肖仰华教授在VLDB 2017 会议上的论文报告 xff0c 题目为 KBQA Learning Question Answering over QA Corpora and Knowle
  • 研讨会 | 知识图谱前沿技术课程暨学术研讨会(武汉大学站)

    知识图谱作为大数据时代重要的知识表示方式之一 xff0c 已经成为人工智能领域的一个重要支撑 4月 28日 xff0c 武汉大学信息集成与应用实验室 与 复旦大学知识工场实验室 联合举办 知识图谱前沿技术课程暨学术研讨会 xff0c 将结合
  • jdbc中Statement和PreparedStatement有什么区别?哪个性能更好?

    Statement和PreparedStatement的功能主要是对sql语句的执行 区别 xff08 1 xff09 Statement每执行一条sql语句就需要生成一条执行计划 xff0c 执行100条就需要100条执行计划Prepar
  • redis的特性

    redis的特性 承接上文redis入门篇 xff0c 本文具体介绍一下redis的特性 xff0c 以及与另外一个nosql数据库memcached的对比 一 redis的优点 根据上文 xff0c 我们知道redis的如下特性成为了他的
  • Ubuntu22.04安装windows字体

    找到C Windows目录 xff0c 将其中的Fonts文件夹拷贝至ubuntu中 将该文件夹放至ubuntu的 usr share fonts目录下面 xff0c 可用下列命令 span class token function sud
  • 阿里巴巴笔试题选解

    阿里巴巴笔试题选解 9月22日 xff0c 阿里巴巴北邮站 小题 xff1a 1 有三个结点 xff0c 可以构成多少种二叉树形结构 xff1f 2 一副牌52 张 去掉大小王 xff0c 从中抽取两张牌 xff0c 一红一黑的概率是多少
  • ActiveMQ与Logback日志组件SLF4J冲突导致日志不输出

    ActiveMQ与Logback中的SLF4J日志组件冲突导致日志不输出 xff0c 控制台提示 Class path contains multiple SLF4J bindings 的解决方案 近期码的时候发现logback的组件日志都
  • 腾讯2014软件开发笔试题目

    腾讯2014软件开发笔试题目 9月21日 xff0c 腾讯2014软件开发校招 简答题 广州 简答题 xff1a 1 请设计一个排队系统 xff0c 能够让每个进入队伍的用户都能看到自己在 中所处的位置和变化 队伍可能随时有人加入和退出 x
  • C++ 进程间通信详解

    一 xff0c C 43 43 常用进程间通信 管道 Pipe xff1a 管道可用于具有亲缘关系进程间的通信 xff0c 允许一个进程和另一个与它有共同祖先的进程之间进行通信 命名管道 named pipe xff1a 命名管道克服了管道
  • OTA系统包的制作和测试方法

    OTA有两种制作方案 整包升级 xff0c 以及差分包升级 整包升级 完整的升级文件aosp XXXX XXX ota 01 20 010 00 00 zip 差异包 将第一个ota整包升级包和第二个ota整包升级包 xff0c 执行 bu
  • JAVA日记之javaJDK原生简单爬虫

    java原生爬虫 指定一个种子url放入到队列中 从队列中获取某个URL 使用HTTP协议发起网络请求 在发起网络请求的过程中 xff0c 需要将域名转化成IP地址 xff0c 也就是域名解析 得到服务器的响应 xff0c 此时是二进制的输