`

Python Urllib2使用:代理及其它

 
阅读更多

 Python Urllib2使用

 

我们先看下Python对于Urllib2的解释:

urllib2:An extensible library for opening URLs using a variety of protocols
The urllib2(http://docs.python.org/2/library/urllib2.html) module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.

 

简单的说,urllib2就是简单版本的HttpClient,能够处理HTTP请求,我们先看下urllib2提供的功能:

urllib2.urlopen(url[, data][, timeout])

请求url,获得请求数据,url参数可以是个String,也可以是个Request参数

要熟悉Python的这种参数表达方式,[]表示可选项,这种表示方法简单清楚,描述方式相当不错。

没有data参数时为GET请求,设置data参数时为POST请求,另外data格式必须为application/x-www-form-urlencodedurllib.urlencode()能够设置请求参数的编码

timeout设置请求阻塞的超时时间,如果没有设置的话,会使用全局默认timeout参数;该参数只对HTTPHTTPSFTP生效

 

class OpenerDirector

管理一系列的Handler,这些handler都有自己的功能实现和协议,后面会提到大量的Handler功能

 

 

urllib2.build_opener([handler, ...])

返回OpenerDirector实例,实现了BaseHandler都可以生成Handler实例。Python已经内建许多的Handler,你可以替换或者添加新的Handler

 

内建Handler如下:

ProxyHandler:处理代理操作
UnknownHandler:Raise URLError异常
HTTPHandler:处理HTTP的GET和POST操作
HTTPDefaultErrorHandler:处理HTTP Error的通用处理,所有的响应都会抛出HTTPError异常
HTTPRedirectHandler:处理HTTP重定向操作,如301、302、303等和HEAD请求的307都会执行重定向操作
FTPHandler:处理FTP操作
FileHandler:处理文件
HTTPErrorProcessor:处理非200异常

 

除去上面这些Handlerurllib2还有一些其它的Handler可供选择,这些Handler都能根据名称知晓其功能,不细作解释,包括但不仅限于:

HTTPCookieProcessor:处理cookie
HTTPBasicAuthHandler:处理Auth
ProxyBasicAuthHandler:处理Proxy和Auth
HTTPDigestAuthHandler:处理DigestAuth
ProxyDigestAuthHandler:处理ProxyDigest
HTTPSHandler:处理HTTPS请求
CacheFTPHandler:比FTPHandler多点功能。

 

看下urllib2对于opener的使用:

urllib2.install_opener(opener)

定义全局的OpenerDirector,如果执行这个方法,会把自己定义的Handler用在后续的URL处理上。

 

 

Urllib2的异常定义:

urllib2.URLError:
urllib2.HTTPError:

这两个异常都是IOError的子类,对于Python的异常定义,大家都不是很满意,在urllib2中也不例外。

 

在上面提到urlopen的参数Request,这个Request类能更加丰富请求的内容:

class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

urldata的内容和前面的一致,添加了headers的信息,header的内容可以参考http://isilic.iteye.com/blog/1801072

origin_req_host应该是请求的服务器Host地址,unverifiable参数表明请求是否可验证

 

urllib2的主要类和方法就这么多了,看起来还是很好入手的,下面我们来直接使用下urllib2,例程包括但不限于官网:

import urllib2
f = urllib2.urlopen('http://www.python.org/')
print f.read(100)

这个用法最简单,直接使用即可,对于大部分的url请求都可以使用这个方法。

 

 

import urllib2
req = urllib2.Request(url='https://localhost/cgi-bin/test.cgi',data='Committed Data')
f = urllib2.urlopen(req)
print f.read()

使用Request参数来发送请求。

 

 

使用Request来进行更复杂的操作:

import urllib
import urllib2
url = 'http://www.server.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'Michael','language' : 'Python' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
f = urllib2.urlopen(req)
print f.read()

我们使用Request对象,设定了user_agent,对于某些Header需要注意,Server或者应用会对这些值做检查。

在使用 REST 接口时,Server 会检查Content-Type字段,用来确定 HTTP Body 中的内容该怎样解析。

常见的取值有:

application/xml :在 XML RPC,如 RESTful/SOAP 调用时使用
application/json :在 JSON RPC 调用时使用
application/x-www-form-urlencoded :浏览器提交 Web 表单时使用

 

 

Handler中有处理Redirecthandler,如果想确认是否跳转,确认下responseurl是否和请求url一致即可。

 

import urllib2
request_url = "http://www.google.copm"
response = urllib2.urlopen(request_url)
redirected = response.geturl() == request_url

如果不想自动Redirect,或者想在Redirect过程中添加些自己的动作,可以通过下面两种途径完成:

1:使用更低层次的httplib

2:使用自定义的HTTPRedirectHandler

 

 

Proxy的使用相当广泛,对于单个应用来说,爬虫是很容易被封禁,如果使用Proxy模式,就能降低被封的风险,所以有需求的同学需要仔细看下Python urllib2对于Proxy的使用:

 

import urllib2
proxy_handler = urllib2.ProxyHandler({'http': '127.0.0.1:80'})
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
f = urllib2.urlopen('http://www.google.com')
print f.read()

注意这个Proxy会将proxy_handler作为全局的ProxyHandler,这个未必是我们需要的,如果我们需要使用不同的Proxy,这个设置就有问题,需要修改为以下Proxy使用方式:

 

import urllib2
proxy_handler = urllib2.ProxyHandler({'http': '127.0.0.1:80'})
opener = urllib2.build_opener(proxy_handler)
f = opener.open(url)
print f.read()

 

对于cookie的处理也是有Handler自动处理的:

 

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

处理cookie是一般是cookielibHTTPCookieProcessor一起使用

 

使用Basic HTTP Authentication

import urllib2
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
f = urllib2.urlopen('http://www.server.com/login.html')
print f.read()

 

debug log level使用

import urllib2
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.google.com')

可以看到urllib2抓包时打印的内容,方便调试分析。

 

最后还有一点,使用urllib2.urlopen()时,urllib2有实际发送请求和获取响应吗?那么read()函数又进行了哪些操作呢?http://stackoverflow.com/questions/3009144/does-urllib2-urlopen-actually-fetch-the-page/3009697#3009697 。这篇文章能够很好的解决你心中的疑惑,大家仔细阅读下。

 

urllib2的使用就暂时到这里,其实urllib2已经给我们提供了基础的内容使用,对于扩展功能,也有很好的框架可以扩展;对于我们来说已经能够很好的进行工作啦。如果说这些功能还不能满足要求或者扩展也不能实现时,你只能使用httplib,或者自己实现并贡献python代码,相信对于技术提升还是很明显的。

最后还有一点,Python官方也提供了urllib2的源码,大家如果有什么不明白的地方,源码的准确性总是第一位的,源码的地址见这里:http://hg.python.org/cpython/file/2.7/Lib/urllib2.py  没事翻翻Python的源码,对于Python本身的知识积累也是不错的。

 

分享到:
评论

相关推荐

    urllib2 官方文档解析1

    本文主要解析`urllib2`的主要功能和使用方法,以及如何在Python 3中进行迁移。 1. `urllib2.urlopen()`函数是核心功能,用于打开URL。它接受一个URL(可以是字符串或`Request`对象)作为参数,可选地接收额外的数据...

    爬虫技术-urllib基础使用.pptx

    【Python 爬虫技术 - Urllib基础使用】 在Python编程中,爬虫技术是用于自动化获取网页数据的重要工具。Urllib是一个内置的Python库,提供了处理URL相关的各种功能,包括发起HTTP请求、解析URL、处理异常等。下面...

    Python的Urllib库的基本使用教程

    Python的Urllib库是Python标准库中用于处理URL的模块,是进行网络编程的重要工具,尤其在编写网络爬虫时必不可少。本教程将详细介绍Urllib库的基础使用方法,包括如何获取网页内容、构造Request对象以及POST和GET...

    Python使用urllib2获取网络资源实例讲解

    这是具有利用不同协议获取URLs的能力,他同样提供了一个比较复杂的接口来处理一般情况,例如:基础验证,cookies,代理和其他。它们通过handlers和openers的对象提供。urllib2支持获取不同格式的URLs(在URL的”:”前...

    Python爬虫库框架学习及Python高度匿名代理IP

    那么学习爬虫需要掌握哪些库呢 ...13.PySocks – SocksiPy更新并积极维护的版本,包括错误修复和一些其他的特征。作为socket模块的直接替换。 网络爬虫框架 1.功能齐全的爬虫 •grab – 网络爬虫框

    如何用Python进行大数据挖掘和分析 (2).pdf

    * 需要掌握的基础知识:元素(列表、字典、元组等)、变量、循环、函数等,还需要掌握 Python 库(urllib、BeautifulSoup、requests、scrapy)实现网页爬虫。 * 高级技巧:正则表达式、使用 cookie 信息、模拟用户...

    常用的Python爬虫技巧.pdf

    Python的`urllib2`库提供了`ProxyHandler`类,如`proxy_handler = urllib2.ProxyHandler({'http': 'http://proxy.com:8080'})`,然后通过`opener = urllib2.build_opener(proxy_handler)`创建一个使用代理的Opener。...

    python爬虫示例代码

    为避免这种情况,可以设置延时(如使用`time.sleep()`),或者使用代理IP。 - **异常处理**:对于可能出现的网络错误或解析错误,应添加适当的异常处理机制,确保程序的稳定运行。 - **道德规范**:遵守网站的...

    构建高效的python requests长连接池详解

    2. **使用超时和重试机制**:设置合适的超时时间,防止因长时间等待而阻塞其他请求。同时,合理配置重试策略,提高网络不稳定时的请求成功率。 3. **共享连接池**:在多线程或多进程应用中,通过全局的连接池实例,...

    Python常用的爬虫技巧总结

    - **POST方法**:如果需要提交表单数据,可以使用`urllib`和`urllib2`配合完成: ```python import urllib import urllib2 url = "http://abcde.com" form = {'name':'abc','password':'1234'} form_data = ...

    利用Python语言轻松爬取数据.pdf

    - 代理 IP:使用代理服务器避免 IP 被封,可以借助 `proxybroker` 库寻找可用代理。 - 验证码处理:OCR 技术(如 `pytesseract`)识别验证码图片。 - 用户代理:修改请求头的 `User-Agent` 避免被识别为爬虫。 6...

    Python网络数据采集与数据分析介绍 Python网络爬虫-Python和数据分析 共35页.pdf

    - **网页结构解析**:使用`BeautifulSoup`等库解析HTML,通过`find_all()`等方法提取所需元素。 - **搜索策略**:根据目标网站的结构,可以选择深度优先或广度优先策略,也可以根据实际情况采用混合策略。 - **爬虫...

    利用Python语言轻松爬取数据.docx

    - **IP 限制**:使用代理 IP 池避免 IP 被封。 - **访问频率控制**:设置延时或使用随机等待时间,降低爬取速度。 - **验证码识别**:OCR 技术处理验证码。 - **User-Agent**:改变 User-Agent 字符串,模拟不同...

    利用Python语言轻松爬取数据[精品文档].pdf

    7. **其他爬虫语言**:虽然Python是最常用的语言,但还有其他选择,如PhantomJS(已被Chrome headless模式取代)、CasperJS、Node.js和Java等。每种语言都有其特点,Python因其简洁的语法和丰富的库支持,特别适合...

    对python3标准库httpclient的使用详解

    params = urllib.parse.urlencode({"key1": "value1", "key2": "value2"}) conn.request("POST", "/endpoint", params, headers={"Content-Type": "application/x-www-form-urlencoded"}) ``` ### 其他HTTP方法 ...

    python实现网站的模拟登录

    本篇文章将详细介绍如何使用Python实现网站的模拟登录,主要涉及到的关键技术包括理解HTTP协议、POST请求、数据编码、Cookie管理和使用相关库如urllib2、HTMLParser以及cookielib。 首先,了解网站登录流程至关重要...

    Python爬虫工程师面试问题总结

    8. **反爬虫策略及应对**:反爬策略包括验证码、IP限制、User-Agent限制等,应对方法可以是使用代理IP池、更换User-Agent、设置延时请求、使用验证码识别库等。 9. **urllib与urllib2的区别**:urllib是Python标准...

    python通过伪装头部数据抵抗反爬虫的实例

    例如,在Python中使用`urllib.request`库发送请求时,默认头部会显示`Python-urllib/版本号`,这可能使服务器识别出非正常浏览器行为。 为避免被服务器识别为爬虫,我们需要构造一个与浏览器相似的头部数据。以下是...

    Python3爬虫发送请求的知识点实例

    对于更复杂的请求,例如处理cookies、代理、自定义请求头等,可以使用`Request`类。首先创建`Request`对象,然后通过`urlopen()`发送: ```python import urllib.request req = urllib.request.Request('...

Global site tag (gtag.js) - Google Analytics