代码样例-API接口
本文档包含调用快代理API的代码样例,供开发者参考。
代码样例使用说明
- 代码样例直接运行无法得到正确的结果,因为代码中的API链接是虚构的,您替换成自己真实的链接就可以正常运行了。
生成API链接:私密代理 独享代理 - 代码样例默认采用密钥令牌验证,需定期获取密钥令牌(secret_token),代码样例请参见代码样例-API密钥令牌
- 代码样例正常运行所需的运行环境和注意事项在样例末尾均有说明,使用前请仔细阅读。
- 使用代码样例过程中遇到问题请联系售后客服,我们会为您提供技术支持。
Python
requests
requests (python2/3)
使用提示
- 此样例支持 Python 2.6—2.7以及3.3—3.7
- requests不是python原生库,需要安装才能使用:
pip install requests
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""使用requests请求代理服务器
请求http和https网页均适用
"""
import requests
import random
page_url = "https://dev.kdlapi.com/testproxy" # 要访问的目标网页
# API接口,返回格式为json
api_url = "https://dps.kdlapi.com/api/getdps?secret_id=o1fjh1re9o28876h7c08&signature=oxf0n0g59h7wcdyvz2uo68ph2s&num=10&format=json&sep=1"
# API接口返回的ip
proxy_ip = requests.get(api_url).json()['data']['proxy_list']
# 用户名密码认证(私密代理/独享代理)
username = "username"
password = "password"
proxies = {
"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {'user': username, 'pwd': password, 'proxy': random.choice(proxy_ip)},
"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {'user': username, 'pwd': password, 'proxy': random.choice(proxy_ip)}
}
headers = {
"Accept-Encoding": "Gzip", # 使用gzip压缩传输数据让访问更快
}
r = requests.get(page_url, proxies=proxies, headers=headers)
print(r.status_code) # 获取Response的返回码
if r.status_code == 200:
r.enconding = "utf-8" # 设置返回内容的编码
print(r.content) # 获取页面内容
urllib2
urllib2 (python2)
#!/usr/bin/env python
#-*- coding: utf-8 -*-
"""使用urllib2调用API接口
"""
import urllib2
import zlib
#api链接
api_url = "https://dev.kdlapi.com/api/getproxy/?secret_id=o1fjh1re9o28876h7c08&signature=xxxxxx&num=100&protocol=1&method=2&an_ha=1&sep=1"
req = urllib2.Request(api_url)
req.add_header("Accept-Encoding", "Gzip") #使用gzip压缩传输数据让访问更快
r = urllib2.urlopen(req)
print r.code #获取Reponse的返回码
content_encoding = r.headers.getheader("Content-Encoding")
if content_encoding and "gzip" in content_encoding:
print zlib.decompress(r.read(), 16+zlib.MAX_WBITS) #获取页面内容
else:
print r.read() #获取页面内容
urllib
urllib (python3)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""使用urllib.request调用API接口(在python3中urllib2被改为urllib.request)
"""
import urllib.request
import zlib
#api链接
api_url = "https://dev.kdlapi.com/api/getproxy/?secret_id=o1fjh1re9o28876h7c08&signature=xxxxxx&num=100&protocol=1&method=2&an_ha=1&sep=1"
headers = {"Accept-Encoding": "Gzip"} #使用gzip压缩传输数据让访问更快
req = urllib.request.Request(url=api_url, headers=headers)
# 请求api链接
res = urllib.request.urlopen(req)
print(res.code) # 获取Reponse的返回码
content_encoding = res.headers.get('Content-Encoding')
if content_encoding and "gzip" in content_encoding:
print(zlib.decompress(res.read(), 16 + zlib.MAX_WBITS).decode('utf-8')) #获取页面内容
else:
print(res.read().decode('utf-8')) #获取页面内容
Java
jdk
使用原生库
package com.kuaidaili.sdk;
/**
* 使用jdk原生库调用API
*/
public class TestAPI {
private static String apiUrl = "https://dev.kdlapi.com/api/getproxy?secret_id=o1fjh1re9o28876h7c08&signature=xxxxxx&num=10&format=json&sep=1"; //API链接
public static void main(String[] args) {
HttpRequest request = new HttpRequest();
Map<String, String> headers = new HashMap<String, String>();
headers.put("Accept-Encoding", "gzip"); //使用gzip压缩传输数据让访问更快
try{
HttpResponse response = request.sendGet(apiUrl, null, headers, null);
System.out.println(response.getCode());
System.out.println(response.getContent());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
查看工具类HttpRequest和HttpResponse
HttpRequest.java
package com.kuaidaili.sdk;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Vector;
import java.util.zip.GZIPInputStream;
/**
* HTTP请求对象
*/
public class HttpRequest {
private String defaultContentEncoding;
private int connectTimeout = 1000;
private int readTimeout = 1000;
public HttpRequest() {
this.defaultContentEncoding = Charset.defaultCharset().name();
}
/**
* 发送GET请求
*
* @param urlString URL地址
* @param proxySettings 代理设置,null代表不设置代理
* @return 响应对象
*/
public HttpResponse sendGet(String urlString, final Map<String, String> proxySettings) throws IOException {
return this.send(urlString, "GET", null, null, proxySettings);
}
/**
* 发送GET请求
*
* @param urlString URL地址
* @param params 参数集合
* @param proxySettings 代理设置,null代表不设置代理
* @return 响应对象
*/
public HttpResponse sendGet(String urlString, Map<String, String> params, final Map<String, String> proxySettings)
throws IOException {
return this.send(urlString, "GET", params, null, proxySettings);
}
/**
* 发送GET请求
*
* @param urlString URL地址
* @param params 参数集合
* @param headers header集合
* @param proxySettings 代理设置,null代表不设置代理
* @return 响应对象
*/
public HttpResponse sendGet(String urlString, Map<String, String> params,
Map<String, String> headers, final Map<String, String> proxySettings) throws IOException {
return this.send(urlString, "GET", params, headers, proxySettings);
}
/**
* 发送POST请求
*
* @param urlString URL地址
* @param proxySettings 代理设置,null代表不设置代理
* @return 响应对象
*/
public HttpResponse sendPost(String urlString, final Map<String, String> proxySettings) throws IOException {
return this.send(urlString, "POST", null, null, proxySettings);
}
/**
* 发送POST请求
*
* @param urlString URL地址
* @param params 参数集合
* @param proxySettings 代理设置,null代表不设置代理
* @return 响应对象
*/
public HttpResponse sendPost(String urlString, Map<String, String> params, final Map<String, String> proxySettings)
throws IOException {
return this.send(urlString, "POST", params, null, proxySettings);
}
/**
* 发送POST请求
*
* @param urlString URL地址
* @param params 参数集合
* @param headers header集合
* @param proxySettings 代理设置,null代表不设置代理
* @return 响应对象
*/
public HttpResponse sendPost(String urlString, Map<String, String> params,
Map<String, String> headers, final Map<String, String> proxySettings) throws IOException {
return this.send(urlString, "POST", params, headers, proxySettings);
}
/**
* 发送HTTP请求
*/
private HttpResponse send(String urlString, String method,
Map<String, String> parameters, Map<String, String> headers, final Map<String, String> proxySettings)
throws IOException {
HttpURLConnection urlConnection = null;
if (method.equalsIgnoreCase("GET") && parameters != null) {
StringBuffer param = new StringBuffer();
int i = 0;
for (String key : parameters.keySet()) {
if (i == 0)
param.append("?");
else
param.append("&");
param.append(key).append("=").append(URLEncoder.encode(parameters.get(key), "utf-8"));
i++;
}
urlString += param;
}
URL url = new URL(urlString);
if(proxySettings != null){
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxySettings.get("ip"), Integer.parseInt(proxySettings.get("port"))));
urlConnection = (HttpURLConnection) url.openConnection(proxy);
if(proxySettings.containsKey("username")){
Authenticator authenticator = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return (new PasswordAuthentication(proxySettings.get("username"),
proxySettings.get("password").toCharArray()));
}
};
Authenticator.setDefault(authenticator);
}
}
else{
urlConnection = (HttpURLConnection) url.openConnection();
}
urlConnection.setRequestMethod(method);
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.setUseCaches(false);
urlConnection.setConnectTimeout(connectTimeout);
urlConnection.setReadTimeout(readTimeout);
if (headers != null)
for (String key : headers.keySet()) {
urlConnection.addRequestProperty(key, headers.get(key));
}
if (method.equalsIgnoreCase("POST") && parameters != null) {
StringBuffer param = new StringBuffer();
int i = 0;
for (String key : parameters.keySet()) {
if(i > 0) param.append("&");
param.append(key).append("=").append(URLEncoder.encode(parameters.get(key), "utf-8"));
i++;
}
System.out.println(param.toString());
urlConnection.getOutputStream().write(param.toString().getBytes());
urlConnection.getOutputStream().flush();
urlConnection.getOutputStream().close();
}
return this.makeContent(urlString, urlConnection);
}
/**
* 得到响应对象
*/
private HttpResponse makeContent(String urlString,
HttpURLConnection urlConnection) throws IOException {
HttpResponse response = new HttpResponse();
try {
InputStream in = urlConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
if ("gzip".equals(urlConnection.getContentEncoding())) bufferedReader = new BufferedReader(new InputStreamReader(new GZIPInputStream(in)));
response.contentCollection = new Vector<String>();
StringBuffer temp = new StringBuffer();
String line = bufferedReader.readLine();
while (line != null) {
response.contentCollection.add(line);
temp.append(line).append("\r\n");
line = bufferedReader.readLine();
}
bufferedReader.close();
String encoding = urlConnection.getContentEncoding();
if (encoding == null)
encoding = this.defaultContentEncoding;
response.urlString = urlString;
response.defaultPort = urlConnection.getURL().getDefaultPort();
response.file = urlConnection.getURL().getFile();
response.host = urlConnection.getURL().getHost();
response.path = urlConnection.getURL().getPath();
response.port = urlConnection.getURL().getPort();
response.protocol = urlConnection.getURL().getProtocol();
response.query = urlConnection.getURL().getQuery();
response.ref = urlConnection.getURL().getRef();
response.userInfo = urlConnection.getURL().getUserInfo();
response.contentLength = urlConnection.getContentLength();
response.content = new String(temp.toString().getBytes());
response.contentEncoding = encoding;
response.code = urlConnection.getResponseCode();
response.message = urlConnection.getResponseMessage();
response.contentType = urlConnection.getContentType();
response.method = urlConnection.getRequestMethod();
response.connectTimeout = urlConnection.getConnectTimeout();
response.readTimeout = urlConnection.getReadTimeout();
return response;
} catch (IOException e) {
throw e;
} finally {
if (urlConnection != null){
urlConnection.disconnect();
}
}
}
public static byte[] gunzip(byte[] bytes) {
if (bytes == null || bytes.length == 0) {
return null;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
try {
GZIPInputStream ungzip = new GZIPInputStream(in);
byte[] buffer = new byte[256];
int n;
while ((n = ungzip.read(buffer)) >= 0) {
out.write(buffer, 0, n);
}
} catch (IOException e) {
System.err.println("gzip uncompress error.");
e.printStackTrace();
}
return out.toByteArray();
}
/**
* 得到默认的响应字符集
*/
public String getDefaultContentEncoding() {
return this.defaultContentEncoding;
}
/**
* 设置默认的响应字符集
*/
public void setDefaultContentEncoding(String defaultContentEncoding) {
this.defaultContentEncoding = defaultContentEncoding;
}
public int getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
public int getReadTimeout() {
return readTimeout;
}
public void setReadTimeout(int readTimeout) {
this.readTimeout = readTimeout;
}
}
HttpResponse.java
package com.kuaidaili.sdk;
import java.util.Vector;
/**
* HTTP响应对象
*/
public class HttpResponse {
String urlString;
int defaultPort;
String file;
String host;
String path;
int port;
String protocol;
String query;
String ref;
String userInfo;
String contentEncoding;
int contentLength;
String content;
String contentType;
int code;
String message;
String method;
int connectTimeout;
int readTimeout;
Vector<String> contentCollection;
public String getContent() {
return content;
}
public String getContentType() {
return contentType;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
public Vector<String> getContentCollection() {
return contentCollection;
}
public String getContentEncoding() {
return contentEncoding;
}
public String getMethod() {
return method;
}
public int getConnectTimeout() {
return connectTimeout;
}
public int getReadTimeout() {
return readTimeout;
}
public String getUrlString() {
return urlString;
}
public int getDefaultPort() {
return defaultPort;
}
public String getFile() {
return file;
}
public String getHost() {
return host;
}
public String getPath() {
return path;
}
public int getPort() {
return port;
}
public String getProtocol() {
return protocol;
}
public String getQuery() {
return query;
}
public String getRef() {
return ref;
}
public String getUserInfo() {
return userInfo;
}
}
httpclient
HttpClient-4.5.6
使用提示
package com.kuaidaili.sdk;
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;
/**
* 使用httpclient调用API接口
*/
public class TestAPIHttpClient {
private static String apiUrl = "https://dev.kdlapi.com/api/getproxy/?secret_id=o1fjh1re9o28876h7c08&signature=xxxxxx&num=100&protocol=1&method=2&an_ha=1&sep=1"; //api链接
public static void main(String[] args) throws Exception {
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
HttpGet httpget = new HttpGet(apiUrl);
httpget.addHeader("Accept-Encoding", "gzip"); //使用gzip压缩传输数据让访问更快
System.out.println("Executing request " + httpget.getURI());
CloseableHttpResponse response = httpclient.execute(httpget);
try {
System.out.println(response.getStatusLine()); //获取Reponse的返回码
System.out.println(EntityUtils.toString(response.getEntity())); //获取API返回内容
} finally {
response.close();
}
} finally {
httpclient.close();
}
}
}
GoLang
标准库
package main
//GO版本 GO1
import (
"compress/gzip"
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
)
func main() {
// api链接
api_url := "https://svip.kdlapi.com/api/getproxy/?secret_id=o1fjh1re9o28876h7c08&signature=xxxxxx&num=100&protocol=1&method=2&an_an=1&an_ha=1&sep=1"
// 请求api链接
req, _ := http.NewRequest("GET", api_url, nil)
req.Header.Add("Accept-Encoding", "gzip") //使用gzip压缩传输数据让访问更快
client := &http.Client{}
res, err := client.Do(req)
// 处理返回结果
if err != nil {
// 请求发生异常
fmt.Println(err.Error())
} else {
defer res.Body.Close() //保证最后关闭Body
fmt.Println("status code:", res.StatusCode) // 获取状态码
// 有gzip压缩时,需要解压缩读取返回内容
if res.Header.Get("Content-Encoding") == "gzip" {
reader, _ := gzip.NewReader(res.Body) // gzip解压缩
defer reader.Close()
io.Copy(os.Stdout, reader)
os.Exit(0) // 正常退出
}
// 无gzip压缩, 读取返回内容
body, _ := ioutil.ReadAll(res.Body)
fmt.Println(string(body))
}
}
CSharp
标准库
using System;
using System.Text;
using System.Net;
using System.IO;
using System.IO.Compression;
namespace csharp_api
{
class Program
{
static void Main(string[] args)
{
// api链接
string api_url = "https://dev.kdlapi.com/api/getproxy/?secret_id=o1fjh1re9o28876h7c08&signature=xxxxxx&num=100&protocol=1&method=2&an_ha=1&sep=1";
// 请求目标网页
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(api_url);
request.Method = "GET";
request.Headers.Add("Accept-Encoding", "Gzip"); // 使用gzip压缩传输数据让访问更快
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.WriteLine((int)response.StatusCode); // 获取状态码
// 解压缩读取返回内容
using (StreamReader reader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))) {
Console.WriteLine(reader.ReadToEnd());
}
}
}
}
Node.js
内置http模块
const http = require('http'); // 引入内置http模块
let api_url = 'https://dev.kdlapi.com/api/getproxy/?secret_id=o1fjh1re9o28876h7c08&signature=xxxxxx&num=100&protocol=1&method=2&an_ha=1&sep=1'; // 要访问的目标网页
// 采用gzip压缩, 使速度更快
let options = {
"headers" : {
"Accept-Encoding": "gzip"
}
};
// 发起请求
http.get(api_url, options, (res) => {
// 若有gzip压缩, 则解压缩再输出
if (res.headers['content-encoding'] && res.headers['content-encoding'].indexOf('gzip') != -1) {
let zlib = require('zlib');
let gunzipStream = zlib.createGunzip();
res.pipe(gunzipStream).pipe(process.stdout);
} else {
// 无gzip压缩,直接输出
res.pipe(process.stdout);
}
}).on("error", (err) => {
// 错误处理
console.log("Error: " + err.message);
})
Ruby
net/http
net/http
# -*- coding: utf-8 -*-
require 'net/http' # 引入内置net/http模块
require 'zlib'
require 'stringio'
# 要访问的目标网页, 以京东首页为例
page_url = 'https://www.jd.com'
uri = URI(page_url)
# 创建新的请求对象
req = Net::HTTP::Get.new(uri)
# 设置User-Agent
req['User-Agent'] = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
req['Accept-Encoding'] = 'gzip' # 使用gzip压缩传输数据让访问更快
# 发起请求, 若访问的是http网页, 请将use_ssl设为false
res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => true) {|http|
http.request(req)
}
# 输出状态码
puts "status code: #{res.code}"
# 输出响应体
if res.code.to_i != 200 then
puts "page content: #{res.body}"
else
gz = Zlib::GzipReader.new(StringIO.new(res.body.to_s))
puts "page content: #{gz.read}"
end
httparty
httparty
require "httparty" # 引入httparty模块
require 'zlib'
require 'stringio'
# 要访问的目标网页, 以京东首页为例
page_url = 'https://www.jd.com'
# 设置headers
headers = {
"User-Agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Accept-Encoding" => "gzip",
}
# 发起请求
res = HTTParty.get(page_url, :headers => headers)
# 输出状态码
puts "status code: #{res.code}"
# 输出响应体
if res.code.to_i != 200 then
puts "page content: #{res.body}"
else
gz = Zlib::GzipReader.new(StringIO.new(res.body.to_s))
puts "page content: #{gz.read}"
end
php
Guzzle
Guzzle
使用提示
Guzzle是一个简单强大的http客户端库,需要安装才能使用:
1. 安装composer curl -sS https://getcomposer.org/installer | php
2. 安装Guzzle php composer.phar require guzzlehttp/guzzle:~6.0
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
//api链接
$api_url = "https://dev.kdlapi.com/api/getproxy/?secret_id=o1fjh1re9o28876h7c08&signature=xxxxxx&num=100&protocol=1&method=2&an_ha=1&sep=1";
$client = new Client();
$res = $client->request('GET', $api_url, [
'headers' => [
'Accept-Encoding' => 'gzip' // 使用gzip压缩让数据传输更快
]
]);
echo $res->getStatusCode(); //获取Reponse的返回码
echo "\n\n";
echo $res->getBody(); //获取API返回内容
?>
stream
使用stream流
<?php
// gzip解压缩函数
if (!function_exists('gzdecode')) {
function gzdecode($data) {
// strip header and footer and inflate
return gzinflate(substr($data, 10, -8));
}
}
//api链接
$api_url = "https://dev.kdlapi.com/api/getproxy/?secret_id=o1fjh1re9o28876h7c08&signature=xxxxxx&num=100&protocol=1&method=2&an_ha=1&sep=1";
$opts = array('http' =>
array(
'method' => 'GET',
'header' => 'Accept-Encoding: gzip', // 使用gzip压缩让数据传输更快
)
);
$context = stream_context_create($opts);
$result = file_get_contents($api_url, false, $context);
echo gzdecode($result); // 输出返回内容
?>
curl
curl
<?php
//api链接
$api_url = "https://dev.kdlapi.com/api/getproxy/?secret_id=o1fjh1re9o28876h7c08&signature=xxxxxx&num=100&protocol=1&method=2&an_ha=1&sep=1";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); //使用gzip压缩传输数据让访问更快
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
echo $result;
echo "\n\nfetch ".$info['url']."\ntimeuse: ".$info['total_time']."s\n\n";
?>