python标准库urllib2使用细节

2024-02-11 16:18

本文主要是介绍python标准库urllib2使用细节,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

urllib2下载网页方法:

1、最简洁的方法

response = urllib2.urlopen('http://www.baidu.com')

print response.getcode()

cont = response.read()

2、添加data、http header

request = urllib2.Request(url)

//添加数据

request.add_data('a', '1')

request.add_header('User-Agent', 'Mozilla/5.0')

response = urllib2.urlopen(request)

3、添加特殊情景的处理器

例如HTTPCookieProcessor,ProxyHandler,HTTPSHandler,HTTPRedirectHandler

然后 opener = urllib2.build_opener(handler)

urllib2.install_opener(opener)

urllib2.urlopen(url)


python有哪几种网页解析器:

正则表达式,html.parser,Beautiful Soup,lxml


1、Proxy的设置

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

import urllib2enable_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)

2、Timeout的设置

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

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

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

url = 'http:www.baidu.com'
response = urllib2.urlopen('http://www.google.com', timeout=10)
request = urllib2.Request(url)
request.add_header('User-Agent', 'fake-client')
response = urllib2.urlopen(request)

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

User-Agent:有些服务器或Proxy会通过该值来判断是否是浏览器发出的请求

Content-Type:在使用REST接口时,服务器会检查该值,用来确定HTTP Body中的内容该怎样解析。常见的取值有:


4、Redict

urllib2默认情况下回针对HTTP 3XX返回码自动进行redict动作,无需人工配置。

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

class RedictHandler(urllib2.HTTPRedirectHandler):def http_error_301(self, req, fp, code, msg, headers):passdef http_error_302(self, req, fp, code, msg, headers):pass
opener = urllib2.build_opener(RedictHandler)
opener.open('http://www.baidu.com')

5、cookie

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

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

6、使用HTTP的PUT和DELETE方法

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

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

7、得到HTTP的返回码

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


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

8、Debug Log

使用urllib时,可以通过下面的方式把debug log打开,这样收发的包内容就会在屏幕上打印出来。

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.baidu.com')


URLError可能产生的原因:

1、网络无法连接

2、连接不到特定的服务器

3、服务器不存在


HTTPError是URLError的子类。

HTTPError实例产生后会有一个code属性,这就是服务器发送的相关错误号

因为urllib2可以处理重定向,也就是3开头的代号可以被处理,并且100-299范围的号码指示成功,所以只能看到400-599的错误代码


为什么要使用Cookie呢?

Cookie,指某些网站为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据(通常经过加密)

当获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面都是使用默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout

如果需要Cookie,只使用这个opener是不能达到目的的。需要创建更一般的opener来实现对Cookie的设置。

cookielib模块的主要作用是提供可存储cookie的对象,以便于urllib2模块配合使用来访问Internet资源。Coookielib模块非常强大,可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如实现模拟登陆功能。

//保存cookie到变量中

#声明一个CookieJar对象实例保存cookie    
cookie = cookielib.CookieJar()
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler = urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:print 'Name = '+item.nameprint 'Value = '+item.value

//保存cookie到文件中,需要用到FileCookieJar对象,在这里使用它的子类MozillaCookieJar来实现保存CookieJar

#保存到文件中
filename = 'cookie.txt'
cookie = cookielib.MozillaCookieJar(filename)
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)

ignore_discard的意思是:即使cookies将被丢弃也将它保存下来

ignore_expires的意思是:如果在该文件中cookies已经存在,则覆盖文件写入。


现在已经把Cookie保存到文件中了,如果以后想使用,可以利用下面的方法来读取cookie并访问网站。





这篇关于python标准库urllib2使用细节的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/700239

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC