OkHttp的特性优点及爬虫示例

简介: OkHttp是一个Java和Android应用程序的HTTP客户端库,旨在提高资源加载速度和节省带宽。这段代码用于从大众点评网站上采集某个城市中包含某个关键词的景点信息。代码使用了OkHttp和jsoup库来发送HTTP请求和解析HTML响应。具体来说,程序通过发送HTTP GET请求获取包含特定关键词的城市中所有景点的列表,然后对每个景点分别发送HTTP GET请求获取其名称、简介和评论信息,并将这些信息保存在ScenicSpot类的对象中,程序还使用了爬虫加强版代理IP避免被大众点评网站封禁。

01010.png

OkHttp是一个Java和Android应用程序的HTTP客户端库,旨在提高资源加载速度和节省带宽。与其他类似的库相比,它具有以下优点和区别:

一、OkHttp的特性和优点

  • 支持HTTP/2协议,可提高效率和速度;
  • 支持连接池,减少请求延迟;
  • 支持透明的GZIP压缩,减少数据量;
  • 支持响应缓存,避免重复网络请求;
  • 支持现代的TLS特性,如TLS 1.3、ALPN、证书锁定等;
  • 可在网络不稳定时自动恢复连接;
  • 请求/响应API设计简洁易用,支持同步阻塞调用和异步回调调用;
  • 基于传输层实现应用层协议的网络框架,比HttpUrlConnection更高效和灵活;

二、OkHttp与其他网络框架的比较

  • Retrofit是基于OkHttp封装的一个RESTful风格的网络框架,可以使用注解来定义接口,并自动转换JSON等格式的数据;
  • Volley是Google开发的一个轻量级的网络框架,可以实现图片加载、缓存、优先级控制等功能,但不支持同步调用和文件上传下载等功能;

总的来说,OkHttp是一个适合处理各种复杂网络请求场景的性能优异、功能强大、易于使用的HTTP客户端库。马上就是五一假期,通过采集大众点评获取附近的景点信息可以快速确定出行方案,用OkHttp和爬虫加强版代理IP就可以方便的实现如下:

// 导入所需的库importcom.squareup.okhttp.*;
importorg.jsoup.Jsoup;
importorg.jsoup.nodes.Document;
importorg.jsoup.nodes.Element;
importorg.jsoup.select.Elements;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.concurrent.CountDownLatch;
// 定义一个景点类,用于存储景点的信息classScenicSpot {
privateStringname; // 景点名称privateStringurl; // 景点链接privateStringintro; // 景点简介privateList<String>comments; // 景点评论publicScenicSpot(Stringname, Stringurl) {
this.name=name;
this.url=url;
this.intro="";
this.comments=newArrayList<>();
    }
publicStringgetName() {
returnname;
    }
publicStringgetUrl() {
returnurl;
    }
publicStringgetIntro() {
returnintro;
    }
publicvoidsetIntro(Stringintro) {
this.intro=intro;
    }
publicList<String>getComments() {
returncomments;
    }
publicvoidaddComment(Stringcomment) {
this.comments.add(comment);
    }
