Jimmygao 发布的文章

以下转自

http://blog.csdn.net/pleasecallmewhy/article/details/8925978

Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节描述的并不清楚,比如 urllib2 这个 HTTP 客户端库。这里总结了一些 urllib2 的使用细节。

Proxy 的设置

urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用下面的方式

import urllib2
 
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
 
if enable_proxy:
opener = urllib2.build_opener(proxy_handler)
else:
opener = urllib2.build_opener(null_proxy_handler)
 
urllib2.install_opener(opener)

这里要注意的一个细节,使用 urllib2.install_opener() 会设置 urllib2 的全局 opener 。这样后面的使用会很方便,但不能做更细粒度的控制,比如想在程序中使用两个不同的 Proxy 设置等。比较好的做法是不使用 install_opener 去更改全局的设置,而只是直接调用 opener 的 open 方法代替全局的 urlopen 方法。

Timeout 设置

在老版 Python 中,urllib2 的 API 并没有暴露 Timeout 的设置,要设置 Timeout 值,只能更改 Socket 的全局 Timeout 值。

import urllib2
import socket
 
socket.setdefaulttimeout(10) # 10 秒钟后超时
urllib2.socket.setdefaulttimeout(10) # 另一种方式

在 Python 2.6 以后,超时可以通过 urllib2.urlopen() 的 timeout 参数直接设置。

import urllib2
response = urllib2.urlopen('http://www.google.com', timeout=10)

在 HTTP Request 中加入特定的 Header

要加入 header,需要使用 Request 对象:

import urllib2
 
request = urllib2.Request(uri)
request.add_header('User-Agent', 'fake-client')
response = urllib2.urlopen(request)

对有些 header 要特别留意,服务器会针对这些 header 做检查

User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求 Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。常见的取值有: application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用 application/json : 在 JSON RPC 调用时使用 application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用 在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务

Redirect

urllib2 默认情况下会针对 HTTP 3XX 返回码自动进行 redirect 动作,无需人工配置。要检测是否发生了 redirect 动作,只要检查一下 Response 的 URL 和 Request 的 URL 是否一致就可以了。

import urllib2
response = urllib2.urlopen('http://www.google.cn')
redirected = response.geturl() == 'http://www.google.cn'

如果不想自动 redirect,除了使用更低层次的 httplib 库之外,还可以自定义HTTPRedirectHandler 类。

import urllib2
 
class RedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_301(self, req, fp, code, msg, headers):
pass
def http_error_302(self, req, fp, code, msg, headers):
pass
 
opener = urllib2.build_opener(RedirectHandler)
opener.open('http://www.google.cn')

Cookie

urllib2 对 Cookie 的处理也是自动的。如果需要得到某个 Cookie 项的值,可以这么做:

import urllib2
import cookielib
 
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open('http://www.google.com')
for item in cookie:
if item.name == 'some_cookie_item_name':
print item.value

使用 HTTP 的 PUT 和 DELETE 方法

urllib2 只支持 HTTP 的 GET 和 POST 方法,如果要使用 HTTP PUT 和 DELETE ,只能使用比较低层的 httplib 库。虽然如此,我们还是能通过下面的方式,使 urllib2 能够发出 PUT 或 DELETE 的请求:

import urllib2

request = urllib2.Request(uri, data=data)
request.get_method = lambda: 'PUT' # or 'DELETE'
response = urllib2.urlopen(request)

这种做法虽然属于 Hack 的方式,但实际使用起来也没什么问题。

得到 HTTP 的返回码

对于 200 OK 来说,只要使用 urlopen 返回的 response 对象的 getcode() 方法就可以得到 HTTP 的返回码。但对其它返回码来说,urlopen 会抛出异常。这时候,就要检查异常对象的 code 属性了:

import urllib2
try:
response = urllib2.urlopen('http://restrict.web.com')
except urllib2.HTTPError, e:
print e.code

Debug Log

使用 urllib2 时,可以通过下面的方法把 debug Log 打开,这样收发包的内容就会在屏幕上打印出来,方便调试,有时可以省去抓包的工作

import urllib2
 
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
 
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.google.com')

webkitgtk+的编译要用到4.8+的GCC 人家ubuntu都有编译好的gcc。。。可怜我centos只能编译源代码了。。。

废话不说,速度干活

下载

先下载需要的GCC源码,http://gcc.gnu.org/

以gcc-4.8.3为例 先解压文件

cd ~
mkdir src
cd src
wget http://自己写吧
tar xf gcc-4.8.3.tar.gz

到这一步停下,还有软件包没有下载安装,难点重点就在这儿了,这三个软件包的安装顺序不能乱,而且安装后一个软件之前必须指定前面安装的路径,很麻烦!

下载源代码可以执行gcc-4.8.3/contrib下的download_prerequisites脚本,即可自动下载,到时候也好一起编译

阅读剩余部分

下载安装包:http://webkitgtk.org/ 使用下面命令压缩包

