解决Python3.6,发送POST请求错误提示:POST data should be bytes, an iterable of bytes, or a file object. It canno

之前遇到的坑,今天又遇到了,在此记录一下,

爬虫时,转码data时,出现下面错误信息:

POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.


测试代码:

# -*- coding:utf-8 -*-

import urllib.request

def movieSpider():
    """
        模拟Ajax请求

    """

    url = "https://movie.douban.com/j/chart/top_list?"

    header = {"User-Agent" : "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.7.62 Version/11.01"}

    formData = {
            "type" : "11",
            "interval_id" : "100:90",
            "action" : "",
            "start" : "0",
            "limit" : "20"
        }

    data = urllib.parse.urlencode(formData)

    request = urllib.request.Request(url, data=data, headers=header)

    print(url)
    print(data)

    print(urllib.request.urlopen(request).read())

if __name__ == "__main__":
    movieSpider()

报错截图:



查看源文档:https://docs.python.org/3/library/urllib.parse.html

Convert a mapping object or a sequence of two-element tuples, which may contain str or bytes objects, to a percent-encoded ASCII text string. If the resultant string is to be used as a data for POST operation with the urlopen() function, then it should be encoded to bytes, otherwise it would result in a TypeError.
简洁明了一句话,转码为bytes类型


修改代码如下:

# -*- coding:utf-8 -*-

import urllib.request

def movieSpider():
    """
        模拟Ajax请求

    """

    url = "https://movie.douban.com/j/chart/top_list?"

    header = {"User-Agent" : "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.7.62 Version/11.01"}

    formData = {
            "type" : "11",
            "interval_id" : "100:90",
            "action" : "",
            "start" : "0",
            "limit" : "20"
        }
	
    #将str类型转换为bytes类型
    data = urllib.parse.urlencode(formData).encode("utf-8")

    request = urllib.request.Request(url, data=data, headers=header)

    print(urllib.request.urlopen(request).read().decode("utf-8"))

if __name__ == "__main__":
    movieSpider()


测试结果(部分截图):



总结:

多看源文档少踩坑

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值