Python爬虫指南:urllib.request与requests库的使用及核心区别

Evan
Evan
发布时间:2026-10-13| 6人浏览过
原创

本文详细解析Python中urllib.request与requests库的使用方法及核心差异。通过对比urlopen()与Request类的构建方式,以及requests库对GET/POST请求的便捷封装,帮助开发者理解为何在实际开发中更推荐使用requests。内容涵盖Headers添加、响应数据处理及代码示例,适合Python爬虫初学者参考。

urllib.request基础使用

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()方法进行进一步处理。通常读取后需使用decode()进行解码,默认编码多为utf-8,经过这些步骤后才能获取到目标网页内容。

urllib.request添加Headers信息

添加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请求通常需要附加User-Agent、Cookie等信息,甚至需要配置代理服务器。这些操作往往是应对网站反爬机制的必要手段。

requests库的使用与优势

requests

在使用Python进行爬虫开发时,通常更推荐使用requests库。相比urllib,requests更加便捷:它可以直接构造并发起GET或POST请求,而urllib.request则需要先构建请求对象,再发起调用。


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库。

urllib.request.Request与urlopen的区别

补充知识:Python中urllib.request.Request()与urllib.request.urlopen()的区别

Python中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的使用及区别详解的内容分享完毕,希望能为大家提供参考,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。