JAVA爬虫初识之httpclient与jsoup
2017-07-18 19:04
573 查看
最近接触爬虫相关知识,将学习和网上了解到的一些东西记录下来,以便以后需要。(删除重新发一次)
通过这段时间的学习和使用,在我个人粗陋的理解来看,httpclient其实就是一个模拟浏览器跟服务器通信的工具,它代替了浏览器向服务器发送请求并接收服务器的回应,主要来讲就是报文了,模拟请求然后接收服务器的响应报文配合jsoup解析响应报文从而抓取到自己想要的东西。
但它又不是真正的浏览器,它没有浏览器的将响应报文实体解析成网页、执行内部js等等功能。说白了它的功能就是请求+接收响应(目前接触来看)。
2.创建httpclient对象:
3.根据请求方法创建请求方法的示例,以请求的服务器url为参数,如get()方法和post()方法:
4.根据上篇介绍的http请求的组成,还要给请求报文设置请求头、请求需要提交的参数信息等,请求的服务器不同,需要的设置也不同,详细的模拟登录再记录,简单的如:
5.在设置完相应的参数后,调用httpclient的execute方法发送请求,该方法返回一个httpresponse
6.Response即为服务器返回的响应报文,我们可以调用HttpResponse的getEntity()和getHeader()方法获取响应报文的响应实体和响应头,根据http通信机制,一般来说响应报文的报文实体即为服务器返回的网页代码,里面会有相应的信息,我们需要的也就是里面的信息,所以我们可以将返回的网页源代码以字符串的形式保存起来,在我们需要取数据的时候配合jsoup将其解析成DOM。
7.最后在完成通信后释放连接
目前使用接触来看,jsoup实现了java后台对页面的操作,就像js对页面的取值,jsoup可以将之前保存的String类型的页面解析成DOM树,调用jsoup封装的方法可以对DOM树节点操作取值。比如:
其封装的常用方法总结模拟登录时再总结,亦可参考中文文档Jsoup中文使用手册
运行结果:
httpclient
httpclient是什么?
官方一点的介绍是:HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。通过这段时间的学习和使用,在我个人粗陋的理解来看,httpclient其实就是一个模拟浏览器跟服务器通信的工具,它代替了浏览器向服务器发送请求并接收服务器的回应,主要来讲就是报文了,模拟请求然后接收服务器的响应报文配合jsoup解析响应报文从而抓取到自己想要的东西。
但它又不是真正的浏览器,它没有浏览器的将响应报文实体解析成网页、执行内部js等等功能。说白了它的功能就是请求+接收响应(目前接触来看)。
使用步骤
1.jar包下载:官网或者httpclient-4.42.创建httpclient对象:
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
3.根据请求方法创建请求方法的示例,以请求的服务器url为参数,如get()方法和post()方法:
HttpGet httpGet = new HttpGet("www.baidu.com"); HttpPost httpPost = new HttpPost("www.baidu.com");
4.根据上篇介绍的http请求的组成,还要给请求报文设置请求头、请求需要提交的参数信息等,请求的服务器不同,需要的设置也不同,详细的模拟登录再记录,简单的如:
//伪装成浏览器 String userAgent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"; httpGet.addHeader("User-Agent","useAgent");
5.在设置完相应的参数后,调用httpclient的execute方法发送请求,该方法返回一个httpresponse
CloseableHttpResponse response = httpClient.execute(httpGet);
6.Response即为服务器返回的响应报文,我们可以调用HttpResponse的getEntity()和getHeader()方法获取响应报文的响应实体和响应头,根据http通信机制,一般来说响应报文的报文实体即为服务器返回的网页代码,里面会有相应的信息,我们需要的也就是里面的信息,所以我们可以将返回的网页源代码以字符串的形式保存起来,在我们需要取数据的时候配合jsoup将其解析成DOM。
HttpEntity entity = response.getEntity(); String html = EntityUtils.toString(entity, "utf-8");
7.最后在完成通信后释放连接
httpGet.releaseConnection();
Jsoup
什么是jsoup
jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。该版本包含一个支持 HTML5 的解析器分支,可确保跟现在的浏览器一样解析 HTML 的方法,同时降低了解析的时间和内存的占用。目前使用接触来看,jsoup实现了java后台对页面的操作,就像js对页面的取值,jsoup可以将之前保存的String类型的页面解析成DOM树,调用jsoup封装的方法可以对DOM树节点操作取值。比如:
Document doc = Jsoup.parse(html);
其封装的常用方法总结模拟登录时再总结,亦可参考中文文档Jsoup中文使用手册
用httpclient和jsoup获取知乎登录页面的_xsrf数据
代码总结httpclient和jsoup的使用,_xsrf是知乎登录时请求需要携带的一个参数,在登录页面的网页源代码中即可找到(每次不一样)import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; 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.HttpClientBuilder; import org.apache.http.util.EntityUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; public class ZhiHu { boolean daili = false; HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); CloseableHttpClient httpClient = httpClientBuilder.build(); private HttpHost proxy = new HttpHost("127.0.0.1",8888,"http"); private String useage = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"; private RequestConfig configtime=RequestConfig.custom().setCircularRedirectsAllowed(true).setSocketTimeout(10000).setConnectTimeout(10000).build(); public ZhiHu() { } /** * 获取页面 * @param url * @return */ public String getPageHtml(String url) { String html=""; HttpGet httpget = new HttpGet(url); httpget.addHeader("User-Agent", useage); httpget.setConfig(configtime); try { CloseableHttpResponse response = httpClient.execute(httpget); HttpEntity entity = response.getEntity(); html = EntityUtils.toString(entity, "utf-8"); httpget.releaseConnection(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return html; } /** * 获取_xsrf */ public String get_xsrf(String url) { String page = getPageHtml(url); Document doc = Jsoup.parse(page); Elements srfs = doc.getElementsByAttributeValue("name", "_xsrf"); String xsrf = srfs.first().attr("value"); return xsrf; } public static void main(String[] args) { ZhiHu zhihu = new ZhiHu(); String _xsrf = zhihu.get_xsrf("http://www.zhihu.com"); System.out.println(_xsrf); } }
运行结果:
相关文章推荐
- Java爬虫Jsoup+httpclient获取动态生成的数据
- Java爬虫进阶-Jsoup+httpclient获取动态生成的数据
- Java爬虫学习:利用HttpClient和Jsoup库实现简单的Java爬虫程序
- Java爬虫实现爬取京东上的手机搜索页面 HttpCliient+Jsoup
- Java爬虫走过的坑:org.apache.http.impl.client.HttpClientBuilder.dnsResolver
- 使用jsoup和httpclient编写的简单爬虫工具
- Java爬虫(五)-- httpClient进阶:使用代理(详细解析)
- java中使用jsoup 和httpclient
- 学习笔记-spring-mybatis-jsoup-http-client小说站点爬虫(1)--获取小说站点章节列表
- HttpClient基础知识(java爬虫03)
- Java爬虫(三)-- httpClient 模拟登录 + cookie 登录状态管理
- JAVA爬虫初识之HTTP通信机制
- 网络爬虫利器:fiddle+httpclient+jsoup
- Java爬虫(七)- httpClient进阶: https 和 证书认证(讲故事篇)
- Java爬虫入门简介(一) —— HttpClient请求及其使用方法
- Java爬虫入门简介(一) —— HttpClient请求及其使用方法
- 【网络爬虫】【java】微博爬虫(二):如何抓取HTML页面及HttpClient使用
- JAVA编写网络爬虫笔记(第二部分:httpClient下载页面)
- JAVA 爬虫之httpclient post请求提交表单获取Ajax数据
- Java简单爬虫系列(2)---HttpClient的使用