使用urllib.request发送请求

使用urllib.request发送请求

urllib.request.urlopen()基本使用

urllib.request模块提供了基本的构造HTTP请求的方法,利用他可以模拟浏览器的一个请求发起过程,同时他还带有处理authentication(授权验证),redirections(重定向),cookie(浏览器Cookies)以及其他内容。

import urllib.request

response = urllib.request.urlopen("http://www.baidu.com")
#read读取的内容是byte,需要进行解码
print(response.read().decode("utf-8"))

在上面代码的基础上执行print(type(response))
结果是
这里发现response是一个HTTPResponse类型的对象,它主要包含的方法有read()、readinto() 、getheader(name) 、 getheaders() 、 fileno() 等函数和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性。

>>> import urllib.request
>>> response = urllib.request.urlopen("https://www.baidu.com")
>>> print(response.status)
200
>>> print(response.getheaders())
[('Accept-Ranges', 'bytes'), ('Cache-Control', 'no-cache'), ('Content-Length', '227'), ('Content-Type', 'text/html'), ('Date', 'Tue, 25 Jul 2017 06:36:40 GMT'), ('Last-Modified', 'Wed, 28 Jun 2017 02:16:00 GMT'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('Pragma', 'no-cache'), ('Server', 'BWS/1.1'), ('Set-Cookie', 'BD_NOT_HTTPS=1; path=/; Max-Age=300'), ('Set-Cookie', 'BIDUPSID=BEF13521D9F33BE4108EA36C07303743; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'PSTM=1500964600; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Strict-Transport-Security', 'max-age=0'), ('X-Ua-Compatible', 'IE=Edge,chrome=1'), ('Connection', 'close')]
>>> print(response.getheader("Server"))
BWS/1.1

urllib.request.urlopen()详解

利用urlopen()方法,我们可以完成最基本的简单网页的GET请求抓取。urlopen()函数的API

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

data 参数是可选的,如果要添加 data ,它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 函数可以进行转化,另外如果你传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST 。**

# coding=utf-8
import urllib.parse
import urllib.request
#urllib.parse.urlencode() 方法来将参数字典转化为字符串。第二个参数指定编码格式,在这里指定为 utf8 。
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding=
'utf8')
response = urllib.request.urlopen('http://httpbin.org/post', dat
a=data)
print(response.read())

提交的网址是 httpbin.org ,它可以提供 HTTP 请求测试。 http://httpbin.org/post 这个地址可以用来测试 POST 请求,它可以输出请求和响应信息,其中就包含我们传递的 data 参数。

urllib.request.Request的使用

由上我们知道利用urlopen()方法可以实现最基本的请求发起,但不足以构建一个完整的请求。

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

Request的结构

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
  • 第一个参数是请求链接,这个是必传参数,其他的都是可选参数。
  • data 参数如果要传必须传 bytes (字节流)类型的,如果是一个字典,可以先用urllib.parse.urlencode() 编码。
  • headers参数是一个字典,可以在构建Request时通过headers参数传递,也可以通过调用Request对象的add_header()方法来添加请求头。请求头最常用的用法是通过修改User-Agent来伪装浏览器,默认User-Agent是Python-urllib,可以通过他来伪装浏览器。例如:伪装火狐浏览器,
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 。

你可能感兴趣的:(使用urllib.request发送请求)