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()