python中request和requests_python中urllib.request和requests的使用及区别详解

urllib.request619免费资源网

我们都知道,urlopen()方法能发起最基本对的请求发起,但仅仅这些在我们的实际应用中一般都是不够的,可能我们需要加入headers之类的参数,那需要用功能更为强大的Request类来构建了619免费资源网

在不需要任何其他参数配置的时候,可直接通过urlopen()方法来发起一个简单的web请求619免费资源网

发起一个简单的请求619免费资源网

import urllib.request

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

webPage=urllib.request.urlopen(url)

print(webPage)

data=webPage.read()

print(data)

print(data.decode('utf-8'))

urlopen()方法返回的是一个http.client.HTTPResponse对象,需要通过read()方法做进一步的处理。一般使用read()后,我们需要用decode()进行解码,通常为utf-8,经过这些步骤后,最终才获取到我们想要的网页。619免费资源网

添加Headers信息619免费资源网

import urllib.request

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

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',

}

response=urllib.request.Request(url=url,headers=headers)

webPage=urllib.request.urlopen(response)

print(webPage.read().decode('utf-8'))

使用Request类返回的又是一个urllib.request.Request对象了。619免费资源网

通常我们爬取网页,在构造http请求的时候,都需要加上一些额外信息,什么Useragent,cookie等之类的信息,或者添加代理服务器。往往这些都是一些必要的反爬机制619免费资源网

requests619免费资源网

通常而言,在我们使用python爬虫时,更建议用requests库,因为requests比urllib更为便捷,requests可以直接构造get,post请求并发起,而urllib.request只能先构造get,post请求,再发起。619免费资源网

import requests

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

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',

}

get_response = requests.get(url,headers=headers,params=None)

post_response=requests.post(url,headers=headers,data=None,json=None)

print(post_response)

print(get_response.text)

print(get_response.content)

print(get_response.json)

get_response.text得到的是str数据类型。619免费资源网

get_response.content得到的是Bytes类型,需要进行解码。作用和get_response.text类似。619免费资源网

get_response.json得到的是json数据。619免费资源网

总而言之,requests是对urllib的进一步封装,因此在使用上显得更加的便捷,建议小伙伴们在实际应用当中尽量使用requests。619免费资源网

补充知识:python中urllib.request.Request()与urllib.request.urlopen()区别619免费资源网

蟒蛇中urllib.request.Request()与urllib.request.urlopen()的区别:619免费资源网

相对于urllib.request.urlopen()来说urllib.request.Request是进一步的包装请求,下面是请求类的源码示例:619免费资源网

class Request:

# 主要看这块,构造函数中指明了Request进一步包装请求中可以传递的参数有(url,data,headers,

# origin_req_host,unverifiable,method)

def __init__(self, url, data=None, headers={},

origin_req_host=None, unverifiable=False,

method=None):

self.full_url = url

self.headers = {}

self.unredirected_hdrs = {}

self._data = None

self.data = data

self._tunnel_host = None

for key, value in headers.items():

self.add_header(key, value)

if origin_req_host is None:

origin_req_host = request_host(self)

self.origin_req_host = origin_req_host

self.unverifiable = unverifiable

if method:

self.method = method

pass

我们可以这样使用(以下是模拟有道字典翻译发送的请求):619免费资源网

# 请求地址url

url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"

# 请求头

request_headers = {

'Host':'fanyi.youdao.com',

"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36",

}

# 发送给服务器的表单

form_data = {

"i": word,

"from": "AUTO",

"to": "AUTO",

"smartresult": "dict",

"doctype": "json",

"version": "2.1",

"keyfrom": "fanyi.web",

"action": "FY_BY_REALTIME",

"typoResult": "false"

}

# POST发送的data必须为bytes或bytes类型的可迭代对象,不能是字符串

form_data = urllib.parse.urlencode(form_data).encode()

# 构造请求对象Request

req = urllib.request.Request(url, data=form_data, headers=request_headers)

# 发起请求

response = urllib.request.urlopen(req)

data = response.read().decode()

print(data)

所以,总的来说,如果我们在获取请求对象时,不需要过多的参数传递,我么可以直接选择urllib.request.urlopen();如果需要进一步的包装请求,则需要用urllib.request里。的urlopen()进行包装处理。619免费资源网

你可能感兴趣的:(python中request和requests_python中urllib.request和requests的使用及区别详解)