【Python】 http客户端库requests & urllib2 以及ip地址处理IPy

requests

  requests是个HTTPClient库,相比于urllib,urllib2等模块比更加简洁易用

 ■  get请求

  作为示例,讲一下关于requests如何发起并处理一个get请求

r = requests.get("http://www.baidu.com")    #可以加入timeout参数来设置超时

  r是一个Response对象,可以用r查看很多信息

    如r.status_code  查看本次请求的http返回码

    r.headers  头部信息(是个类字典对象)

    r.url    本次请求用的url

    r.encoding  编码方式

    r.text    正文

    r.content  正文

    *text和content的区别是text是以unicode的形式存在内存中的,而content是把text用r.encoding编码进行encode之后的产物。所以当返回内容是html文本时,type(text)是unicode而type(content)是str。当返回的是类似于图片这样的东西时,编码可以是base64这种二进制编码,所以如果要下载一张图或一个文件时,应该写入本地文件的也是content而不是text。

    r.cookies  获得返回内容中的cookie内容,若想在请求中加入cookie的话只要在参数中加上cookie={...}即可

  r对象还有一些方法:

    r.raise_for_status()  #当返回码不是200的时候抛出一个HTTPError异常

  另外,get方法还可以把一个字典整合到url中去形成一个带参数的GET请求。比如

par = {‘wd‘:‘word‘}
r = requests.get("http://www.baidu.com/s",params=par)

>>>r.url
u‘http://www.baidu.com/s?wd=word‘

  如果返回的是个json串,那么r还可以用json()方法构造出这个串对应的python字典

r = requests.get("url")  #假设返回的json是 {"code":"200","msg":"OK"}

res = r.json()
print res.get("code"),res.get("msg")
#得到的就是200 OK

  

  除了params参数之外,get方法还可以有proxies参数以设置代理;headers参数来伪造请求头部

  比如headers={‘User-Agent‘:‘test‘};r = requests.get(url,headers=headers)

  加入cookie={一个字典}来增加请求中的cookie信息 

■  POST

  POST请求用post方法,和get类似的设置。

  在加上post的数据时注意参数是data不是params了!! ==> r = requests.post(url,data=par)

urllib2

  urllib2是比requests更加贴近底层,可以实现更加个性化的HTTPClient?

■  基本用法

req = urllib2.Request(‘...‘)    #用一个url来建立一个Request对象,这个url可以是http协议的也可以是ftp协议的

response = urllib2.urlopen(req)    #打开这一request对象

page = response.read()    #response可以像一个文件一样read内容

如果是使用http协议进行通信的话,用户可以通过POST或GET方法来丰富自己的http请求方式,比如自己附上一些表单data,或者添加http的headers信息

  ①  增加表单data

    首先需要一个python字典来抽象化要发送的数据,然后一定要用urllib.urlencode将这个字典处理成urlopen可以识别的东西(好像就是个key=value&key2=value2这样的,跟在get请求的url后面的那种形式)。然后在创建Request对象的时候就有两种方法,分别对应着POST请求和GET请求

par = {‘wd‘:‘word‘}
processed_par = urllib.urlencode(par)    #对字典进行处理,用到的是urllib中的urlencode方法

req = urllib2.Request(‘url‘,data=processed_par)    #写个参数data=处理好的数据这种方式呢对应的是POST请求
req = urllib2.Request(‘‘url‘+‘?‘+processed_par)    #直接加上处理好的数据是指GET请求的方式(不要忘了中间的问号!!!

urllib2.urlopen(req)    #打开Request对象来进行访问

  ②  增加header信息

    header即头部,http头部属于http讯息的一部分,其逻辑形式大致是一个字典,内容包括客户端可接受的内容类型,编码,语言,证书信息,用户所用代理(浏览器的牌子)是什么等等。从应用逻辑上分,header又被分成了general header,request header,response header和entity header四部分

    因为urllib2主要是个http客户端库,所以主要关注request header的部分

    如以下做法可以为header添加上User-Agent信息(用户的浏览器是什么)

    

url = ‘http://www.xxxxxxxx...‘

userAgent = ‘Mozilla 4.0 xxxxx‘    #模拟火狐浏览器的信息

headers = {‘User-Agent‘:userAgent}    #设置header字典

data = urllib.urlencode(...)        #POST请求的表单数据
req = urllib2.Request(url,data=data,headers=headers)
res = urllib2.urlopen(req)    #这就是打开了带有自己定义的头部信息的请求了

