java学习之爬虫
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学习之爬虫的更多相关文章
- Java学习-058-Jsoup爬虫获取中国所有的三级行政区划数据(三),处理二级编码缺失
通过查看数据可知,直辖市或者某些三级行政区域没有对应的二级区域,为方便后续的地址使用,可自定义缺失的二级地址. 如下示例自定义的二级行政区域的名称为一级区域的名称,对应的源码如下所示: 将此段源码添加 ...
- Java学习-055-Jsoup爬虫通过设置获取响应数据大小的最大值,解决因默认获取 1MB 响应数据导致的无法获取全部的响应数据内容问题
在日常工作中,通常会遇到获取各种网络数据使用的情况,Java中可使用Jsoup(Python中可使用 BeatifulSoup)进行数据的获取及处理. 今天有朋友问,在使用 Jsoup 进行请求数据时 ...
- Java学习-057-Jsoup爬虫获取中国所有的三级行政区划数据(二),并生成数据库 SQL 脚本插入语句
多不废话,直接上马,小主您稳着... package com.fanfengping.zeus.uitl; import com.alibaba.fastjson.JSONObject; import ...
- Java学习-056-Jsoup爬虫获取中国所有的三级行政区划数据(一)
在涉及地址服务时,经常需要用到地址信息的获取,而行政区划可能不定期的发生变化,所以我们需要获取最新的行政区划信息.因行政区划数据量较大,Java中可以使用Jsoup进行数据的获取.处理. 大家经常用到 ...
- Java学习-059-Jsoup爬虫获取中国所有的三级行政区划数据(四),生成相应的 JSON 数据并输出
还是直接上马,对应的源码如下所示: 生成的三级行政区划部分 JSON 数据如下所示:
- Java 学习文章汇总
目前JAVA可以说是产业界和学术界最热门的语言,许多人都很急切想把JAVA学好. 但学习是需要步骤的,除非像电影中演的那样,能够把需要的专业技巧下载到脑海:主角只花了几秒下载资料,就马上具备飞行员的技 ...
- 最新java学习路线:含阶段性java视频教程完整版
最新java学习路线:带阶段性java视频教程版本 第一阶段:Java基础 学习目标: 掌握基本语法.面向对象.常用类.正则.集合.Io流.多线程.Nio.网络编程.JDK新特性.函数式编程 知识点细 ...
- 【Python】【爬虫】如何学习Python爬虫?
如何学习Python爬虫[入门篇]? 路人甲 1 年前 想写这么一篇文章,但是知乎社区爬虫大神很多,光是整理他们的答案就够我这篇文章的内容了.对于我个人来说我更喜欢那种非常实用的教程,这种教程对于想直 ...
- Python学习网络爬虫--转
原文地址:https://github.com/lining0806/PythonSpiderNotes Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scra ...
随机推荐
- Html飞机大战(一):绘制动态背景
好家伙,飞机大战终于开始弄了 这会有很多很多复杂的东西,但是我们总要从最简单,和最基础的部分开始, 我们先从背景开始弄吧! 1.绘制静态背景 这里我们会用到canvas <!DOCTYPE ...
- 第四十四篇:Git分支(关键知识点)
好家伙, GIT分支 分支就像是平行宇宙,两个平行宇宙自己平行,不相干扰,平安无事, 某一天它想不开,合并了.然后就变成了我写这篇博客的动机了. 1.关于Git分支中常用的指令 列出所有分支 git ...
- git merge和git rebase总结
dev分支 * da349ef (dev) e * 75350bc d * 63cbbb8 c * c6509a5 b * 13405af a 文件可能会发生冲突,需要解决一下 aaaaaaaaa b ...
- B树-插入
B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 插入 根据B树的以下两个特性 每一个结点最多有m个子结点 有k个子结点的非叶子结点拥有 k − 1 个键 可以得出 ...
- Lua CallbackHell优化
概述 在异步操作中,常常要使用回调.但是,回调的嵌套常常会导致逻辑混乱,一步错步步错,难以维护.在Lua中,可以使用协程进行优化. 问题分析 模拟一个回合制游戏攻击过程 local function ...
- .NET 7 来了!!!
.NET 7 首个RC(发布候选)版本 最近 .Net 的大事件,就是微软发布了.NET 7的首个RC(发布候选)版本,而据微软发布的消息,这是 .NET 7 的最后一个预览版,下一个版本将是第一个候 ...
- kali2020.1修改root密码,以最高权限登录系统
普通用户权限登录系统 sodu su切换为root权限 passwd root 按提示输入密码 再次输入密码 更新密码 右上角点切换用户 root/xxxx 更改成功,下面公布操图片
- 配置git环境与项目创建
主要用于记录上课笔记,方便以后复习 acgit的地址:https://git.acwing.com/wyw/kob1/ 1. 项目模块的包含 1.1 采用前后端分离 Web端大概框架 2. git环境 ...
- 使用logstash同步mysql 多表数据到ElasticSearch实践
参考样式即可,具体使用配置参数根据实际情况而定 input { jdbc { jdbc_connection_string => "jdbc:mysql://localhost/数据库 ...
- 基于electron+vue+element构建项目模板之【打包篇】
1.概述 开发平台OS:windows 开发平台IDE:vs code 本项目使用了一款Vue-CLI插件(vue-cli-plugin-electron-builder) 来构建 electron ...