python爬虫怎么改变响应的编码,Python爬虫urlopen编码问题及解决方案

问题描述:

在爬取百度贴吧的内容时候,一次只爬取一页的时候,没有问题,但是使用for i in range 一次爬取多个页面的时候出现以下问题

ffc6960a44eb408f7e08452db60961b8.png

代码如下,红框内代码报错:

90e7d3590f895bb2fb12afabed462198.png

字符拼接没有问题,两次输出就是相同

https://tieba.baidu.com/f?kw=诗词吧&ie=utf-8&pn=200

https://tieba.baidu.com/f?kw=诗词吧&ie=utf-8&pn=200

想到一个问题,当浏览器中的url地址存在中文时候,在网页跳转时候会自动进行给它url转码,进行测试,查看是否是这个原因

修改后代码如下:

from urllib import request, parse, error

base_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}"

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"

}

def allow(minpage,maxpage, string2):

maxnum = maxpage * 50 + 50 + minpage;

maxnum = maxpage * 50 + minpage;

print(minpage,maxnum)

try:

for i in range(minpage, maxnum, 50):

string1 = base_url.format(parse.quote(string2), i)

url = request.Request(url=string1, headers=headers)

res = request.urlopen(url)

res1 = res.read().decode("utf-8")

with open(string2 + str(i) + ".html", "w", encoding="utf-8") as f:

f.write(res1)

print(string2 + str(i) + ".html")

except error.HTTPError as e:

print(e.code)

except error.URLError as e:

print(e.reason)

else:

print("成功")

string2 = input("请输入贴吧名:")

minpage = int(input("请输入页数开始值:"))

maxpage = int(input("请输入下载页数:"))

print(minpage, maxpage, string2)

allow(minpage, maxpage, string2)

修改代码:

string1 = base_url.format(parse.quote(string2), i)

运行成功,截图如下:

a3ca26f8a00c9058b3ef740e2a24a5a0.png

996b407cb405ce6a7cb06ada2a363fd8.png

分析:

Url编码

urllib.parse.quote(string) 将字符传进行编码

urllib.parse.unquote(string) 将字符传进行解码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值