Java爬虫(一)利用GET和POST发送请求,获取服务器返回信息
本人所使用软件
- eclipse
- fiddle
- UC浏览器
分析请求信息
以知乎(https://www.zhihu.com)为例,模拟登陆请求,获取登陆后首页,首先就是分析请求信息。
用UC浏览器F12,点击Network,按F5刷新。使用自己账号登陆知乎后,点www.zhihu.com网址后,出现以下界面
在General中,看到请求方式是GET,在fiddle里请求构造中,方法选定GET。
下拉后,看到Request Header,将里面所有的内容复制下来,粘贴到fiddle的请求构造里
点击Execute,在fiddle中点击访问的网址,点击嗅探,点击下方的TextView,发现并没有显示内容
删除部分无用的Request Header,点击Execute,发现返回数据成功!
发送请求信息,获取数据
从以上的分析可以知道,访问知乎需要的Request Header,只需要有COOKIE就足够了,因此,我们将请求构造里帮我们格式化的内容,复制到txt文件内
接下来就是使用Java发送请求信息了。发送请求信息很简单,就直接贴出代码共同讨论。
package Main;
import Java.io.IOException;
import java.io.InputStream;
import java.NET.HttpURLConnection;
import java.util.HashMap;
import java.util.Map;
import Utils.HttpUtils;
import Utils.HttpUtils.OnVisitingListener;
import Utils.StreamUtils;
import Utils.StreamUtils.OnGetStringListener;
public class Main {
public static void main(String[] args) {
// 获取网页数据
getWebData();
// 设置参数
// 得到返回数据
}
private static void getWebData() {
HttpUtils httpUtils = HttpUtils.newInstance();
httpUtils.setOnVisitingListener(new OnVisitingListener() {
@Override
public void onSuccess(HttpURLConnection conn) {
try {
InputStream inputStream = conn.getInputStream();
String string = StreamUtils.getString(inputStream);
System.out.println(string);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSetDetails(HttpURLConnection conn, HttpUtils httpUtils) {
Map<String, String> map = new HashMap<String, String>();
StreamUtils.getString("requestheader.txt", new OnGetStringListener() {
@Override
public void onGeted() {
}
@Override
public void onGetString(String line) {
System.out.println(line);
String[] strings = line.split(":");
map.put(strings[0], strings[1]);
}
});
httpUtils.setRequestProperties(map);
}
@Override
public void onFail(IOException e) {
}
}).startConnenction("https://www.zhihu.com/", "GET");
}}
Utils封装工具类
package Utils;
import java.io.IOException;
import java.io.PrintWriter;
import java.Net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Created by admin on 2016/3/2.
*/
public class HttpUtils {
private HttpURLConnection conn;
public void setConnection(String fileUrl, String method) throws IOException {
URL url = new URL(fileUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(method);
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
listener.onSetDetails(conn, this);
conn.connect();
}
OnVisitingListener listener;
public interface OnVisitingListener {
void onSuccess(HttpURLConnection conn);
void onSetDetails(HttpURLConnection conn, HttpUtils httpUtils);
void onFail(IOException e);
}
public HttpUtils setOnVisitingListener(OnVisitingListener listener) {
this.listener = listener;
return this;
}
public void startConnenction(String url, String method) {
try {
setConnection(url, method);
if (conn.getResponseCode() == 200) {
listener.onSuccess(conn);
} else {
throw new IOException();
}
} catch (IOException e) {
listener.onFail(e);
}
// if (conn != null) {
// conn.disconnect();
// }
}
public void setRequestProperties(Map<String, String> map) {
String key;
String value;
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
key = it.next();
value = map.get(key);
conn.setRequestProperty(key, value);
}
}
public void setRequestBody(String body) {
try {
PrintWriter writer = new PrintWriter(conn.getOutputStream());
writer.write(body);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void setRequestProperty(String type, String value) {
conn.setRequestProperty(type, value);
}
public static HttpUtils newInstance() {
return new HttpUtils();
}
}
package Utils;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexUtils {
public static String RegexGroup(String targetStr, String patternStr, int which) {
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(targetStr);
if (matcher.find()) {
return matcher.group(which);
}
return “Nothing!”;
}
public static List<String> RegexGroups(String targetStr, String patternStr, int which) {
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(targetStr);
List<String> list = new ArrayList<String>();
while (matcher.find()) {
list.add(matcher.group(which));
}
return list;
}
public static String RegexString(String targetStr, String patternStr) {
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(targetStr);
if (matcher.find()) {
return matcher.group();
}
return "Nothing!";
}}
package Utils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
/**
* Created by admin on 2016/2/18.
*/
public class StreamUtils {
public static String readFromStream(InputStream inputStream) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
String result = outputStream.toString();
inputStream.close();
outputStream.close();
return result;
}
private static String line;
public static FileReader createFileReader(File file) throws FileNotFoundException {
return new FileReader(file);
}
public static FileWriter createFileWriter(File file) throws IOException {
return new FileWriter(file);
}
public static InputStreamReader createInputStreamReader(Object obj) {
if (obj instanceof File)
if (!((File) obj).exists())
((File) obj).getParentFile().mkdirs();
try {
return new InputStreamReader(new FileInputStream((File) obj), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
public static OutputStreamWriter createOutputStreamWriter(Object obj) {
if (obj instanceof File)
if (!((File) obj).exists())
((File) obj).getParentFile().mkdirs();
try {
return new OutputStreamWriter(new FileOutputStream((File) obj, true), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
public static BufferedReader createBufferedReader(Object obj, String cd) throws IOException {
if (obj instanceof String)
return new BufferedReader(createInputStreamReader(new File((String) obj)));
if (obj instanceof InputStream) {
if (cd == null)
return new BufferedReader(new InputStreamReader((InputStream) obj));
else
return new BufferedReader(new InputStreamReader((InputStream) obj, cd));
}
if (obj instanceof File) {
if (!((File) obj).exists())
((File) obj).createNewFile();
return new BufferedReader(createFileReader((File) obj));
}
if (obj instanceof Reader)
return new BufferedReader((Reader) obj);
if (obj instanceof BufferedReader)
return (BufferedReader) obj;
return null;
}
public static BufferedWriter createBufferedWriter(Object obj) throws IOException {
if (obj instanceof String)
return new BufferedWriter(createOutputStreamWriter(new File((String) obj)));
if (obj instanceof OutputStream)
return new BufferedWriter(new OutputStreamWriter((OutputStream) obj, "utf-8"));
if (obj instanceof File)
return new BufferedWriter(createOutputStreamWriter(obj));
if (obj instanceof Writer)
return new BufferedWriter((Writer) obj);
if (obj instanceof BufferedWriter)
return (BufferedWriter) obj;
return null;
}
public interface OnGetStringListener {
void onGetString(String line);
void onGeted();
}
public static void getString(Object obj, OnGetStringListener listener) {
BufferedReader br;
try {
br = createBufferedReader(obj, null);
if (br != null) {
while ((line = br.readLine()) != null) {
listener.onGetString(line);
}
listener.onGeted();
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static String getString(Object obj) {
BufferedReader br;
String str = "";
try {
br = createBufferedReader(obj, "utf-8");
if (br != null) {
while ((line = br.readLine()) != null) {
str += line + "\n";
}
}
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
public static void writeString(Object obj, String str) {
BufferedWriter bw;
try {
bw = createBufferedWriter(obj);
if (bw != null) {
bw.write(str);
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
发送POST请求
发送POST请求和GET没有太大区别,只不过POST请求需要设置Request Body。在连接之前,得到输出流,写入fiddle里面的Request Body数据就可以。
Java爬虫(一)利用GET和POST发送请求,获取服务器返回信息的更多相关文章
- RestTemplate发送请求并携带header信息 RestTemplate post json格式带header信息
原文地址: http://www.cnblogs.com/hujunzheng/p/6018505.html RestTemplate发送请求并携带header信息 v1.使用restTempl ...
- 向.net后端发送请求获取数据,在前端动态填充表格
实现效果 实现步骤 通过Ajax请求的方式 1.在前端定义Table 2.通过Ajax向.net后端发送数据请求 3.在.net后端定义方法供前端调用,并返回所需的数据 4.通过构造字符串的方式,将后 ...
- 微信接口开发1--向微信发送请求--获取access_token
//随便放置一个php文件在服务器上.执行该方法--调用模拟get提交---到微信-->获得微信返回的access_token 不建议自己编写模拟get提交方法. 建议直接导入微信框架LaneW ...
- 20200726_java爬虫_使用HttpClient模拟浏览器发送请求
浏览器获取数据: 打开浏览器 ==> 输入网址 ==> 回车查询 ==> 返回结果 ==> 浏览器显示结果数据 HttpClient获取数据: 创建HttpClient ==& ...
- RestTemplate发送请求并携带header信息
1.使用restTemplate的postForObject方法 注:目前没有发现发送携带header信息的getForObject方法. HttpHeaders headers = new Http ...
- [笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求
原地址:http://www.9miao.com/question-15-53940.html 好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不 ...
- 使用post向webservice发送请求,并且返回值
注意,这个方法仅仅适用于:该post页面处于websercive 站点下,或者是与webservice同属于一个主站点,即在iis里属于同一主站点的同级虚拟目录. protected void btn ...
- 发送请求获取响应内容(c#)
C#请求url,获取响应的脚本 public string ResultOfApi(string url) { //发送请求 HttpWebRequest request = null; HttpWe ...
- HTTP Cookies知识-查看、发送、获取、返回
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 HTTP Cookies是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求 ...
随机推荐
- C++STL的简单使用
#include <iostream>#include <vector>#include<deque>#include <list>#include&l ...
- 【原】老生常谈-从输入url到页面展示到底发生了什么
刚开始写这篇文章还是挺纠结的,因为网上搜索“从输入url到页面展示到底发生了什么”,你可以搜到一大堆的资料.而且面试这道题基本是必考题,二月份面试的时候,虽然知道这个过程发生了什么,不过当面试官一步步 ...
- javaScript绑定事件委托 demo
事件绑定通常发生在 onload 或 DOMContentReady , 事件绑定占用 处理时间 占用内存, 而且不是每个事件都会被 点击执行. 由此 事件委托 可以优化事件绑定行为.. 事件逐层冒泡 ...
- iOS开发之数据存储之NSData
1.概述 使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中,但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象. NSDat ...
- Web移动端的常用组件库
normalize http://necolas.github.io/normalize.css/ 最受欢迎的css reset 保留有用的默认值,这个区别于其他的CSS resets 标准化大范围的 ...
- Python 一些有趣的技巧哦!
#Python 技巧命令 python 如一股清流,可以说屌到飞起,下面咱就来看看一些屌的东西 ### python2 最简单的web服务 ` python -m SimpleHTTPServer 8 ...
- Python之路-字符编码&数据类型补充
作业 三级菜单程序 menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{ }, '网易':{ }, 'google':{ } }, '中关村':{ '爱奇艺':{}, '汽车 ...
- Java进阶之网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- 性能调优案例分享:Mysql的cpu过高
性能调优案例分享:Mysql的cpu过高 问题:一个系统,Mysql数据库,数据量变大之后.mysql的cpu占用率很高,一个测试端访问服务器时mysql的cpu占用率为15% ,6个测试端连服务 ...
- CF #401 (Div. 2) E. Hanoi Factory (栈+贪心)
题意:给你一堆汉诺塔的盘子,设内半径为a,设外半径为b,高度为h,如果bj ≤ bi 同时bj > ai 我们就认为i盘子能落在在j盘子上,问你最高能落多高 思路:一看题意我们就能想到贪心,首先 ...