python 的与众不同 -- 网络篇(二、网络请求/urllib)

urllib是一个包,收集几个模块与url:

  • urllib.request 用于打开和读取url
  • urllib.error 包含由urllib.request引发的异常
  • urllib.parse 解析url
  • urllib.robotparser 用于解析robots.txt文件

urllib.request

  • 语法 urllib.request.urlopen(url,data = None,[ timeout,] *,cafile = None,capath = None,cadefault = False,context = None)
    – url 打开地址,它可以是url字符串或 Request对象。
    – data 这个参数很讲究,默认Noen是GET请求,非空是POST请求(在python中不用手动指定请求类型)。
    – timeout 请求超时时间
    – ca 开头的参数是证书(认证)相关
    – context 证书(认证)相关

  • 返回值 此函数始终返回一个可以用作上下文管理器的对象
    – geturl() —返回所获取资源的URL,通常用于确定是否遵循了重定向
    – info()—以email.message_from_string()实例的形式返回页面的元信息,例如标头(请参阅 HTTP标头快速参考)。
    – getcode() –返回响应的HTTP状态代码。
    – 对于HTTP和HTTPS URL,此函数返回一个http.client.HTTPResponse对象。
    – 对于FTP,文件和数据URL以及由旧版URLopener和FancyURLopener,此函数返回一个urllib.response.addinfourl对象。

  • 一个简单的demo

import urllib.request
# 使用这个地址,方便观察重定向
url = 'http://www.bing.com/'
pesp = urllib.request.urlopen(url)

with pesp:
    print(pesp.geturl())# 返回访问url,一般涉及到重定向使用
    print(pesp.info())
    print(pesp.getcode())
    print(pesp.status,resp.reason)
    # print(str(pesp.read(),'utf-8'))
  • 指定 Headers
import urllib.request

# Mac 版本的 Chrome 的 User-Agent 信息
ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'

url = 'https://www.baidu.com/'
# 实例一个 Request对象
req = urllib.request.Request(url)
# 添加请求头信息(User-Agent是浏览器信息)
req.add_header('User-Agent',ua)

resp = urllib.request.urlopen(req)

with resp:
    print(resp.geturl())
    print(resp.info())
    print(resp.getcode())
    print(resp.status,resp.reason)
    # print(str(f.read(),'utf-8'))
  • 模拟不同浏览器请求头
import urllib.request
import random

# Mac 版本的 Chrome 的 User-Agent 信息
# ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
# agent 列表
au_list = [
    'Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
    'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.1+ (KHTML, like Gecko) Version/10.0.0.1337 Mobile Safari/537.1+',
    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0'
]

# 取得列表随机项,参数可以是一个列表,元组或字符串。
ua = random.choice(au_list)

url = 'https://www.baidu.com/'

# 实例一个 Request对象
req = urllib.request.Request(url)

# 添加请求头信息(User-Agent是浏览器信息)
req.add_header('User-Agent',ua)

resp = urllib.request.urlopen(req)

with resp:
    print(resp.geturl())
    print(resp.info())
    print(resp.getcode())
    print(resp.status,resp.reason)

    # print(str(f.read(),'utf-8'))
print(req.get_header('User-agent'))

urllib.parse

将入参进行编码

  • 入参是一个字典。
import urllib.parse

dict = {
    'name':'张三',
    'age':23,
    'url':'https://www.baidu.com/'
    }
u = urllib.parse.urlencode(dict)

print(u)

编码后

name=%E5%BC%A0%E4%B8%89&age=23&url=https%3A%2F%2Fwww.baidu.com%2F

很明显是一个请求参数格式,并把数据转成百分号加十六进制字节形式
在开发过程中我建议使用parse.urlencode进行编码,这样相对安全一些

POST请求示例

from urllib import parse
from urllib.request import urlopen,Request
import simplejson

url = 'http://httpbin.org/post'

data = parse.urlencode({'name':'张三','age':15})

ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0'

req = Request(url)
req.add_header('User-Agent',ua)

with urlopen(req,data=data.encode()) as resp:
    text = resp.read()
    # print(text)
    json = simplejson.loads(text)
    print(json['form'])

httpbin是一个http测试网站,很好用
python多数是操作bytes格式数据,无论入参data还是返回数据,都是bytes格式,而我们使用得多是我们熟悉的类型比如int、string、列表等,网络请求返回的也是bytes数据,我们要使用就需要转换类型,而simplejson不需要我们手动转型,会自动转为相应类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马志武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值