Java爬虫的实现
距离上一次写爬虫还是几年前了,那时候一直使用的是httpclient。
由于最近的项目又需要使用到爬虫,因此又重新查询了一些爬虫相关的框架,其中最合适的是WebMagic
官方文档:https://github.com/code4craft/webmagic
官方教程:http://webmagic.io/docs/zh/
WebMagic里面也是封装了httpclient来进行请求。因此不论是否直接使用WebMagic框架, 都是使用到了httpclient。
PS:httpclient3和4版本区别较大,下面代码均是在httpclient4的基础上进行测试开发。
HttpClient
1.创建HttpClient
- HttpClients.createDefault()
- HttpClients.createSystem()
- HttpClients.createMinimal()
- HttpClients.createMinimal(HttpClientConnectionManager)
2.post请求
2.1创建一个post请求
- String uri = "";
- HttpPost post = new HttpPost(uri);
2.2添加请求头
- post.setHeader("Connection", "keep-alive");
- post.setHeader("Accept-Encoding", "gzip, deflate");
- ......
2.3添加请求参数
- List<NameValuePair> list = new ArrayList<>();
- list.add(new BasicNameValuePair("username", "test"));
- list.add(new BasicNameValuePair("password", ""));
- post.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
2.4发起请求
- HttpResponse response = httpClient.execute(post);
3.get请求
3.1创建一个get请求
- String uri = "";
- URIBuilder uriBuilder = new URIBuilder(uri);
- HttpGet get = new HttpGet(uriBuilder.build());
3.2添加请求头
- get.setHeader("Connection", "keep-alive");
- get.setHeader("Accept-Encoding", "gzip, deflate");
- ......
3.3添加请求参数
- uriBuilder.setParameter("param1", "");
- uriBuilder.setParameter("param2", "");
- ......
3.4发起请求
- HttpResponse response = httpClient.execute(get);
4.响应信息
发起请求后都会获得一个响应对象HttpResponse。
响应中主要包含了响应头、状态码、响应信息。
状态码一般是200和302,302表示请求重定向,可以从它的响应头中获取重定向的新路径,再次发起请求,如下
- int statusCode = response.getStatusLine().getStatusCode();
- if (statusCode == ) {
- String location = response.getFirstHeader("location").getValue();
- System.out.println("302 new uri : " + location);
如果发起成功,可以读取里面的响应信息。
响应信息分为多种,如html、照片、文件、json等等。具体情况需要根据实际区分。
html、json
- String content = EntityUtils.toString(response.getEntity());
照片、文件
- HttpEntity entity = response.getEntity();
- OutputStream os = null;
- os = new FileOutputStream(pdfPath + filenames.get());
- InputStream is = entity.getContent();
- while (true) {//这个循环读取网络数据,写入本地文件
- byte[] bytes = new byte[ * ]; //1M
- int k = is.read(bytes);
- if (k >= ) {
- os.write(bytes, , k);
- os.flush();
- } else break;
- }
- os.close();
- is.close();
啊
Processor
Java爬虫的实现的更多相关文章
- webmagic的设计机制及原理-如何开发一个Java爬虫
之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...
- JAVA爬虫挖取CSDN博客文章
开门见山,看看这个教程的主要任务,就去csdn博客,挖取技术文章,我以<第一行代码–安卓>的作者为例,将他在csdn发表的额博客信息都挖取出来.因为郭神是我在大学期间比较崇拜的对象之一.他 ...
- 爬虫6:多页面增量Java爬虫-sina主页
之前写过很多单页面python爬虫,感觉python还是很好用的,这里用java总结一个多页面的爬虫,迭代爬取种子页面的所有链接的页面,全部保存在tmp路径下. 1 序言 实现这个爬虫需要两个数据结构 ...
- 推荐几个优秀的java爬虫项目
java爬虫项目 大型的: Nutch apache/nutch · GitHub 适合做搜索引擎,分布式爬虫是其中一个功能. Heritrix internetarchive/heritrix3 ...
- Java爬虫搜索原理实现
permike 原文 Java爬虫搜索原理实现 没事做,又研究了一下爬虫搜索,两三天时间总算是把原理闹的差不多了,基本实现了爬虫搜索的原理,本次实现还是俩程序,分别是按广度优先和深度优先完成的,广度优 ...
- JAVA爬虫 WebCollector
JAVA爬虫 WebCollector 爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. 爬虫 ...
- Java爬虫
作为一位Java爬虫的初学者,分享一下自己的心得.所用到的jar包 org.codehaus.jettison.jar jsoup-1.7.3.jar个人认为爬虫的实现机制:获取Docume对象-&g ...
- 爬虫入门 手写一个Java爬虫
本文内容 涞源于 罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的? 2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...
- JAVA爬虫实践(实践三:爬虫框架webMagic和csdnBlog爬虫)
WebMagic WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,你可以快速开发出一个高效.易维护的爬虫. 采用HttpClient可以实现定向的爬虫,也可以自己编写算法逻辑来 ...
- MinerUtil.java 爬虫工具类
MinerUtil.java 爬虫工具类 package com.iteye.injavawetrust.miner; import java.io.File; import java.io.File ...
随机推荐
- day22_3-json模块
# 参考资料:# python模块(转自Yuan先生) - 狂奔__蜗牛 - 博客园# https://www.cnblogs.com/guojintao/articles/9070485.html# ...
- JAVA基础_泛型
什么是泛型 泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉"类型"信息,是程序的运行效率不受影响 ...
- File、FileFilter、递归初步
java.io.File 文件和目录 路径名的抽象表示形式 文件:File 存储数据的 目录:Directory 文件夹 用来存储文件 路径:Path 定位具有平台无关性 在任意平台都可以使用 Fil ...
- 无法启动此程序,因此计算机中丢失VCRUNTIME140.dll。
在mysql-8.0.12-winx64创建data文件夹 在cmd终端 初始化 MYSQL: mysqld --initialize-insecure MySQL加入Windows服务:mysqld ...
- Java中循环体的初步了解以及另一种随机数的获取方法
Math中的相关操作 随机数 Java中除了可以直接导入Random类,获取随机数,还可以通过本身自带的Math方法去获取随机数.Math.random()可以产生随机小数,区间范围为[0.0,1.0 ...
- <Django>socket简单实现django简化版
服务端(自己实现django) ''' django简化版:socket服务端 a.收发浏览器信息----wsgiref.py b.根据用户访问的不同路径执行不同函数 c.从html读取出内容,并完成 ...
- POJ 1584 /// 判断圆(点)在多边形内 判断凸包
题目大意: 给定n,n边形 给定圆钉的 半径r 和圆心(x,y) 接下来n行是n边形的n个顶点(顺时针或逆时针给出) 判断n边形是否为凸包 若不是输出 HOLE IS ILL-FORMED 判断圆心和 ...
- DMZ在虚拟化环境中的部署
常见的方法有三种: 1.分别部署 2.部分虚拟化 3.全部虚拟化 传统DMZ部署结构: 分别部署: 想要保持DMZ区域物理隔离采用这种方法,每个区域分别部署进入不同的服务器集群,区域之间的连接采用物理 ...
- JVM的内存空间
一.JVM运行起来,就会给内存划分空间,这块空间成为运行时数据区.运行时数据区主要划分为以下几部分内容: 1.栈 每一个线程运行起来的都会对应一个栈(线程栈),栈中的数据是该线程独有的,不会产生资源共 ...
- EF Code First数据库连接配置
前面几节,使用的都是通过EF Code First创建的新数据库,接下来,将开始使用已存在的数据库. 1.使用配置文件设置数据库连接 App.config 数据库连接字符串的name与Data中Nor ...