tar xvJf

安装依赖库:

apt-get install autoconf automake autotools-dev bison flex gperf glib-networking gtk-doc-tools libenchant-dev libgail-dev libgeoclue-dev libglib2.0-dev libgstreamer-plugins-base0.10-dev libgtk2.0-dev  libicu-dev libjpeg62-dev libpango1.0-dev libpng12-dev libsoup2.4-dev libsqlite3-dev libtool libxslt1-dev libxt-dev

试试Configure一下

./configure

可能还不够,提示找不到 libwebp,找一下吧:

apt-cache search  libwebp
libwebp-dev - Lossy compression of digital photographic images.
libwebp5 - Lossy compression of digital photographic images.
libwebpdemux1 - Lossy compression of digital photographic images.
libwebpmux1 - Lossy compression of digital photographic images.
python-webm - Python interface to the Google WebM video/image codec.

安装第一个即可

apt-get install libwebp-dev

找不到GStreamer

WebKit r169462,地址: http://nightly.webkit.org/ 下载到~/src下 然后解压

tar jxvf WebKit-r169462.tar.bz2

安装依赖包

./Tools/gtk/install-dependencies

GStreamer

apt-get install gstreamer0.10-*
apt-get install libgstreamer*

开始编译

如果提示没有编译工具就用这个安装,一次到位!

apt-get install build-essential

测试系统 ubuntu12.04

基本流程吧啊,以后可能会更新,以6.5为例:

下载安装必要文件,比如虚拟机virtualbox,vm等,还有镜像i386或者x86_64的,按需下载吧

设置虚拟机,开始安装,推荐使用全英文安装,速度和稳定性会好一点

完毕后网卡不会自动启动,需要手动开启

vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
HWADDR=00:0C:29:64:A5:E3
TYPE=Ethernet
UUID=ff171f7b-3bc5-465d-a5ba-287e200f6da6
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=dhcp

然后

/etc/init.d/network start

现在看看ifconfig里有没有IP信息

有了IP就能上网了,下面就是各种yum了,有兴趣的TX可以执行一下这个优化脚本

逛淘宝店的时候看到的,记一下

内存有SD DDR和DDR2 DDR3之分,4种内存不能混用,拍前请确定自己的机器是用的什么内存,如果不能确定,可以用CPU-Z或者EVEREST这个软件检测一下!

打开软件后看”SPD”选项的”最大带宽”一栏!

SD类型

PC-100是 SD 100
PC-133是 SD 133

DDR1类型

PC-2100是DDR-266内存!
PC-2700是DDR-333内存!
PC-3200是DDR-400内存!

DDR2类型

PC2-3200是DDR2-400内存!不要和DDR1的弄混了!
PC2-4200(有时可能是PC2-4300)是DDR2-533内存!
PC2-5300是DDR2-667内存!
PC2-6400是DDR2-800内存!

DDR3类型

PC3-8500是DDR3-1066内存!
PC3-10600是DDR3-1333内存!

以下是3代游戏版本和高频率:

PC3-12800是DDR3-1600内存!
PC3-15000是DDR3-1866内存!
PC3-16000是DDR3-2000内存!

如果不会查看请直接百度搜索CPU-Z下载,下载1.49版本以上的,解压缩运行CPU-Z,查看SPD项即可知道自己内存的信息,然后根据自己所需要的购买!

经常网络被攻击,最有效的方式就是在linux操作系统上直接限制ip访问,主要有两种方式设置

1.使用hosts.allow和hosts.deny来设置ip白名单和黑名单,/etc/目录下

优先级为先检查hosts.deny,再检查hosts.allow, 
后者设定可越过前者限制, 
例如: 
a.限制所有的ssh, 
除非从218.64.87.0 - 127上来。 
hosts.deny: 
in.sshd:ALL 
hosts.allow: 
in.sshd:218.64.87.0/255.255.255.128
 
b.封掉218.64.87.0 - 127的telnet 
hosts.deny 
in.sshd:218.64.87.0/255.255.255.128
 
c.限制所有人的TCP连接,除非从218.64.87.0 - 127访问 
hosts.deny 
ALL:ALL 
hosts.allow 
ALL:218.64.87.0/255.255.255.128
 
d.限制218.64.87.0 - 127对所有服务的访问 
hosts.deny 
ALL:218.64.87.0/255.255.255.128
 
其中冒号前面是TCP daemon的服务进程名称,通常系统 
进程在/etc/inetd.conf中指定,比如in.ftpd,in.telnetd,in.sshd 
 
其中IP地址范围的写法有若干中,主要的三种是: 
    1.网络地址--子网掩码方式: 
        218.64.87.0/255.255.255.0
    2.网络地址方式(我自己这样叫,呵呵) 
        218.64.(即以218.64打头的IP地址) 
    3.缩略子网掩码方式,既数一数二进制子网掩码前面有多少个“1”比如: 
        218.64.87.0/255.255.255.0 -- 218.64.87.0/24
 
