当前位置: 首页 > news >正文

python | requests爬虫如何正确获取网页编码?

前言

使用 python 第三方库 requests 进行网页爬取时,如何正确地获取网页编码是十分重要的。

原因是:不同的网页可能有不同的编码格式,如果没有正确获取编码,可能会对后续内容提取造成一定的麻烦。

典型例子如:爬虫代码得到的编码与网页实际编码不一致,导致中文乱码问题。

常见网页编码有:utf-8、gbk、gb2312、iso-8859-1等。

常见三种网页编码获取方法分别为:手动浏览器查看、requests 自带编码获取方法、使用chardet 第三方编码识别模块。

当然,这三种方法都是建立在网页请求成功状态之下的,如果网页本身存在反爬机制,数据是通过渲染加载的,需要通过抓包等方式获取,那么大多数情况也就不存在查看网页编码一说了。

以下将根据示例,详细展示这三种方法的具体使用、优缺点对比等。

一、手动浏览器查看—多用以辅助验证

编写爬虫代码前,查看网页编码最直接了当的方法,就是手动通过浏览器去查看,具体有以下两种方式:

一是:目标网页【右键】-选择【检查】-在 html 中找到【charset】值,该值就是目标网页的编码。

图片

二是:目标网页【右键】-选择【查看网页源代码】- 在 html 中找到【charset】值,该值就是目标网页的编码。

图片

总结:以上方法多用以辅助验证、前期准备。因为在编写爬虫代码时,一般不会把编码写成一个固定值,这样会导致代码灵活性不高,后续网页编码一旦改变将可能会导致一些问题出现。

二、requests 自带编码获取方法—优先使用

requests 自带的三种可供获取网页编码的属性方法中,最准确、实用的为 :

response.apparent_encoding

这三种方法详细对比,如下图:

图片

用法​​​​​​示例1:response.headers

import requestsurl1 = 'https://dydytt.net/index.htm'
url2 = 'https://baijiahao.baidu.com/s?id=1842989128859063643&wfr=spider&for=pc'
response1 = requests.get(url1)
response2 = requests.get(url2)
headers1 = response1.headers
headers2 = response2.headers
print('url1返回headers中不包含charset字段:\n',headers1)
print('url2返回headers中包含charset字段:\n',headers2)

结果如下图:

图片

结果分析:不是所有的网页响应头中都包含 charset 字段的,如上例中 url1 响应头中就不包含 charset 字段。

用法示例2:response.encoding​​​​​​

import requestsurl1 = 'https://dydytt.net/index.htm'
url2 = 'https://baijiahao.baidu.com/s?id=1842989128859063643&wfr=spider&for=pc'
response1 = requests.get(url1)
response2 = requests.get(url2)
encode1 = response1.encoding
encode2 = response2.encoding
print('url1返回headers中不包含charset字段:\n',encode1)
print('url2返回headers中包含charset字段:\n',encode2)

结果如下图:

图片

结果分析:response.encoding,是基于响应头中的 charset 字段来提取的网页编码,若响应头不包含 charset ,则返回默认编码 ISO-8859-1,如上例中的 url1 。

用法示例3:response.apparent_encoding

import requestsurl1 = 'https://dydytt.net/index.htm'
url2 = 'https://baijiahao.baidu.com/s?id=1842989128859063643&wfr=spider&for=pc'
response1 = requests.get(url1)
response2 = requests.get(url2)
encode1 = response1.apparent_encoding
encode2 = response2.apparent_encoding
print('url1使用apparent_encoding属性获取到的网页编码:\n',encode1)
print('url2使用apparent_encoding属性获取到的网页编码:\n',encode2)

结果如下图:

图片

结果分析:response.apparent_encoding 获取的编码是最准确的。如 url1:

 (1)通过浏览器查看方式,可以看到 url1 的实际编码为 gb2312;

图片

(2)使用 response.headers ,url1 响应头中不包括 charset 字段,则无法获取网页编码;

(3)使用 response.encoding,因 url1 响应头中不包括 charset 字段,返回默认编码 ISO-8859-1,与 url1 实际编码 gb2312 不一致;

(4)使用 response.apparent_encoding ,获取的 url1 编码与实际编码一致,均为 gb2312。

三、chardet 第三方编码识别模块—可作了解

除上面两种基本方法外,还可以通过引入第三方模块 chardet 来查看网页编码。

一般来说,上面两种方法结合使用,已经可以满足绝大多数需求,使用 chardet 来查看网页编码,可作了解。

使用前,需要先安装 chardet ,安装命令为:

pip install chardet

具体运用代码如下:​​​​​​

import requests
import chardeturl1 = 'https://dydytt.net/index.htm'
url2 = 'https://baijiahao.baidu.com/s?id=1842989128859063643&wfr=spider&for=pc'
response1 = requests.get(url1)
response2 = requests.get(url2)
encode1 = chardet.detect(response1.content)
encode2 = chardet.detect(response2.content)
print('url1网页编码为:\n',encode1)
print('url2网页编码为:\n',encode2)

结果如下图

图片

结果分析:从结果来看,该方法对网页的编码判断还是比较准确的。这里有一个注意的点是,chardet.detect() 方法接受一个字节序列作为输入,所以上面代码中输入的是 response.content 的返回值。

总结

以上就是如何正确获取网页编码的三种常见方法,在代码中建议优先选择 requests 自带的 response.apparent_encoding,更为精准。

http://www.dtcms.com/a/504083.html

相关文章:

  • C语言对单链表的操作
  • DeepLab系列算法介绍
  • apache设置网站网址怎样将ftp转换为wordpress
  • .net和php哪个做网站好红色简约的手机社区类网站html5响应式模板下载
  • 民兵信息化网站建设wordpress页面添加照片
  • Docker 安装 CentOS
  • 做黑彩票的网站赚钱吗微信公众号怎么做好看
  • 内蒙古集宁建设厅官方网站国外app设计网站
  • C++ vector类的使用
  • 咸阳建设局网站自己公司怎样弄个网站
  • 网站做推广需要什么条件免费制作招聘的app
  • 临沂市建设安全管理网站nginx 搭建wordpress
  • 管理有限公司网站设计中文企业网站html模板
  • 网站的搜索功能怎么做网站建设实训报告模板
  • Redis集群架构详解:从单机到分布式的扩展之路
  • Csrf4
  • mysql数据库、iptables、Ivs服务和keepalived服务
  • html全屏网站东莞网站推广的公司
  • 人才共享网站的建设方案怎么写做网站要固定ip
  • 网站建设的软件介绍谷歌推广优化
  • 解锁7倍生成式AI性能:NVIDIA Jetson AGX Thor上的更快、更智能的边缘模型
  • 重生做门户网站的小说千灯做网站
  • 沧浪设计网站公司化工企业网站jsp
  • 做超市dm的网站百度网盟推广怎么做
  • 网站开发工作经验怎么写wordpress注册文件
  • Vue2与Vue3:核心差异精简对比
  • 做网站国家大学科技园郑州沈阳网站建设公司哪个好
  • 网站做线wordpress指定分类文章详情页模板
  • 【测试】123456789
  • 东莞建站模板网络服务通知