ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
| urllib模块 | python 3.X版本 | | --- | --- | python 3.X版本是不需要安装:urllib2包的,urllib和urllib2包集合成在一个包了 所以直接导入就行 import urllib | urllib2模块 | python 2.X版本 | | --- | --- | ``` #python2.X版本 #直接引入,不需要下载模块 #基本操作 import urllib2 url = 'http://www.baidu.com' header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;)"} # url 连同 headers,一起构造Request请求,这个请求将附带 IE9.0 浏览器的User-Agent request = urllib2.Request(url, headers = header) #也可以通过调用Request.add_header() 添加/修改一个特定的header request.add_header("Connection", "keep-alive") #也可以通过调用Request.get_header()来查看header信息 header_name = request.get_header(header_name = "Connection") user_agent = request.get_header("User-agent") #请求服务器时异常处理 try: #向服务器发送请求,设置请求超时时间 response = urllib2.urlopen(request, timeout = 10) except urllib2.HTTPError, e: print e.code print e.reason except urllib2.URLError, e: if hasattr(e, "reason"): print e.reason else: print 'OK' #获取相应的状态码 code = response.code #读取获取到的内容 html = response.read() print(code, user_agent, header_name) ``` ``` #获取Cookie并保存到文件 import urllib2 import cookielib #设置保存cookie的文件,同级目录下的cookie.txt filename = 'cookie.txt' #声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件 cookie = cookielib.MozillaCookieJar(filename) #利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器 handler = urllib2.HTTPCookieProcessor(cookie) #通过handler来构建opener opener = urllib2.build_opener(handler) #创建一个请求,原理同urllib2的urlopen response = opener.open('http://www.baidu.com') #保存cookie到文件,ignore_discard的意思是即使cookies将被丢弃也将它保存下来,ignore_expires的意思是如果在该文件中cookies已经存在,则覆盖原文件写入 cookie.save(ignore_discard = True, ignore_expires=True) for item in cookie: print 'Name = ' + item.name print 'Value = ' + item.value **************************************************************************************************** # 从文件中获取Cookie并访问 import urllib2 import cookielib #设置保存cookie的文件,同级目录下的cookie.txt filename = 'cookie.txt' #创建MozillaCookieJar实例对象 cookie = cookielib.MozillaCookieJar() #从文件中读取cookie内容到变量 cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True) #创建请求的request req = urllib2.Request("http://www.baidu.com") #利用urllib2的build_opener方法创建一个opener opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) response = opener.open(req) print response.read() **************************************************************************************************** #请求访问成绩查询网址 result = opener.open(gradeUrl) print result.read() import urllib2 import cookielib filename = 'cookie.txt' #声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件 cookie = cookielib.MozillaCookieJar(filename) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) postdata = urllib.urlencode({ 'stuid':'201200131012', 'pwd':'23342321' }) #登录教务系统的URL loginUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login' #模拟登录,并把cookie保存到变量 result = opener.open(loginUrl,postdata) #保存cookie到cookie.txt中 cookie.save(ignore_discard=True, ignore_expires=True) #利用cookie请求访问另一个网址,此网址是成绩查询网址 gradeUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre' #请求访问成绩查询网址 result = opener.open(gradeUrl) print result.read() ``` | 异常处理状态码 | | | --- | --- | | 100 | 继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应 | | 100 | 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施 | | 102 | 继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行 | | 200 | 请求成功 处理方式:获得响应的内容,进行处理 | | 201 | 请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到 | | 202 | 请求被接受,但处理尚未完成 处理方式:阻塞等待 | | 204 | 服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃 | | 300 | 该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃 | | 301 | 请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL | | 302 | 请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL | | 304 | 请求的资源未更新 处理方式:丢弃 | | 400 | 非法请求 处理方式:丢弃 | | 401 | 未授权 处理方式:丢弃 | | 403 | 禁止 处理方式:丢弃 | | 404 | 没有找到 处理方式:丢弃 | | 500 | 服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现 | | 501 | 服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求 | | 502 | 错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应 | | 503 | 服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复 | ``` import urllib2 requset = urllib2.Request('http://www.xxxxx.com') try: urllib2.urlopen(request) except urllib2.URLError, e: print e.reason HTTPError是URLError的子类,在你利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码” 其他不能处理的,urlopen会产生一个HTTPError,对应相应的状态吗,HTTP状态码表示HTTP协议所返回的响应的状态 HTTPError实例产生后会有一个code属性,这就是是服务器发送的相关错误号。 因为urllib2可以为你处理重定向,也就是3开头的代号可以被处理,并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码 ``` | HTTP请求方式 | | | --- | --- | | get | | | head | | | put | | | delete | | | post | | | potions | | ``` PUT 和 DELETE 详解 PUT:这个方法比较少见。HTML表单也不支持这个。本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定 DELETE:删除某一个资源。基本上这个也很少见,不过还是有一些地方比如amazon的S3云服务里面就用的这个方法来删除资源 ```