urllib库添加headers的一般方法

对于请求一些网站,我们需要加上请求头才可以完成网页的抓取,不然会得到一些错误,无法返回抓取的网页。下面,介绍两种添加请求头的方法。

方法一:借助build_opener和addheaders完成

import urllib.request
url="http://www.meizitu.com"
#注意:在urllib 中headers是元组
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE")

opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open(url)
print(data.read())

注意:此处的headers要写为一个元组类型才可以。写为字典类型的话会报错!

方法二、创建一个Request实例对象

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 案例1
import urllib.request
url="http://www.meizitu.com"
#注意:在urllib 中这种的headers 是需要是字典的
headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE"}
req=urllib.request.Request(url=url,headers=headers)
file=urllib.request.urlopen(req)

#出现有些解码错误的话,加上“ignore”就可以啦
print(file.read().decode("utf-8",'ignore'))

注意:此处的headers要写为一个字典类型才可以。

创建一个Reques对象,把需要的headers,url,proxy 都放进去,或者在post 请求中还可以把编码过后的data 值放进去,再用urlopen 打开,就比较方便了。

另外,这种方法还可以用add_headers()来添加headers,代码如下:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import urllib.request
try:
    url="http://www.meizitu.com"

    req=urllib.request.Request(url=url)

    req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE")
    file=urllib.request.urlopen(req,timeout=10.1)

    print(file.read().decode("utf-8",'ignore'))
except Exception as e:
    print("时间超时",str(e))

总结:
通过以上两种方法,可以完成请求头的相关参数设置,但是得注意headers是用字典类型来传入还是元组类型。

<think>好的,我现在需要向用户介绍urllib。首先,我要回忆一下urllib的基本信息,确保自己没有记错。urllibPython的标准,用于处理URL相关的操作,比如发送HTTP请求、处理响应等。记得它有几个模块,比如urllib.request、urllib.parse等等。 接下来,我得组织一下结构,确保回答清晰。用户可能需要知道urllib的组成部分和每个模块的功能,最好分点说明。比如,urllib.request用于打开和读取URL,urllib.parse用于解析URL,urllib.error处理异常,urllib.robotparser处理robots.txt文件。这些模块需要一一解释,每个模块的作用和常用方法。 然后,用户可能想知道基本用法,比如如何发送GET请求,如何处理POST请求,或者如何设置请求头。这候需要给出一些简单的代码示例,但要注意用中文说明,并且按照系统级指令中的格式要求,数学表达式用$...$,但代码应该用代码块吗?不过用户这里可能只需要文字描述,避免使用代码块,而是用中文步骤说明。不过可能需要提到相关函数,比如urlopen()、Request对象等。 另外,要注意提到异常处理,比如urllib.error中的HTTPError和URLError,说明在请求过程中可能会遇到的错误以及如何处理。这部分对用户来说很重要,因为实际使用中经常会遇到404或500错误。 还有,urllib相比第三方如requests有什么优缺点?虽然用户没直接问,但可能隐含这个需求。可以简要提到urllib是标准,无需安装,但API不够友好,而requests更简洁,但需要额外安装。这样用户可以根据需求选择。 最后,给出一个综合示例,演示如何发送带参数的GET请求,处理响应和异常。这样用户能有一个整体的认识。同提醒用户注意网络请求的基本注意事项,比如添加请求头、处理编码问题等。 检查一下有没有遗漏的部分,比如urllib.parse中的urlencode函数,用于生成查询字符串,这在构造带参数的URL非常有用。需要提到这个函数的用法,比如将字典转换为URL参数。 可能还需要提到Python 3中urllib的结构,因为Python 2中urlliburllib2是分开的,但在Python 3中已经整合成urllib。这点需要说明清楚,避免用户混淆。 总结一下,回答的结构应该是:概述urllib,分模块介绍,基本用法(GET/POST请求),异常处理,解析URL,以及一个综合示例。同比较与第三方的差异,帮助用户理解使用场景。确保每个部分简洁明了,步骤清晰,符合用户可见层的要求。</think>urllibPython 的标准,用于处理与 URL 相关的网络操作。它提供了一系列模块,帮助开发者完成 HTTP 请求、URL 解析、异常处理等任务。以下是分步介绍: --- ### 一、urllib 的组成模块 1. **`urllib.request`** 用于打开和读取 URL,支持设置请求头、表单提交等。 - 核心函数:`urlopen()` ```python from urllib.request import urlopen response = urlopen('https://www.example.com') content = response.read() # 读取响应内容 ``` 2. **`urllib.parse`** 用于解析和构造 URL。 - `urlparse()`: 拆分 URL 的各个部分(协议、域名、路径等)。 - `urlencode()`: 将字典转换为 URL 查询字符串。 ```python from urllib.parse import urlencode params = {'key1': 'value1', 'key2': 'value2'} query_string = urlencode(params) # 输出: key1=value1&key2=value2 ``` 3. **`urllib.error`** 处理请求过程中的异常。 - `HTTPError`: HTTP 错误(如 404、500)。 - `URLError`: URL 解析或连接失败。 4. **`urllib.robotparser`** 解析网站的 `robots.txt` 文件,判断是否允许爬取。 --- ### 二、基本用法示例 #### 1. 发送 GET 请求 ```python from urllib.request import urlopen # 发送请求并读取响应 response = urlopen('https://httpbin.org/get') print(response.status) # 状态码(如 200) print(response.read().decode('utf-8')) # 解码内容 ``` #### 2. 发送 POST 请求 ```python from urllib.request import urlopen, Request from urllib.parse import urlencode # 构造表单数据 data = urlencode({'name': 'Alice', 'age': 25}).encode('utf-8') # 创建 Request 对象并设置请求方法 request = Request('https://httpbin.org/post', data=data, method='POST') # 发送请求 response = urlopen(request) print(response.read().decode()) ``` #### 3. 设置请求头 ```python headers = {'User-Agent': 'Mozilla/5.0'} request = Request('https://httpbin.org/headers', headers=headers) response = urlopen(request) ``` --- ### 三、异常处理 ```python from urllib.request import urlopen from urllib.error import HTTPError, URLError try: response = urlopen('https://example.com/404-page') except HTTPError as e: print(f"HTTP错误: {e.code} - {e.reason}") except URLError as e: print(f"URL错误: {e.reason}") ``` --- ### 四、urllib 的优缺点 - **优点** - 无需安装,Python 内置。 - 功能全面,覆盖基本网络操作。 - **缺点** - API 设计较底层,使用不如 `requests` 简洁。 - 需要手动处理编码、Cookie 等细节。 --- ### 五、完整示例(带参数和异常处理) ```python from urllib.request import Request, urlopen from urllib.parse import urlencode from urllib.error import HTTPError url = 'https://httpbin.org/get' params = {'page': 1, 'limit': 10} query = urlencode(params) full_url = f"{url}?{query}" try: request = Request(full_url, headers={'User-Agent': 'Test'}) with urlopen(request) as response: print(response.read().decode('utf-8')) except HTTPError as e: print(f"请求失败: {e.code}") ``` --- ### 六、适用场景 - 快速实现简单的 HTTP 请求。 - 项目限制不能安装第三方(如 `requests`)。 - 需要精细控制请求过程(如自定义协议处理器)。 如果需要更简洁的 API 或高级功能(如会话保持、SSL 验证),建议使用第三方 `requests`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值