Python-网络请求urllib库和requests库

1. urllib.request模块

模块定义了身份验证、重定向、cookies等应用中打开Url(主要是HTTP)的函数和类。

1)urlopen方法

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):

#参数 url:可以是一个URL也可以是一个Request 对象
#参数 data:当data为None时发起get请求,否则发起post请求,此时data要进行encode
#cafile,capath,cadefault,证书相关参数

#实例1
from urllib.request import urlopen

url = "http://www.bing.com"
response = urlopen(url)
print(response.closed) #未关闭
with response:
    print(type(response))  #response 类型 <class 'http.client.HTTPResponse'>
    print(response.status)  #输出请求状态
    print(response.geturl()) #输出访问的网页url
    print(response.info()) # 输出header
    print(response.read().decode('utf-8')) #输出返回的网页内容

print(response.closed) #关闭


urlopen 方法只能传递url和data这样的数据,不能构造HTTP的请求,例如User-Agent

from urllib.request import urlopen,Request

url = "http://www.bing.com"
req = Request(url)
header = {'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Mobile Safari/537.36'}
#伪装浏览器 添加User-Agent
req.add_header(header)
response = urlopen(req)
with response:
    print(response.info()) # 输出header
    print(response.read().decode('utf-8')) #输出返回的网页内容
    

注意:urlopen 打开的url,返回的如果是301,302,会在responseHeader中返回location进行重定向,urlopen会自动跳转到新地址

2)parse模块
该模块可以完成url的编解码。对冒号、斜杆、&、等号等符号编码解码。

一般来说url中的地址部分,不需要使用中文路径,但是参数部分,不管get还是post方法,提交的数据中可能有斜杠、等号、问好等符号,这样这些字符表示数据,不表示元字符,如果直接发给服务器端,就会导致接收方无法判断谁是元字符,谁是数据了。

为了安全,一般会将数据部分的字符进行url编码,按照字符集的encoding要求转换成字节序列,每一个字节对应的十六进制字符串前加上百分号即可。

编码:
dict = {'name':'zhangsan'}
u = parse.urlencode(dict)

解码:
x = parse.unquote(u)

3)simplejson 模块
对网络请求返回的json字符串进行解析

from urllib import urlopern,Request
from urllib import parse
import simplejson

url = 'http://httpbin.org/post'
data = pare.urlencode({'name':'张三,@=、&*','age':'6'})
agent = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Mobile Safari/537.36'

req = Request(url,headers={'User-agent':agent})

with urlopen(req,data = data.encode()) as response:
    text = response.read()
    d = simplejson.loads(text)
    print(d)
    print(type(d))
    
2.requests 基础用法

requests库是我们常用的网络请求库,使用非常广泛。

1) 常用方法:
requests.request(method,url,** kwargs)
requests.post(url,data,** kwargs)
requests.get(url,params,** kwargs)

method:请求方法,get,post等
url:请求地址
params:参数,可选
**kwargs:12个控制访问的参数,如

  • header:字典,http请求头,用来模拟任何我们想模拟的浏览器来对url发起访问
  • data:字典、字节或文件对象,作为request的内容,与params不同的是,data提交的数据并不放在url链接中,而是放在URL链接对应位置的地方作为数据来存储,也可以接收字符串。
  • json:json格式数据,在web开发中常见,作为内容部分向服务器提交。
  • cookies:从http中解析cookie
  • auth:元组,用来支持http认证功能
  • files:字典, 是用来向服务器传输文件时使用的字段
  • timeout:用于设定超时时间, 单位为秒,当发起一个get请求时可以设置一个timeout时间, 如果在timeout时间内请求内容没有返回, 将产生一个timeout的异常。
  • proxies:字典, 用来设置访问代理服务器。
  • allow_redirects:布尔,表示是否允许对url进行重定向,默认为True。
  • stream:布尔,指是否对获取内容进行立即下载,默认为True。
  • verify:布尔,用于认证SSL证书,默认为true。
  • cert: 用于设置保存本地SSL证书路径

Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。

请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 r.encoding 属性来改变它。

响应返回response对象部分属性:

  • status_code:http请求的返回状态,200表示成功。
  • text:响应内容的字符串形式,返回的页面内容,
  • url:最终的url定位
  • request:对应的http请求对象,可以获得请求头等信息
  • encoding:从http header中猜测的相应内容编码方式
  • apparent_encoding:从内容分析出的响应内容编码方式
  • content:http响应内容的二进制形式
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容