urllib TypeError: memoryview: dict object does not have the buffer interface

本文介绍了一个关于使用Python的urllib库发送HTTP请求时遇到的问题及解决方案。当请求头中包含字典类型的数据时,会出现错误。文章详细解释了错误原因,并给出了正确的设置请求头的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import urllib.request
url = 'site'
headers = {'Authorization' : 'Basic emVkMHg6WWJyYm5mMDA='}
req = urllib.request.Request(url, headers)
response = urllib.request.urlopen(req).getcode()

出现错误:

Traceback (most recent call last):
  File "C:\Program Files\Python33\lib\urllib\request.py", line 1186, in do_request_
    mv = memoryview(data)
TypeError: memoryview: dict object does not have the buffer interface

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/zed/Desktop/sddf.py", line 6, in <module>
    response = urllib.request.urlopen(req).getcode()
  File "C:\Program Files\Python33\lib\urllib\request.py", line 156, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Program Files\Python33\lib\urllib\request.py", line 467, in open
    req = meth(req)
  File "C:\Program Files\Python33\lib\urllib\request.py", line 1191, in do_request_
    data))
ValueError: Content-Length should be specified for iterable data of type <class 'dict'> {'Authorization': 'Basic emVkMHg6WWJyyM5mMDA='}

解决办法:

先看Requset定义:

class Request:
    def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):

所以,应该改为

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

 

转载于:https://www.cnblogs.com/arhatlohan/p/4249776.html

### 关于 Scrapy 爬虫中 TypeError 'builtin_function_or_method' object is not subscriptable 的解决方案 在开发 Scrapy 爬虫时,如果遇到 `'builtin_function_or_method' object is not subscriptable` 类型的错误,通常是由于尝试对内置函数或方法进行了非法索引操作引起的。以下是对此类问题的具体分析和解决办法。 #### 1. **错误的根本原因** 此类错误通常发生在代码试图像对待序列(如字符串、列表等)一样对待一个函数或方法的情况下。例如,下面这段代码会导致类似的错误: ```python str = "example" print(str[:]) # 正确用法 print(len[:]) # 错误用法,len 是一个内置函数而非可切片的对象 ``` 因此,在爬虫项目中定位到具体的语法错误位置至关重要[^2]。 #### 2. **检查代理设置中的问题** 根据您提供的代码片段来看,可能是 `request.meta['proxy']` 部分存在问题。确保传递给 meta 字典的内容是一个合法字符串形式表示的代理地址而不是其他类型的变量。比如: ```python class MyProxyDownloaderMiddleware(object): def process_request(self, request, spider): proxy_address = 'http://username:password@host:port' if isinstance(proxy_address, str): # 明确指定类型安全检查 request.meta['proxy'] = proxy_address else: raise ValueError("Invalid Proxy Address Format") ``` 这里增加了对于 `proxy_address` 变量的数据类型校验环节以防止意外传入非字符串值引发后续运行期崩溃状况[^3]。 #### 3. **调试技巧与最佳实践** 为了更好地排查这类难以捉摸的 bug ,推荐采用如下几种方式之一来进行深入探究: - 使用断点工具逐步跟踪程序流直至发现异常节点; - 添加详尽的日志输出语句以便观察各阶段内部状态变化详情; 另外值得注意的是,在编写复杂表达式之前先单独测试每一个组成部分的功能正确性往往能够有效降低整体维护难度以及提升最终产品质量[^4]。 --- ### 提供一段修正后的完整样例代码作为参考 ```python import scrapy from urllib.parse import urljoin class ExampleSpider(scrapy.Spider): name = 'example' def start_requests(self): base_url = 'https://www.example.com/' urls_to_scrape = [ '/page1', '/page2', ] for endpoint in urls_to_scrape: full_url = urljoin(base_url, endpoint) yield scrapy.Request( url=full_url, callback=self.parse, dont_filter=True, errback=self.err_handler ) def parse(self,response): title = response.xpath('//title/text()').extract_first() links = response.css('a::attr(href)').getall() item = {} item["url"] = response.url item["title"] = title return item def err_handler(self,failure): self.logger.error(repr(failure)) ``` 上述例子展示了一个较为标准结构化的 Spider 定义流程,并且包含了基本错误捕捉机制以防止单一请求失败影响整个作业进程继续推进下去[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值