欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-04 18:37:43
urllib.request我们都知道,urlopen()方法能发起最基本对的请求发起,但仅仅这些在我们的实际应用中一般都是不够的,可能我们需要加入headers之类的参数,那需要用功能更为强大的re...

urllib.request

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

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

发起一个简单的请求

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,经过这些步骤后,最终才获取到我们想要的网页。

添加headers信息

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对象了。

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

requests

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

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数据类型。

get_response.content得到的是bytes类型,需要进行解码。作用和get_response.text类似。

get_response.json得到的是json数据。

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

补充知识:python中urllib.request.request()与urllib.request.urlopen()区别

蟒蛇中urllib.request.request()与urllib.request.urlopen()的区别:

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

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

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

# 请求地址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()进行包装处理。

以上这篇python中urllib.request和requests的使用及区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。