■  零碎的记录

  *关于错误 URLError & HTTPerror

  这两个错误是在应用http客户端库时常见的错误。首先,HTTPerror是URLError的一个子类,即发生HTTPError时必然发生URLError

  另外,URLError通常是指没有网络连接(没有特定路由到指定服务器),或者服务器不存在的错误。对应的,HTTPError指的是那些服务器指向正确并且连接OK,但是无法完成请求的情况。

  URLError对象通常都有reason属性,是个tuple,[0]是错误号,[1]是错误信息,所以在except URLError的时候可以print e.reason来查看具体信息。类似的HTTPError则有一个code属性,记录的是http返回码,如众所周知的404代表找不到文件,401代表需要验证,500代表服务器内部出错等等。

  

  *关于url的解码和编码

  有些符号如‘{‘,‘\‘是无法被识别的,需要对其进行编码成%7B,%5C之类的某种我也说不太清到底是什么码的码,可以用urllib.quote(url)对url进行一个编码,同样的urllib.unquote(url)是把编好码的url解码成人看得懂的形式。

IPy

  一个小模块。。没地方放了,反正这篇好像都是跟网络沾边就放着把。

  本来我想找个能验证ip地址合法性的模块,而找到的这个IPy似乎功能要更加强大一些。IPy下载地址https://github.com/haypo/python-ipy/

  ●  对ip的处理

  首先用IPy.IP来建立一个IP对象

ip = IP(‘x.x.x.x‘)    #在构造IP对象时就已经对ip合法性做出判断,如果不对就报错了。我最开始的需求就这么实现了。。

  IP对象有__repr__方法,可以直接被print成字符串。

  ip.make_net(‘子网掩码‘)  返回这个ip所在的网段地址,比如

ip = IP(127.0.0.1)
net = ip.make_net(‘255.0.0.0‘)
print net
##输出结果就是 IP(‘127.0.0.0/8‘)

print ip in net
##还可以直接用 in 语句来判断某个ip在不在一个网段里

  ●  对网段地址的处理

  在构造的时候,如果写的是一个网络,那么IP类会自动将其识别成一个网络

net = IP(‘127.0.0.0/24‘)

  这个net对象时iterable的,可以迭代出这个网段里所有的ip地址,用len(net)自然就可以看到这个网段里一共能有多少ip了

  在print net的是时候同样会打印出来这个网络,只是表示一个网络有多种方法,到底取哪一种呢?

  可以用net.strNormal(n)这个方法来改变打印出来的格式,比如上面那个net,如果设置了n是0的话只打印出127.0.0.0(网络地址)

  n为1的场合 打印出类似于127.0.0.0/24 这种表现形式

  n为2的场合 打印出127.0.0.0/255.255.255.0  的形式

  n为3的场合 打印出127.0.0.0 - 127.0.0.255  的形式

时间: 2024-10-08 16:31:34

【Python】 http客户端库requests & urllib2 以及ip地址处理IPy的相关文章

python学习-使用requests模块查询ip地址

思路是,使用requests模块调用阿里的ip接口查询ip归属地 关于requests模块的使用,可以查询相关文档,很强大,本次不做描述 #!/usr/bin/python #coding=utf-8 import requests   def checkip(ip):       URL = 'http://ip.taobao.com/service/getIpInfo.php'     try:         r = requests.get(URL, params=ip, timeout

获取客户端、服务器、本地IP地址

//获取客户端.服务器.本地IP地址 public static string getIPAddress() { ////本地IP //string address = System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName()).GetValue(2).ToString();//IP4 地址 ////本地电脑名称 //string addname = System.Net.Dns.GetHostName().ToString();

通过纯真IP库,查询出IP地址的归属地

原文:通过纯真IP库,查询出IP地址的归属地 源代码下载地址:http://www.zuidaima.com/share/1550463698422784.htm 项目的编码要设置为utf-8,否则有乱码

Nginx 向客户端输出真实的后端IP地址

因为涉及到内外网的改造,所以狠多东西现在需要依赖于openresty来做总控实现.然后就碰见了一个比较难办的问题,即在upstream时候,如何获取实际处理请求的server地址.假设有如下upstream配置: upstream backend { server 127.0.0.1:88882 server 127.0.0.1:88892 } location /test { proxy_pass http://backend2 } 当我请求test的时候,我同时想直到到底是backend的哪

Python 第三方 http 库-Requests 学习

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求 一.安装 Requests 通过pip安装 Code example: 1 $ pip install requests 或者,下载代码后安装: Code example: 1 2 3 $ git clone git://github.com/kennethreitz/requests

python 跨平台获取网卡信息和本机ip地址

笔者在项目中遇到过获取本机网卡ip的例子,利用python库psutil解决了此问题. def get_netcard(): """获取网卡名称和ip地址 """ netcard_info = [] info = psutil.net_if_addrs() for k, v in info.items(): for item in v: if item[0] == 2 and not item[1] == '127.0.0.1': netcard

1.Python中IP地址处理IPy模块

安装 先下载源码,地址:ps://pypi.python.org/pypi/IPy/">https://pypi.python.org/pypi/IPy/ ,然后解压后使用命令python setup.py install安装. 使用 1.显示IP类型 >>> IP('192.168.1.1').version() 4 >>> IP('::1').version() 6类似如上所示,通过version方法可以的判断输入的IP是IPv4还是IPv6 . 2

Python根据数量生成正确顺序的ip地址

一个简单的需求,一个简单的脚本. 从一个ip开始,按照指定的数量,生成正确的ip地址. #!/usr/bin/env python ## encoding: utf-8 import os def getip(ip, count): count = int(count) ip2 = int(ip.split('.')[-2]) ip1 = int(ip.split('.')[-1]) ip_before = '%s.%s' % (ip.split('.')[0], ip.split('.')[1

ip地址库介绍

摘要 在CDN系统中,IP地址库在流量调度.网络服务质量监测等方面起到重要的作用,本文主要介绍了IP地址库的功能.内容以及IP地址库的生成和评价方法 什么是IP地址库? 所谓IP地址库,指的是提供了IP地址(段)同地理.ISP.结构等信息映射关系的一组数据 IP地址库有什么用? IP地址库应用的场合较为广泛,下面举几个常见的例子:(1)根据客户的IP地址确定客户来源,为后期的客户行为分析提供基础,例如需要统计学生群体的访问特点,这时我们就是通过分析来自教育网的IP地址的那些请求得到的(2)为不同