python爬虫学习二:  urllib2模块的学习


1、urllib2介绍

   urllib2是使用各种协议完成打开url的一个扩展包。做简单的使用方法是调用uropen方法。

   import urllib2
   content_stream = urllib2.urlopen('http://www.baidu.com/')
   content = content_stream.read()
   print content


   即可以接受一个字符串类型的URL地址,或者一个Request对象。然后打开这个URL,返回结果为一个像文件对象

一样的对象。



   一般我们直接调用urllib2中的urlopen()就是表示去调用build_opener()方法,然后用build_opener()方法返回

的类的对象去调用该对象的open方法。


2、urllib2使用细节:


a、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)//install_opener()改变了全局的设置,若不想改变全局,需要用opener的open
方法。


b、Timeout设置

在老版本的python中,要设置timeout值,必须更改Socket的全局Timeout值。

import socket
import urllib2
socket.setdefaulttimeout(10)
urllib2.socket.setdefaulttimeout(10)//这是两种方式,都可以


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

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


c、在HTTP Request中加入特定的Header

import urllib2
request = urllib2.Request(url)
request.add_header('user-agent','fake-client')
response = urllib2.urlopen(request)


d、cookie

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

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

e、得到HTTP的返回码

需要检查异常对象的code属性。

import urllib2
try:
resopnse = urllib2.urlopen('http://www.baidu.com')
except urllib2.HTTPError,e:
print e.code


3、urlopen的两个很有用的方法,geturl()和info()


a、geturl()

返回一个真实的URL,因为urlopen或许会有重定向,获取到URL或许跟请求url不同。

b、info():

返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。目前是httplib.HTTPMessage

实例。经典的headers包含"Content-length","Content-type",和其他内容。


4、表单的处理:

有的网页需要登录才能看到,需要填表,表单怎么填?


首先利用工具截取索要填表的内容。一般可以利用Firefox+httpfox插件来看看自己到底发送了些什么包。

import urllib2
import urllib
postdata = urllib.urlencode({
'username':'qester',
'passwd':'*******',
'login_summit':'登录'
})
req = urllib2.Request(
url = 'http://secure.baidu.com/sigin',
data = postdata,
)
result = urllib2.urlopen(req)
print result.read()