爬虫rewquests爬去网页乱码问题

requests在爬取网页时候时候中文显示乱码

import requests
url = ‘http://www.neihan8.com/wenzi/index_2.html‘
res = requests.get(url)res.encoding #获取res的编码格式res.headers   #获取Content-Type内容res.apparent_encoding   #获取网页正确的编码格式
html = res.text# 返回的结果是处理过的Unicode类型的数据
print(res)print(res.encoding)#获得网页源码的格式 打印显示 ISO-8859-1

第一个问题是,为什么会有ISO-8859-1这样的字符集编码?

iso-8859是什么?  他又被叫做Latin-1或“西欧语言” .  对于我来说,这属于requests的一个bug,在requests库的github里可以看到不只是中国人提交了这个issue.  但官方的回复说是按照http rfc设计的。

下面通过查看requests源代码,看这问题是如何造成的 !

requests会从服务器返回的响应头的 Content-Type 去获取字符集编码,如果content-type有charset字段那么requests才能正确识别编码,否则就使用默认的 ISO-8859-1. 一般那些不规范的页面往往有这样的问题. 现在一般的Content-Type 是‘text/html‘。所以现在一般读取源码以后都是用‘  html = res.text‘ 格式读取。但是也可用通过html = res.content来获取返回的源码。

第二个问题, 那么如何获取正确的编码?

requests的返回结果对象里有个apparent_encoding函数, apparent_encoding通过调用chardet.detect()来识别文本编码. 但是需要注意的是,这有些消耗计算资源.
至于为毛,可以看看chardet的源码实现.

第三个问题,requests的text() 跟 content() 有什么区别?

requests在获取网络资源后,我们可以通过两种模式查看内容。 一个是res.text,另一个是res.content,那他们之间有什么区别呢?

分析requests的源代码发现,res.text返回的是处理过的Unicode型的数据,而使用res.content返回的是bytes型的原始数据。也就是说,res.content相对于res.text来说节省了计算资源,res.content是把内容bytes返回. 而res.text是decode成Unicode. 如果headers没有charset字符集的话,text()会调用chardet来计算字符集,这又是消耗cpu的事情.

requests中文乱码解决方法有这么几种

1、由于content是HTTP相应的原始字节串,可以根据headers头部的charset把content decode为unicode,前提别是ISO-8859-1编码.

r.encoding   # ‘gbk‘
print r.content.decode(r.encoding)

 2、另外有一种特别粗暴方式,就是直接根据chardet的结果来encode成utf-8格式.

r  = requests.get(‘http://item.jd.com/1012551875.html‘)
r.apparent_encoding     #   ‘GB2312‘
r.encoding   # ‘gbk‘
r.content.decode(r.encoding).encode(‘utf-8‘)# 问题 r.encoding和r.apparent_encoding什么区别????

 如果在确定使用text,并已经得知该站的字符集编码时,可以使用 r.encoding = ‘xxx’ 模式, 当你指定编码后,requests在text时会根据你设定的字符集编码进行转换.

>>> import requests
>>> r = requests.get(‘https://up.xiaorui.cc‘)
>>> r.text
>>> r.encoding
‘gbk‘
>>> r.encoding = ‘utf-8‘

  

时间: 2024-10-05 04:31:20

爬虫rewquests爬去网页乱码问题的相关文章

python(27)requests 爬取网页乱码,解决方法

最近遇到爬取网页乱码的情况,找了好久找到了种解决的办法: html = requests.get(url,headers = head) html.apparent_encoding html.encoding = html.apparent_encoding print html.text 头文件中添加: import sys reload(sys) sys.setdefaultencoding("utf-8")

scrapy 爬去网页(1)

第一次爬去https://segmentfault.com/t/python?type=newest&page=1 首先定义爬去的字段: class CnblogsItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field() listUrl = scr

爬去网页离线数据

重命名文件 On Error Resume Next    Dim dd As String    Dim k% ''提取文件夹名称    dd = Dir(Sheets("Sheet1").Cells(1, 2) & "*", vbDirectory)    Do        dd = Dir        ''判断是否为文件夹        If dd <> "" And InStr(1, dd, ".&quo

如何通过jsoup网络爬虫工具爬取网页数据,并通过jxl工具导出到excel

1:闲话少说,直接看需求: 抓取的url:http://www.shparking.cn/index.php/welcome/municipal_parking?key=&per_page=. 参考的资料:http://blog.csdn.net/lmj623565791/article/details/23272657 需求:抓取指定url,共n页信息(即需要分析内部链接),将页面上的停车信息抓取出来(即需要分析停车信息的特征),并导入到excel中. 问题分析:因为页面上存在相同的停车场信息

python3爬取网页

爬虫 python3爬取网页资源方式(1.最简单: import'http://www.baidu.com/'print2.通过request import'http://www.baidu.com'print1.import urllib.request 'wd''python''opt-webpage''on''ie''gbk'GET和POST请求的不同之处是POST请求通常有"副作用" 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)

一个咸鱼的Python爬虫之路(三):爬取网页图片

学完Requests库与Beautifulsoup库我们今天来实战一波,爬取网页图片.依照现在所学只能爬取图片在html页面的而不能爬取由JavaScript生成的图.所以我找了这个网站http://www.ivsky.com 网站里面有很多的图集,我们就找你的名字这个图集来爬取 http://www.ivsky.com/bizhi/yourname_v39947/ 来看看这个页面的源代码: 可以看到我们想抓取的图片信息在<li> 里面然后图片地址在img里面那么我们这里可以用Beautifu

使用htmlparse爬虫技术爬取电影网页的全部下载链接

昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚然,我们的重点在于如何灵活运用我们已学的技术,这就需要我们不断的练习,不停的思索和深入发掘,在了解了精髓和意义之后运用到实践中才是技术的最高境界. 今天呢,本着昨天的兴趣,想来爬一爬电影资源,中途为了找一个好用趁手的工具,也是费了不少心思,早上半天基本上都在学习和找资料的过程中度过,下午开始才进入状

python爬虫01-使用urllib爬取网页

1 import urllib.request # 导入模块 2 import urllib.parse 3 4 # 将网页赋给变量file 5 file = urllib.request.urlopen("http://www.baidu.com") 6 7 # 读取网页 8 data = file.read() # 读取全部内容,结果作为一个字符串变量 9 dataline = file.readline() # 读取一行的内容 10 datalines = file.readli

用JAVA制作一个爬取商品信息的爬虫(爬取大众点评)

很多企业要求利用爬虫去爬取商品信息,一般的开发模型如下: for i=1;i<=最大页号;i++ 列表页面url=商品列表页面url+?page=i(页号) 列表页面=爬取(列表页面url) 商品链接列表=抽取商品链接(列表页面)  for 链接 in 商品链接列表: 商品页面=爬取(链接) 抽取(商品页面); 这样的模型看似简单,但是有一下几个问题: 1)爬虫没有线程池支持. 2)没有断点机制. 3)没有爬取状态存储,爬取商品网站经常会出现服务器拒绝链接(反问次数过多),导致一旦出现 拒绝链接