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. ServletFileUpload 文件上传

    import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadExcepti ...

  2. 【java】基础1-字符串、堆、栈、静态与引用类型

    /*结论:1,一般变量(int,float,boolean..)使用==比较,引用类型(String,int[],对象)使用equals比较.2,一般的变量存放在栈中,new出来的对象都存放在堆中,字 ...

  3. C# for循环创建多线程

    这里仅讨论Task多线程编程,不讨论其他可以使用多线程的情况,比如Beginxxx,Thread等 一般情况下,如果有多个线程需要同是启动,且每个线程中使用了集合collection中的序号. 比如参 ...

  4. AtCoder Beginner Contest 255(E-F)

    Aising Programming Contest 2022(AtCoder Beginner Contest 255) - AtCoder E - Lucky Numbers 题意: 给两个数组a ...

  5. springboot 集成 docsify 实现随身文档

    需求分析 文档可以和项目一起进行版本管理 文档可以在线访问 文档可以与springboot项目集成,不需要分开部署 MarkDown支持 文档跟随,打包jar也可以访问 技术选型 对于网上已有的方案, ...

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

    1.(单选)下面语句的输出结果是: ls = [] def func(a, b): ls.append(b) return a*b s = func("hi", 2) print( ...

  7. 输入法词库解析(六)QQ 拼音分类词库.qpyd

    详细代码:https://github.com/cxcn/dtool 前言 .qpyd 是 QQ 拼音输入法 6.0 以下版本所用的词库格式,可以在 http://cdict.qq.pinyin.cn ...

  8. Python数据科学手册-机器学习:朴素贝叶斯分类

    朴素贝叶斯模型 朴素贝叶斯模型是一组非常简单快速的分类方法,通常适用于维度非常高的数据集.因为运行速度快,可调参数少.是一个快速粗糙的分类基本方案. naive Bayes classifiers 贝 ...

  9. Python数据科学手册-Pandas:合并数据集

    将不同的数据源进行合并 , 类似数据库 join merge . 工具函数 concat / append pd.concat() 简易合并 合并高维数据 默认按行合并. axis=0 ,试试 axi ...

  10. 【项目实战】pytorch实现逻辑斯蒂回归

    视频指导:https://www.bilibili.com/video/BV1Y7411d7Ys?p=6 一些数据集 在pytorch框架下,里面面有配套的数据集,pytorch里面有一个torchv ...