分类
存档页
-
最新评论
- william 发表于《urllib2的随机http代理handler》
- goly 发表于《留言本》
- 会跳舞的鞋子 发表于《留言本》
- Mr WordPress 发表于《Hello world!》
功能
Category Archives: python
mysql中字串的区分大小写查询
mysql里字串的比较方式是不区分大小写的,这样会造成很多问题。测试如下: 新建一张表并加入两条仅仅大小写不一样的数据: mysql> create table test(x varchar(200)); mysql> insert into test values(‘heLLo’); mysql> insert into test values(‘hello’); mysql> select * from test; +——-+ | x | +——-+ | heLLo | | hello | +——-+ 2 rows in set (0.00 sec) … 繼續閱讀
del a与del a[:]的区别
假设 a 是一个 python 数组,如 a=range(10),那么 del a 与 del a[:] 有什么区别? 看下面的测试: >>> a=range(10) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> del a >>> a Traceback (most recent call last): File “<stdin>”, line 1, … 繼續閱讀
urllib2的随机http代理handler
对于使用urllib2抓取网页的程序,如果使用代理,一般都使用urllib2.ProxyHandler这个handler。而这个handler必须在初始化时指定一个代理服务器(可以是http和https各一个),然后通过urllib2.build_opener和urllib2.install_opener安装到urllib2种,之后再去用urllib2.urlopen去抓页面。 这样做只能使用一个代理服务器,但如果我们要在不停地调用urllib2.urlopen时使用随机多个代理服务器呢?用urllib2.ProxyHandler的话就只能每次抓页面前重新初始化opener,这样做的性能是不能让人容忍的。 如果查阅下urllib2的代码,就会发现它每次抓网页时,是去调urllib2.ProxyHandler的http_open(https同理)方法为http头加了几个代理服务器字段。如果我们派生出一个类,覆盖掉urllib2.ProxyHandler的http_open方法,实现上改为每次随机取代理地址,不就ok了么? 下面是具体实现代码,测试通过: #!/usr/bin/env python # coding:utf-8 # yc@2012-2-23 import urllib2, random, base64 from urllib import unquote DEBUG = False class RandomProxyHandler(urllib2.ProxyHandler): ”’ 随机http代理handler ”’ def __init__(self, proxies=None): ”’ proxies为一个seq,每项为一个http代理,如:’proxy.example.com:3128′ 或 ‘http://joe:password@proxy.example.com’ ”’ self.proxies = [urllib2._parse_proxy(i) for i in … 繼續閱讀
线程安全的python生成器: yield
在多线程编程中,大部分情况下我们都得使用资源锁,否则程序的行为会千奇百怪。比如多个线程公用一个socket连接而在使用时不加锁的话,发送和接收的数据包顺序有可能会被打乱。 写多线程的python程序,大多使用了threading模块的Lock、RLock或Condition类来作资源锁。使用共享资源时加锁,使用完毕后释放锁,当程序逻辑很复杂时,资源锁的控制也会变得越来越复杂,由此导致的bug也不断增多。 这里介绍一种不用锁机制去访问共享资源的方法,那就是使用python中的生成器,也就是使用了yield指令的函数。 按照锁机制中经典的生产者、消费者模型编写的生成器代码大致如下: #coding:utf-8 import threading, random, time def producer(): x = 0 while x < 60: x += 1 time.sleep(random.random()) yield x y = producer() def consumer(): while True: try: x = y.next() except: break print x for … 繼續閱讀