Python爬虫错误合集及解决方案

简介

记录一下大家在使用Python爬虫过程中可能会遇到的错误以及相应解决办法。

1.设置请求头错误

错误示例:

html=requests.get(url,headers)  # 错误做法

正确做法应该是

html=requests.get(url,headers=headers)

如果像上面第一种写法那样写,我们请求网站的时候是不会用到自己设置的header的,还是默认的header进行的请求,所以访问一下有限制的网站就会失败。大家可以自行测试一下,然后自己打印html.header看看是不是像我说的那样。

2.header编码错误

有时候我们从浏览器直接复制请求头中的Cookie时,注意要点开原始内容再复制。否则会出现解码错误,比如

UnicodeEncodeError:'latin-1' codec can't encode character '\u2026' in position 512 :xxx

可以看到上面报错信息中有putheader,其实就是header里面有不能被编码的字符,并且一般都是Cookie中字符的问题。

出现这种情况,大部分都是因为一些人直接在浏览器请求头处复制Cookie,但这样会复制到一些其他的字符编码,正确做法应该是先点击原始内容,然后再复制

这样复制的内容就不会有问题了。但为了保险起见,我们还可以在Cookie字符串前面加个r,防止其中包含某些特殊字符转义,比如下面这样

headers={
    'Cookie': r'DV3XjRzifgSVzhRmUVntzCnA8GFScDLwKDhOb8h7FsFNS',
}

3.获取网页HTML乱码

出现这种情况,一般都是解码问题。我们可以通过浏览器查看网页源代码,看看它默认是什么字符编码,如下图

像上面这样,说明这个网页是utf-8编码的,我们只需要在请求的时候设置一下解码格式就好了

html=requests.get(url,headers=headers)
html.encoding="utf-8"
print(html.text)

当然requests库还提供一个获取网页编码的方法

html=requests.get(url,headers=headers)
# 打印网页真实编码
print(html.apparent_encoding)

不过现在大部分网页都是utf-8编码的,所以我们默认可以不设置编码,如果请求不到内容或者乱码时,再设置对应编码。

4.二进制数据解码错误

有时候我们要把获取到的bytes数据转为普通字符串,有可能会出现这样的错误

UnicodeEncodeError: 'gbk' codec can't encode character '\u2764' in position 18396:

属于是解码错误,比如原本是utf-8编码的bytes,那么我们就要使用相应的utf-8去解码decode。

strs="测试字符串编码和解码"
bytes_str=strs.encode("utf-8")
print(bytes_str.decode("utf-8"))
print(bytes_str.decode("gbk"))  # 会出错

就比如上面这样写,第二个print就会出错。因为我们是utf-8编码的,也应该用utf-8解码,因此我们要解码的时候一定要注意其编码格式。

如果使用了对应的编码格式去解码,还是出错的话,那么我们可以尝试下面这样写

# errors='ignore'忽略不能识别编码的字符
strs=bytes_str.decode("utf-8",errors='ignore')

5.保存内容到EXCEL乱码

有时候我们需要把爬取到的内容保存到excel文件中,内容在Python编译器中是正常显示的,但在电脑上打开文件打开文件后显示却是乱码,这其实是你的编码设置问题。

在Windows系统中,因为系统默认编码是gbk2312,而你保存的时候如果是utf-8编码的,那么就会出现打开文件是乱码的情况,解决办法:只需要在写入csv文件时加一个 encoding="gbk" 即可。

如果是苹果系统,那么写入文件时就应该使用utf-8编码,因为苹果系统默认就是utf-8编码格式。只有与电脑编码格式相同才不会乱码。

【来源:Python爬虫错误合集及解决方案 - 知乎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值