设置好后,要重新启动
# /etc/rc.d/init.d/xinetd restart
# /etc/rc.d/init.d/network restart

2.使用iptables命令

单个IP的命令是
iptables -I INPUT -s 80.241.219.171 -j DROP
 
封IP段的命令是
iptables -I INPUT -s 96.47.225.0/16 -j DROP
iptables -I INPUT -s 96.47.225.0/16 -j DROP
iptables -I INPUT -s 96.47.225.0/16 -j DROP
 
封整个段的命令是
iptables -I INPUT -s 96.47.225.0/8 -j DROP
 
封几个段的命令是
iptables -I INPUT -s 96.47.225.0/24 -j DROP
iptables -I INPUT -s 96.47.225.0/24 -j DROP
 
服务器启动自运行
有三个方法:
1、把它加到/etc/rc.local中
2、vi /etc/sysconfig/iptables可以把你当前的iptables规则放到/etc/sysconfig/iptables中,系统启动iptables时自动执行。
3、service iptables save 也可以把你当前的iptables规则放/etc/sysconfig/iptables中,系统启动iptables时自动执行。
后两种更好此,一般iptables服务会在network服务之前启来,更安全
 
解封:
iptables -L INPUT
iptables -L --line-numbers 然后iptables -D INPUT 序号
 
iptables 限制ip访问
通过iptables限制9889端口的访问(只允许192.168.1.101、192.168.1.102、192.168.1.103),其他ip都禁止访问
iptables -I INPUT -p tcp --dport 9889 -j DROP
iptables -I INPUT -s 192.168.1.101 -p tcp --dport 9889 -j ACCEPT
iptables -I INPUT -s 192.168.1.102 -p tcp --dport 9889 -j ACCEPT
iptables -I INPUT -s 192.168.1.103 -p tcp --dport 9889 -j ACCEPT

转自:http://www.javaarch.net/jiagoushi/1004.htm

http_build_query这个函数可以很方便的构造一个请求所需要的参数。(不分GET,POST)

这个函数可以把一个数组转化为一串字符

栗子1:

'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'hypertext processor');
 
//第二个参数是分割使用的符号
echo http_build_query($data) . "\n";
echo http_build_query($data, '', '&');
# foo=bar&baz=boom&cow=milk&php=hypertext+processor
# foo=bar&baz=boom&cow=milk&php=hypertext+processor
?>

栗子二:

array('name'=>'Bob Smith',
                            'age'=>47,
                            'sex'=>'M',
                            'dob'=>'5/12/1956'),
              'pastimes'=>array('golf', 'opera', 'poker', 'rap'),
              'children'=>array('bobby'=>array('age'=>12,
                                               'sex'=>'M'),
                                'sally'=>array('age'=>8,
                                               'sex'=>'F')),
              'CEO');
//第二个参数,如果数组没有键值,则自动添加键值
echo http_build_query($data, 'flags_');
?>

输出:

user%5Bname%5D=Bob+Smith&user%5Bage%5D=47&user%5Bsex%5D=M&user%5Bdob%5D=5%2F12%2F1956&pastimes%5B0%5D=golf&pastimes%5B1%5D=opera&pastimes%5B2%5D=poker&pastimes%5B3%5D=rap&children%5Bbobby%5D%5Bage%5D=12&children%5Bbobby%5D%5Bsex%5D=M&children%5Bsally%5D%5Bage%5D=8&children%5Bsally%5D%5Bsex%5D=F&flags_0=CEO

把上面的请求传给一个PHP文件处理,打印传递来的参数,会得到以下结果:

Array
(
    [_GET] => Array
        (
            [user] => Array
                (
                    [name] => Bob Smith
                    [age] => 47
                    [sex] => M
                    [dob] => 5/12/1956
                )
 
            [pastimes] => Array
                (
                    [0] => golf
                    [1] => opera
                    [2] => poker
                    [3] => rap
                )
 
            [children] => Array
                (
                    [bobby] => Array
                        (
                            [age] => 12
                            [sex] => M
                        )
 
                    [sally] => Array
                        (
                            [age] => 8
                            [sex] => F
                        )
 
                )
 
            [flags_0] => CEO
        )
 
    [_POST] => Array
        (
        )
 
    [_COOKIE] => Array
        (
            [PHPSESSID] => 5u7l53inhrl5j1ojmn65ok4k44
        )
 
    [_FILES] => Array
        (
        )
 
    [GLOBALS] => Array
 *RECURSION*
)

很神奇吧!

栗子三:(构造HTTP请求)

 'some content',
        'var2' => 'doh'
    )
);
 
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);
 
$context = stream_context_create($opts);
 
$result = file_get_contents('http://example.com/submit.php', false, $context);
 
?>

这些函数配合起来就可以用file_get_contents构造出一个POST或GET请求了,比CURL方便很多!