curl 和 libcurl 小技巧

本文介绍如何使用curl和pycurl通过SSH建立SOCKS5代理访问特定网站,同时演示了如何利用curl验证不同服务器上的文件一致性。

利用 curl 和 pycurl

需要 curl 和 libcurl 的版本高于 7.18.0,并且事先建立好可的代理,例如用 SSH 建立 SOCKS5 代理:

[
nobody@
www ~]
$ ssh
 username@
omehost.com -CN
 -f
 -D
 127.0.0.1:1080

curl 使用方法

[
nobody@
www ~]
$ curl http://
twitter.com/
 --socks5-hostname
 127.0.0.1:1080

Python 通过 pycurl 的使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import
 pycurl
import StringIO
sio = StringIO .StringIO ( )

url = "http://www.twitter.com/"

c = pycurl.Curl ( )
c.setopt ( pycurl.URL , url.encode ( 'utf-8' ) )
c.setopt ( pycurl.WRITEFUNCTION , sio.write )
c.setopt ( pycurl.FOLLOWLOCATION , 1 )
c.setopt ( pycurl.MAXREDIRS , 5 )
c.setopt ( pycurl.PROXY , '127.0.0.1:1080' )
c.setopt ( pycurl.PROXYTYPE , pycurl.PROXYTYPE_SOCKS5_HOSTNAME )
c.perform ( )

print sio.getvalue ( )

pycurl 官方还没有把 libcurl 这个特性加入,需要在 pycurl/src/pycurl.c 中添加一行(点击查看 diff 格式的补丁 ,for pycurl-7.19.0

1
2
3564d3563

< insint_c(
d, "PROXYTYPE_SOCKS5_HOSTNAME", CURLPROXY_SOCKS5_HOSTNAME)
;

PHP 通过 php-curl 的使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
<
 ?php
$url = "http://twitter.com/" ;

$ch = curl_init ( ) ;
curl_setopt ( $ch , CURLOPT_URL, $url ) ;
curl_setopt ( $ch , CURLOPT_HEADER, 0 ) ;
curl_setopt ( $ch , CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME) ;
curl_setopt ( $ch , CURLOPT_PROXY, "127.0.0.1:1080" ) ;

curl_exec ( $ch ) ;

curl_close ( $ch ) ;
?>

PHP 官方也还没有把 libcurl 这个特性加入,需要在 ext/curl/interface.c 中添加(点击查看 diff 格式的补丁 ,for php-5.3.4

1
2
3
4
5
6
7
8
9
10
756
,764d755

< /* CURLPROXY_SOCKS5_HOSTNAME support works in 7.18.0+ */

< #if LIBCURL_VERSION_NUM >= 0x071200

< REGISTER_CURL_CONSTANT(
CURLOPT_PROXY_TRANSFER_MODE)
;

<       REGISTER_CURL_CONSTANT(
CURLPROXY_SOCKS4A)
;

<       REGISTER_CURL_CONSTANT(
CURLPROXY_SOCKS5_HOSTNAME)
;

<       REGISTER_CURL_CONSTANT(
CURLOPT_SEEKFUNCTION)
;

<       REGISTER_CURL_CONSTANT(
CURLOPT_SEEKDATA)
;

< #endif

<

利用 curl 验证不同服务器上的文件

很多时候网站并不是一个 IP 地址,而是分布在多个 IP 地址上。这些 IP 地址通过智能解析,分配到离用户最快的节点上(CDN 就是干这个的 )。如何验证这些 IP 地址上的文件或者内容是否一致呢?通过 curl 抓文件的时候,如果希望指定抓取网站某个服务器的内容,除了比较土的修改 HOSTS 文件,还可以通过 curl 来做。例如 www.sina.com.cn 至少有这两个 IP 地址:

202.108.33.8460.215.128.131

[
nobody@
www ~]
$ curl http://
202.108.33.84/
 -H
 "Host: www.sina.com.cn"
  -I

HTTP/
1.0
 200
 OK
Date: Sat, 25
 Dec 2010
 12
:10
:17
 GMT
Server: Apache/
2.0.63 (
Unix)

Last-Modified: Sat, 25
 Dec 2010
 12
:09:06 GMT
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/
0.0.1vhs.markIII.remix
Cache-Control: max-age=60

Expires: Sat, 25
 Dec 2010
 12
:11
:17
 GMT
Vary: Accept-Encoding
X-UA-Compatible: IE
=EmulateIE7
Content-Type: text/
html
Age: 5

Content-Length: 518162

X-Cache: HIT from xd33-84.HP08040023.sina.com.cn
Connection: close
[
nobody@
www ~]
$ curl http://
60.215.128.131/
 -H
 "Host: www.sina.com.cn"
  -I

HTTP/
1.0
 200
 OK
Date: Sat, 25
 Dec 2010
 12
:11
:45
 GMT
Server: Apache/
2.0.63 (
Unix)

Last-Modified: Sat, 25
 Dec 2010
 12
:09:06 GMT
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/
0.0.1vhs.markIII.remix
Cache-Control: max-age=60

Expires: Sat, 25
 Dec 2010
 12
:12
:45
 GMT
Vary: Accept-Encoding
X-UA-Compatible: IE
=EmulateIE7
Content-Type: text/
html
Age: 42

Content-Length: 518162

X-Cache: HIT from sd128-131.sina.com.cn
Connection: close

20101205 发布的最新版 curl 和 libcurl(7.21.3)增加了一个 --resolve CURLOPT_RESOLVE ,能够更优雅的解决这个问题。本来这两个参数是为了使用者能够更灵活的调整缓 存,也能够避免出现 HTTPS 相关的证书问题。可以参考这个使用方法:

[
nobody@
www ~]
$ curl --resolve
 "encrypted.google.com:443:46.82.174.68"
 https://
encrypted.google.com/
 -I
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值