@OverridepublicStringtoString() {
return"ScenicSpot{"+"name='"+name+'\''+", url='"+url+'\''+", intro='"+intro+'\''+", comments="+comments+'}';
    }
}
// 定义一个回调接口,用于异步处理响应interfaceCallbackHandler {
voidhandle(Responseresponse) throwsIOException;
}
// 定义一个爬虫类,用于采集大众点评的景点信息classDianpingCrawler {
// 大众点评的网址privatestaticfinalStringBASE_URL="http://www.dianping.com";     
//亿牛云动态转发代理IP 爬虫加强版 代理服务地址privatestaticfinalStringPROXY_HOST="www.16yun.cn"; 
//亿牛云动态转发代理IP 爬虫加强版 代理端口号privatestaticfinalintPROXY_PORT=8080; 
//亿牛云动态转发代理IP 爬虫加强版 代理用户名privatestaticfinalStringPROXY_USERNAME="16YUN"; 
//亿牛云动态转发代理IP 爬虫加强版 代理密码privatestaticfinalStringPROXY_PASSWORD="16IP";
privateOkHttpClientclient; // OkHttp客户端对象publicDianpingCrawler() {
// 创建一个OkHttpClient对象,并配置代理和认证信息client=newOkHttpClient();
Proxyproxy=newProxy(Proxy.Type.HTTP, newInetSocketAddress(PROXY_HOST, PROXY_PORT));
Authenticatorauthenticator=newAuthenticator() {
@OverridepublicRequestauthenticate(Proxyproxy, Responseresponse) throwsIOException {
Stringcredential=Credentials.basic(PROXY_USERNAME, PROXY_PASSWORD);
returnresponse.request().newBuilder()
                        .header("Proxy-Authorization", credential)
                        .build();
            }
@OverridepublicRequestauthenticateProxy(Proxyproxy, Responseresponse) throwsIOException {
returnnull;
            }
        };
client.setProxy(proxy);
client.setAuthenticator(authenticator);
    }
// 发送一个GET请求,并使用回调接口处理响应publicvoidget(Stringurl, CallbackHandlercallbackHandler) throwsIOException {
Requestrequest=newRequest.Builder()
                .url(url)
                .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36")
                .build();
client.newCall(request).enqueue(newCallback() {
@OverridepublicvoidonFailure(Requestrequest, IOExceptione) {
e.printStackTrace();
            }
@OverridepublicvoidonResponse(Responseresponse) throwsIOException {
callbackHandler.handle(response);
            }
        });
    }
// 根据城市和关键词获取景点列表的网址publicStringgetScenicListUrl(Stringcity, Stringkeyword) {
returnBASE_URL+"/search/keyword/"+city+"/0_"+keyword;
    }
// 根据景点列表的网址获取景点对象的列表publicList<ScenicSpot>getScenicSpots(StringscenicListUrl) throwsIOException {
List<ScenicSpot>scenicSpots=newArrayList<>();
// 发送一个GET请求,获取景点列表的网页内容get(scenicListUrl, response-> {
// 解析网页内容,提取景点的名称和链接Documentdocument=Jsoup.parse(response.body().string());
Elementselements=document.select(".shop-list .shop-name");
for (Elementelement : elements) {
Stringname=element.text();
Stringurl=BASE_URL+element.attr("href");
// 创建一个景点对象,并添加到列表中ScenicSpotscenicSpot=newScenicSpot(name, url);
scenicSpots.add(scenicSpot);
            }
        });
returnscenicSpots;
    }
// 根据景点对象获取景点的简介和评论publicvoidgetScenicInfo(ScenicSpotscenicSpot) throwsIOException {
// 发送一个GET请求,获取景点的网页内容get(scenicSpot.getUrl(), response-> {
// 解析网页内容,提取景点的简介和评论Documentdocument=Jsoup.parse(response.body().string());
Stringintro=document.select(".shop-intro").text();
Elementselements=document.select(".comment-list .content");
List<String>comments=newArrayList<>();
for (Elementelement : elements) {
Stringcomment=element.text();
comments.add(comment);
            }
// 设置景点对象的简介和评论scenicSpot.setIntro(intro);
scenicSpot.getComments().addAll(comments);
        });
    }
// 根据城市和关键词获取附近TOP20的景点介绍以及每个景点TOP的评价publicList<ScenicSpot>getTopScenicSpots(Stringcity, Stringkeyword) throwsIOException, InterruptedException {
// 获取景点列表的网址StringscenicListUrl=getScenicListUrl(city, keyword);
// 获取景点对象的列表List<ScenicSpot>scenicSpots=getScenicSpots(scenicListUrl);
// 创建一个倒计时锁,用于等待所有异步请求完成CountDownLatchcountDownLatch=newCountDownLatch(scenicSpots.size());
// 遍历每个景点对象,获取其简介和评论,并在完成后减少倒计时锁的计数for (ScenicSpotscenicSpot : scenicSpots) {
getScenicInfo(scenicSpot);
countDownLatch.countDown();
        }
