吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2767|回复: 12
收起左侧

[学习记录] 解决python爬虫乱码问题

[复制链接]
l2430478 发表于 2021-1-10 20:21
本帖最后由 l2430478 于 2021-1-10 20:48 编辑

上一个帖子已经“爬出虫”了,这一贴是我是摸索修改,为了不混淆,导致小白看不明白,特新开一贴。
代码非我原创,我总结后展示给大家。



问题类型一:
我尝试把上个帖子中代码改为www.baidu.com,alt+回车后,果然爬出不少东西,但出来的东西乱七八糟。我尝试用其他代码爬虫。
[Python] 纯文本查看 复制代码
import requests
url="http://www.baidu.com"
html=requests.get(url).text
print(html)

结果出来一堆乱码,以前看过视频教程,这样的乱码,是编码问题。
我们可以通过如下编码来查找问题。
[Patch] 纯文本查看 复制代码
import requests
import sys
#输出我们编译器所用的编码
print(sys.getdefaultencoding())
url="http://www.baidu.com"
html=requests.get(url)  
#输出百度的编码
print(html.encoding)


发现输入输出不一致,情况如下:
utf-8ISO-8859-1
继续找原因,我们打开检查,按图所示,可以看到是压缩模式。接下来我们就进行编码转化
快照4.jpg
[Python] 纯文本查看 复制代码
import requests
url="http://www.baidu.com"
html=requests.get(url).text
#encode编码,将ISO-8859-1编码成unicode
html=html.encode("ISO-8859-1")
#decode解码,将unicode解码成utf-8
html=html.decode("utf-8")
print(html)

许多代码可以用来借鉴,为我们所用即可,好的代码请保存起来备用,很多代码思路不错的。


问题类型二:
https://chengdu.chashebao.com/yanglao/19077.html为例。
[Python] 纯文本查看 复制代码
#!usr/bin/python
#coding: UTF-8

