处理网络请求urllib

处理网络请求urllib

urllib中包括了四个模块,包括
urllib.requesturllib.errorurllib.parseurllib.robotparser

  • urllib.request:可以用来发送request和获取request的结果
  • urllib.error:包含了urllib.request产生的异常
  • urllib.parse:用来解析和处理URL
  • urllib.robotparse:用来解析页面的robots.txt文件 使用urllib.request发送请求

Urillib.request.urlopen()的基本使用

利用urllib.request可以模拟浏览器的一个请求发起过程

response = urllib.request.urlopen(“https://www.baidu.com”)

response是一个 HTTPResposne 类型的对象,它主要包含的方法有 read() 、 readinto() 、getheader(name) 、getheaders() 、 fileno() 等函数和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性。

可以用 response 调用这些方法和属性,得到返回结果的一系列信息。

例如 response.read() 就可以得到返回的网页内容, response.status 就可以得到返回结果的状态码,如200代表请求成功等。

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False, context=None)

除了第一个参数可以传递URL之外,还可以传递其它的内容,比如 data (附加参数), timeout (超时时间)等等。
Data参数
data 参数是可选的,如果要添加 data ,它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 函数可以进行转化,另外如果你传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST 。

  # coding=utf-8
     import urllib.parse
     import urllib.request
     data = bytes(urllib.parse.urlencode({ ‘word’: ‘hello’}), encoding= ‘utf8’)
 response = urllib.request.urlopen( ‘http://httpbin.org/post’, data=data)
     print(response.read())

timeout参数
timeout 参数可以设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间还没有得到响应,就会抛出异常,如果不指定,就会使用全局默认时间。它支持 HTTP 、 HTTPS 、 FTP 请求。

response = urllib.request.urlopen( “http://httpbin.org/get”,timeout=1)
可以用它判断,超过多少秒,就跳过他(用tryexcept
…)

其他参数
context 它必须是 ssl.SSLContext 类型,用来指定 SSL 设置。

cafile 和 capath 两个参数是指定CA证书和它的路径,这个在请求 HTTPS 链接时会有用。

cadefault 参数现在已经弃用了,默认为 False 。

urllib.request.Request的使用

利用 urlopen() 方法可以实现最基本的请求发起,但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入 headers 等信息,我们就可以利用更强大的 Request 类来构建一个请求。

 request =urllib.request.Request(“https://www.baidu.com”)
 response = urllib.request.urlopen(request)
 print(response.read().decode( “utf-8))

我们依然是用 urlopen() 方法来发送这个请求,只不过这次 urlopen() 方法的参数不再是一个URL,而是一个 Request ,通过构造这个这个数据结构,一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。

urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False, method=None)

第一个参数是请求链接,这个是必传参数,其他的都是可选参数。

data参数如果要传必须传bytes(字节流)类型,如果是字典,可以用 urllib.parse.urlencode() 编码,再转换成bytes(字节流)类型

headers 参数是一个字典,你可以在构造 Request 时通过 headers 参数传递,也可以通过调用 Request 对象的 add_header() 方法来添加请求头。
请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是 Python-urllib ,你可以通过修改它来伪装浏览器,比如要伪装火狐浏览器,你可以把它设置为 Mozilla/5.0 (X11; U; Linux i686)Gecko/20071127 Firefox/2.0.0.11

origin_req_host 指的是请求方的 host 名称或者 IP 地址。

unverifiable 指的是这个请求是否是无法验证的,默认是 False 。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True 。

method是一个字符串,它用来指示请求使用的方法,比如 GET , POST , PUT 等等。

from urllib import request,parse
 url = http://httpbin.org/post
 headers = { “User-Agent”: ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT), “host”: ‘httpbin.org’ }
 dict = { “name”: “Germey” }
 data = bytes(parse.urlencode(dict),encoding= “utf8”)
 req = request.Request(url=url,data=data,headers=headers,method= “POST”)
 response = request.urlopen(req)
 print(response.read().decode( “utf-8))

在这里我们通过四个参数构造了一个Request,url即请求链接,在headers中指定了User-Agent和Host,传递的参数data用了urlencode()和bytes()方法来转成字节流,另外指定了请求方式为 POST。
另外 headers 也可以用 add_header() 方法来添加。

req = request.Request(url=url, data=data, method=‘POST’)
req.add_header(‘User-Agent’, ‘Mozilla/4.0 (compatible; MSIE 5.5;Windows NT))

如此一来,我们就可以更加方便地构造一个 Request ,实现请求的发送。

Urillib.request.urlopen()和urllib.request.Request:
就相当于urlopen()负责包装,把要发送的请求包装好,Request()负责发送请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值