// 等待所有异步请求完成countDownLatch.await();
// 返回前20个景点对象的列表returnscenicSpots.subList(0, 20);
    }
// 测试方法,打印结果publicstaticvoidmain(String[] args) throwsIOException, InterruptedException {
DianpingCrawlercrawler=newDianpingCrawler();
List<ScenicSpot>scenicSpots=crawler.getTopScenicSpots("1", "景点");
for (ScenicSpotscenicSpot : scenicSpots) {
System.out.println(scenicSpot);
        }
    }
}

这段代码用于从大众点评网站上采集某个城市中包含某个关键词的景点信息。代码使用了OkHttp和jsoup库来发送HTTP请求和解析HTML响应。具体来说,程序通过发送HTTP GET请求获取包含特定关键词的城市中所有景点的列表,然后对每个景点分别发送HTTP GET请求获取其名称、简介和评论信息,并将这些信息保存在ScenicSpot类的对象中,程序还使用了爬虫加强版代理IP避免被大众点评网站封禁。


相关文章
|
6月前
|
数据采集 Perl
错误处理在网络爬虫开发中的重要性:Perl示例 引言
错误处理在网络爬虫开发中的重要性:Perl示例 引言
|
8月前
|
数据采集 JavaScript 前端开发
TypeScript 和 jsdom 库创建爬虫程序示例
TypeScript 和 jsdom 库创建爬虫程序示例
|
数据采集 Python
python网络爬虫,爬百度的示例
python网络爬虫,爬百度的示例
175 2
|
数据采集 Python
python的网络爬虫示例
python的网络爬虫示例
73 2
|
XML 数据采集 Web App开发
XPath数据提取与贴吧爬虫应用示例
XPath(XML Path Language)是一种用于在XML文档中定位和选择节点的语言。它提供了一种简洁的方式来遍历和提取XML文档中的数据。
135 1
|
数据采集 JavaScript Python
python爬虫示例,获取主页面链接,次级页面链接通过主页面元素获取从而避免js生成变动的值,保存数据分批次避免数据丢失
python爬虫示例,获取主页面链接,次级页面链接通过主页面元素获取从而避免js生成变动的值,保存数据分批次避免数据丢失
117 0
|
数据采集 Java API
商品评论数据爬虫 评论列表 翻页显示 API调用示例
商品评论数据爬虫 评论列表 翻页显示 API调用示例
|
数据采集 存储 算法
Python爬虫必备技能,使用 动态代理ip 获取Steam 热销商品 示例
动态代理ip 相信大家肯定都听说过,或者已经使用过。 本篇文章就来介绍一下什么是动态代理ip,还有一个使用代理ip爬取Youtube游戏模块主页。 使用动态ip有很多好处,比如保护你的网络免受外部攻击、屏蔽你的IP地址等。 那本篇文章就来研究一下这个动态ip,对这方面不了解的小伙伴正好可以一起学习一下。
Python爬虫必备技能,使用 动态代理ip 获取Steam 热销商品 示例
|
数据采集 JavaScript Docker
Python爬虫:splash的安装与简单示例
Python爬虫:splash的安装与简单示例
471 0
Python爬虫:splash的安装与简单示例
|
数据采集 存储 关系型数据库
基于Python的爬虫演示示例-以电影网站为例
爬取的数据最终会存到MYSQL服务器的表中,可以写程序将数据展示出来。注意的时会对IP进行限制封号,200条为限,超过IP会被限制,可以换一个IP进行抓去。主要研究爬虫的基本使用规范和语法,相对较为简单,供大家学习参考
253 0