import requests
link = "https://chengdu.chashebao.com/yanglao/19077.html"
headers = { 'User-Agent': 'Mozilla/5.0 (Windows;U; Windows NT6.1;en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}

r = requests.get(link,headers = headers)
print (r.text)


用刚的方法发现是乱码
右键点击查看网页源代码,不是检查,然后查看网页源代码的head部分的编码:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">charset后面就是网页编码类型,发现网页编码为gbk类型


网页编码通常有2种类型:
utf-8可以支持大多数国家字符,属于国际编码,也就是即使在外国浏览国内的网站,也不会出现乱码。它的英文占用一个字节,中文占用三个字节,对于英文字符较多的网站来说,utf-8节省空间,不过uft-8占用的数据库比gbk要大。
gbk包含全部中文字符,属于国家编码,如果在IE没有安装支持简体中文的电脑上浏览时,中文会变成乱码;使用双字节来表示,不论中、英文字符易使用双字节来表,但通用性比utf-8差。

下面我们利用requests库的方法查看默认输出的编码类型
[Python] 纯文本查看 复制代码
import requests
import sys
print(sys.getdefaultencoding())
url="https://chengdu.chashebao.com/yanglao/19077.html"
html=requests.get(url)
print(html.encoding)


输出结果为编码ISO-8859-1,并不是原网页的编码类型。


我们可以利用requests库改变输出结果的编码
[Python] 纯文本查看 复制代码
import requests

url = 'https://chengdu.chashebao.com/yanglao/19077.html'

response = requests.get(url)
response.encoding = 'gbk'
print(response.encoding) 


输出结果为编码gbk,与原网页保持一致。基于以上三个步骤,即可解决爬虫中文乱码问题。
[Python] 纯文本查看 复制代码
import requests

def get_html(url):
    try:
        response = requests.get(url)
        response.encoding = 'gbk'  # 改变编码
        print(response.encoding)
        html = response.text
        return html
    except:
        print('请求网址出错')

url = 'https://chengdu.chashebao.com/yanglao/19077.html'
html = get_html(url)
print(html)



问题完美解决。
-----------------------------
解决爬虫中文乱码的步骤 网址编码为utf-8对于有些网页编码为utf-8的网址,输出事发现中文为乱码,此时我们需要进行两次重编码。
[Python] 纯文本查看 复制代码
response = requests.get(url, headers=headers)[/size]
response.encoding = 'GBK'
response.encoding = 'utf-8'

解决爬虫中文乱码的步骤 网址编码为gb2312
[Python] 纯文本查看 复制代码
response.encoding = 'GBK'







以下为转载

爬虫最常见的问题是返回的数据中文乱码,对于爬虫小白来说这样的问题几乎不可避免,不过别担心,我这里有好几种解决中文乱码的方法,总有一款适合你。
方法一:采用我这里代码里的这种方法,先在代码头设置编码方式为 " UTF-8" ,UTF-8 是保存中文字符的通用代码。然后,添加如下代码,一般都能解决中文乱码问题。
[Python] 纯文本查看 复制代码
#如果目标网页编码与本地不一致,修改本地默认编码方式(防止输出中文乱码)
if sys.getdefaultencoding() != resp.encoding:            #resp.encoing用于查询网页所采用的编码格式
    reload(sys)
    sys.setdefaultencoding(resp.encoding)                #设置本地编码格式与网页的编码格式相同



方法二:这里先补充几个知识点:
  • decode -----把当前字符解码成Unicode编码
  • encode-----把Unicode编码格式的字符编码成其他格式的编码
  • Python默认使用Unicode字符集,做编码转换时,要把Unicode作为中间编码,先decode(解码)成Unicode编码,再encode(编码)成其他编码。
  • 非Unicode编码不能直接encode成其他编码,否则会报错。
  • 用requests模块获得response对象,已经预先对于网页的编码格式(通过网页的Head头里的charset =XXX)做出判断,用resp.text得到的内容是解码之后的内容,不需要再次解码。
  • 而用resp.content 得到的内容是未解码的二进制字节流,要先decode(解码),再encode(编码)

[Python] 纯文本查看 复制代码
#text输出的数据由request自动解码(把bytes型数据变成Unicode字符),只需要把Unicode编码成utf-8输出就行
 respText1= resp.text.encode('utf-8','ignore')
 
#content的内容需要手动解码成unicode再编码成utf-8等其他编码
 respText2 = resp.content.decode('utf-8','ignore').encode('GBK','ignore')


方法三:如果是在Pycharm中编程可以把图中圈起来的地方全部改成UTF-8,简单粗暴。
快照5.jpg

方法四
网上有个代码在decode中加了第二个参数’ignore’,尝试了下竟然成功了,原来是文本中有不属于gbk的编码,之前遇到时就会报错,但其实那些地方无关紧要,需要的信息正确就好。
[Python] 纯文本查看 复制代码
content = urllib2.urlopen(url).read().decode('gbk','ignore').encode('utf-8')

另附:判断文本真实编码的代码:
[Python] 纯文本查看 复制代码
import chardet
print chardet.detect(content)['encoding']




免费评分

参与人数 4吾爱币 +3 热心值 +4 收起 理由
bevirus + 1 + 1 谢谢@Thanks!
阿傑 + 1 + 1 我很赞同!
aspire向往 + 1 + 1 我很赞同!
waltzofjack + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

VIP007 发表于 2021-1-10 20:24
沙发,谢谢,这个学习型。关注楼主了
ciker_li 发表于 2021-1-10 21:02
我懂 发表于 2021-1-10 21:08
不跟蠢逼说话 发表于 2021-1-10 21:14
感谢分享
minshenyao 发表于 2021-1-10 21:16
楼主,能不能帮我爬一下这七个视频,谢谢!
Screenshot_2021-01-09-21-46-16-585_com.android.browser.jpg
Screenshot_2021-01-09-21-42-44-336_com.android.browser.jpg
beyond1994 发表于 2021-1-10 21:19
擦,我在学Python基础,几十行都费脑
Pengpo 发表于 2021-1-10 21:22
感谢楼主,目前正在琢磨这些问题谢谢谢谢
xjshuaishuai 发表于 2021-1-10 21:59
学习了。不错的分享!
阿傑 发表于 2021-1-10 22:51
来学习一下,感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 04:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表