利用 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.84 和 60.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