Python PycURL 网络编程

http://blog.chinaunix.net/uid-20544356-id-290882.html

在使用urllib的时候经常会死掉,以前debug过,是没有设置 timing out 所以超时后就会死掉。
PycURL是curl的python库,虽然有些curl的功能没有实现,但是还是很强劲的。 


curl是非常强劲的一个工具,
google内部用它来 debug GDATA API. Using cURL to interact with Google data services 


可以去 http://pycurl.sourceforge.net/ 下载最新的PycURL。 

简单的PycURL例子
import pycurl
import StringIO

url = "http://www.google.com/"
crl = pycurl.Curl()
crl.setopt(pycurl.VERBOSE,1)
crl.setopt(pycurl.FOLLOWLOCATION, 1)
crl.setopt(pycurl.MAXREDIRS, 5)
crl.fp = StringIO.StringIO()
crl.setopt(pycurl.URL, url)
crl.setopt(crl.WRITEFUNCTION, crl.fp.write)

# Option -b/--cookie <name=string/file> Cookie string or file to read cookies from
# Note: must be a string, not a file object.
crl.setopt(pycurl.COOKIEFILE, "cookie_file_name")

# Option -c/--cookie-jar <file> Write cookies to this file after operation
# Note: must be a string, not a file object.
crl.setopt(pycurl.COOKIEJAR, "cookie_file_name")

crl.perform()
print crl.fp.getvalue()
 
PycURL 实现POST方法
import pycurl
import StringIO
import urllib

url = "http://www.google.com/"
post_data_dic = {"name":"value"}
crl = pycurl.Curl()
crl.setopt(pycurl.VERBOSE,1)
crl.setopt(pycurl.FOLLOWLOCATION, 1)
crl.setopt(pycurl.MAXREDIRS, 5)
#crl.setopt(pycurl.AUTOREFERER,1)

crl.setopt(pycurl.CONNECTTIMEOUT, 60)
crl.setopt(pycurl.TIMEOUT, 300)
#crl.setopt(pycurl.PROXY,proxy)
crl.setopt(pycurl.HTTPPROXYTUNNEL,1)
#crl.setopt(pycurl.NOSIGNAL, 1)
crl.fp = StringIO.StringIO()
crl.setopt(pycurl.USERAGENT, "dhgu hoho")

# Option -d/--data <data> HTTP POST data
crl.setopt(crl.POSTFIELDS, urllib.urlencode(post_data_dic))

crl.setopt(pycurl.URL, url)
crl.setopt(crl.WRITEFUNCTION, crl.fp.write)
crl.perform()

print crl.fp.getvalue()
urllib 超时设置
import socket
socket.setdefaulttimeout(5.0)

 例子:

import pycurl
import StringIO

url = "http://www.google.com/"
crl = pycurl.Curl()
crl.setopt(pycurl.VERBOSE,1)
crl.setopt(pycurl.FOLLOWLOCATION, 1)
crl.setopt(pycurl.MAXREDIRS, 5)
crl.fp = StringIO.StringIO()
crl.setopt(pycurl.URL, url)
crl.setopt(crl.WRITEFUNCTION, crl.fp.write)
crl.perform()
print crl.fp.getvalue()
PycURL 自动处理cookie

结果:

* About to connect() to 10.75.19.79 port 8000 (#0)
*   Trying 10.75.19.79...
* Adding handle: conn: 0x6e2c10
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x6e2c10) send_pipe: 1, recv_pipe: 0
* Connected to 10.75.19.79 (10.75.19.79) port 8000 (#0)
> GET /autogrant/get_grants?port=3872&user=elink HTTP/1.1
User-Agent: PycURL/7.33.0
Host: 10.75.19.79:8000
Accept: */*

< HTTP/1.1 200 OK
< Content-Length: 1366
< Etag: "9c0345b5a8f0ae79f81d67bb2d64cf343704f7b6"
< Content-Type: text/html; charset=UTF-8
* Server TornadoServer/2.2.1 is not blacklisted
< Server: TornadoServer/2.2.1
< 
* Connection #0 to host 10.75.19.79 left intact
{"status": 0, "result": xxx}

 http://www.cnblogs.com/lexus/archive/2012/04/08/2437336.html

原文地址:https://www.cnblogs.com/gsblog/p/3476751.html