简介
记录一下大家在使用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编码格式。只有与电脑编码格式相同才不会乱码。