wpf esc key 检测不到_爬虫笔记之requests检测网站编码方式(zozo.jp)(碎碎念) - CC11001100...

news/2024/5/9 8:30:18/文章来源:https://blog.csdn.net/weixin_39846664/article/details/111141582

发现有些网站的编码方式比较特殊,使用requests直接请求拿是得不到正确的文本的,比如这个网站:

当使用requests访问网站,使用方式取响应文本的时候,会发现得到的是奇怪的内容:

#!/usr/bin/env python3
# encoding: utf-8
"""
@author: CC11001100
"""
import requestsif __name__ == "__main__":url = ""response = (url)print()

看下输出:

9d0fdf4a5d3b99bc8f2287f0feabdbf4.png

和chrome的网页标题对照一下:

7936dc469744ae5b24305d9de93d3feb.png

似乎长得有点不太一样...

这个的原因就比较坑爹了,requests的响应内容的编码方式是先尝试从响应头中根据content-type获取,如果获取不到就再尝试依据chardet来判断,而很不幸的,我们的逻辑并没有撑到chardet那里,它神奇的从响应头中获取到了编码方式,被识别为了ISO-8859-1:

print(f"网页的编码方式为:{}")  # 网页的编码方式为:ISO-8859-1

但是,为什么呢?我们在网页上找是找不到有哪个地方设置了这个编码方式的,这就是为什么说它坑爹的地方,我们来看下requests源码中对响应的编码方式的识别这部分,在方法中的这一行是设置响应的编码方式:

4cb505dd6136fc5dbebabd4a69248642.png

我们跟进去这个get_encoding_from_headers方法,这个方法在utils中,方法代码不长只有几个小逻辑:

75be7d04397e66509229562faf6c1285.png

先是从响应头中获取content-type响应头,如果这个响应头不存在的话,则认为无法从响应头中获取到编码方式,直接返回None。

然后是487行,调用了一个_parse_content_type_header方法:

629e3b4bd86c82e662bee6de08136015.png

要理解这个函数,先看下一般情况下content-type这个响应头长什么样子:

221afe0cbf12c453686738c1a4c40a62.png

但是这个网页的content-type是:

d215dee63deb66f4f36d69a313fc0155.png

这会解析到一个字符串text/html和一个空字典:

2ecd53f81bce4fc1dbc30995d6da1cce.png

OK,继续往下走,然后是一个是否设置了编码方式的判断:

9cf5862fb6e5b08287a8485055fec4db.png

当设置了编码方式,也就是正常的content-type,比如下面这个:

Content-Type: text/html; charset=utf-8

解析到的params字典就是有一个charset的key:

bf6087b210aa45f3fe5972db3d35d987.png

所以如果content-type中设置了charset是能够解析出来按照这个charset设置上编码方式的,但是很不幸,这个网站没有在content-type中设置charset参数,这个判断逻辑也没能进去,然后就剩下最后一个判断了:

380220178c85b9fb6558f01895a90b97.png

很不幸,进入了这个逻辑,也就是说如果content-type的mime类型设置的是text文本类型,则默认是ISO-8859-1编码的。我尝试为此默认策略找到证据支撑,我擦咋还真的找到了...

在rfc2616 HTTP/规范的3.7.1 Canonicalization and Text Defaults的最后一小节:

2127fcd6a4b382d31643e46251aa9c43.png

意思是说mime类型为text类型的子类型的默认编码方式为ISO-8859-1,如果不是的话需要自己使用charset指定,子类型是指text/html、text/css、text/javascript之类的这种。这样看来requests做得并没有问题,只是这个网站在自己不了解的情况下隐式声明了自己是ISO-8859-1编码类型但是实际上并不是,它自己指定错误了,只不过requests很实诚的你说你是你就是,而浏览器则可以识别出来并兼容,所以就成了两个效果。

但是呢,我陈二是这么轻易认怂的人吗,我一定要找到一个反驳它的证据,然后我继续查资料,先说明一下刚才那个HTTP 的规范rfc2616是1999年6月发布的:

cc85cbc5cbe2aba6ac612e231e891fde.png

一个rfc肯定会随着时间不断慢慢完善,或是增加删除某些东西,或是修改某些东西,这个ISO-8859-1的编码到了今天明显不是一个很合适的默认值了,我觉得后续应该会有文档对其进行修正的,然后我把上面那些Obsoleted by、Updated by捋了一下(不要误会,只是按照ISO-8859-1的关键词搜了一遍,对命中的小节看了一下),最终找到了我想要的,在rfc7231的Appendix B. Changes from RFC 2616下有一个小节的一句话提到了:

773d563b383f20b70b511ad8b27e96f7.png

我理解的意思是说,text mime类型的默认编码从ISO-8859-1移除,现在mime类型的默认编码是什么取决于它们的具体类型,但是这句话有点神神叨叨的,你好歹告诉我每种mime类型的具体默认编码我到哪里去看啊,这里有个关于这个问题讨论的帖子,但是也没有得出具体的结论:

没办法,继续找到The 'text/html' Media Type的rfc看看能不能找到答案:

在2. Registration of MIME media type text/html部分提到了:

5d20babf5f8d348cdc46c27aa40f0f0a.png

这段是说charset这个参数应该始终显示的指定出来,并且推荐优先使用utf形式,所以我们可以看到很多网站都是Content-Type: text/html; charset=utf-8这种形式的。然后就看到了让人兴奋的一句话:

See Section 6 below for a discussion of charset default rules.

马上跳到section 6看下默认的编码规则到底是啥:

5fc7d2ab875bd70005075dde96e5d0fb.png

呵呵,越看心越凉,说了个屁啊,这段话除去废话相当于啥都没说。

然后想到了也许该去requests的仓库看看issue:

搜到了两个issue,先看第一个:

fc3a67f7362809412949b00f46593bcf.png

嗯,有理有据令人信服,然后看看作者咋回的:

81b4954a4c40672be07c57022729cb9a.png

emmm,被怼了一顿,说这改动不能兼容之前的版本,而且你丫提问题之前应该先搜搜有没有人已经提过了,应该指的就是第二个了,看下另一个:

楼主提出问题:

f88c787597d4e0ed29177e16161dc394.png

然后...我靠这人是傻逼吗,人家都已经说规范已经明确不推荐这个值了,你还说如果规范改了我们会遵守,末了还嘲讽一句你觉得不合理你去参加制定规则的会议修改呀,狗头没用先打死再说...

9df4c4451bd065831be028b7d935e45a.png

然后...这哥们在说什么,我靠这家伙真的是作者吗...他说的和requests实际的行为根本不一致,实际上根本走不到chardet这一步,并且给出的解决方案看起来也怪怪的,不过他这是13年评论的,7年之前啥样我也不知道,暂且认为说得OK:

6d29b9ee991916c70cf648a3dbb3f714.png

在下面还有一个亮点:

33946a226413a55877e86f8561baa854.png

哈哈,本篇文章抓取的案例网站也是个日本网站 :)

然后这个讨论断断续续持续了几年,估计是提的人太多,终于在某个楼说已经有一个issue在追踪这个问题了:

看到这个issue还处于open状态,我松了一口气,他们终于肯认真处理问题并愿意读rfc了!

翻译这些东西没啥意思,读者可以自行阅读,只说几个点,红框里说的这个就是后面要介绍的编码检测方法,不过那个现在也要移出去了,毕竟过了很多年了...

2b860f2e4fc7c3cddd497bafe0ace77a.png

然后就是很长的讨论和追踪,已经失去了继续追寻下去的耐心,在这个问题上已经浪费了太多的时间,结束进入下一个话题。

requests提供了一个方法可以探测网页的编码方式,其返回结果是一个列表:

()

点进去看下它的实现:

06b5ce224caea11c9f7cf86512b51fba.png

其实就是从网页上抽取有没有设置编码方式,也就是说得到的编码在网页上就是存在的,我们看下对检测到的编码方式:

print(f"网页使用的编码方式为: {encoding}")  # 网页使用的编码方式为: ['Shift_JIS']

那么网页上一定是存在Shift_JIS这个字样的,我们回到网页上搜索一下:

94345c48e5f7d49258d94d7638562d9d.png

原来网页上是设置了编码方式的,那么手动解码指定正确的编码方式就可以了:

#!/usr/bin/env python3
# encoding: utf-8
"""
@author: CC11001100
"""
import requestsif __name__ == "__main__":url = ""response = (url)# 编码方式比较特殊,解码的时候需要额外处理下encoding = ()print(f"网页使用的编码方式为: {encoding}")  # 网页使用的编码方式为: ['Shift_JIS']print(("Shift_JIS"))

可以看到这个时候解码得到的就没问题了,虽然还是看不懂...

907329bf6c7b161e1498696f603ca16a.png

需要注意的是这个方法只是帮我们节省了一点搜索的工作量,应该在发现可能是编码问题之后辅助debug使用,而不是每次都对同一个网页这么判断一下,因为正则还是有一定的代价的。而且这个方法在之后就要被移除了,而且很高冷的只留了一个issue的id并没有粘贴链接啥的...

663959763ed71c4de42e4ae4c2235f71.png

我们去github的仓库看下这个issue:

给出的理由是requests是一个http库,而这个工具类中的有些方法更倾向于html处理,如我们刚才所见,这个编码方式的原理就是正则搜索html,所以他们决定把这些方法移动到第三方库request-toolbelt( )中。

fa3e4cb0b96ba8ef8f64963f141c7308.png

除此之外当怀疑是编码问题的时候还可以使用chardet来检测文本编码方式:

# chardet检测到的编码方式为: {'encoding': 'SHIFT_JIS', 'confidence': , 'language': 'Japanese'}
print(f"chardet检测到的编码方式为: {()}")

特别需要注意的是通常情况下同一个地址的网页编码方式多次请求是相同的,我们应该尽量一次推出编码方式,然后手动指定好编码方式,而不是每次都推测,因为推测编码方式是有代价的。

请注意爬虫文章具有时效性,本文写于2020-11-4日。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_712552.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建MOSS网站下的新闻

MOSS新闻中心的原理,跟普通的通知列表是不同的,MOSS新闻中每一条新闻即为一张页面,页面存储在站点的Pages文档库中。手工创建新闻 网站操作,下选创建页面 如下的界面如下:(点击图片查看清晰图)在输入框中输入相应的内容&#xff0…

PerfMap – 显示前端网站性能的热力图插件

PerfMap 是用来分析前端性能,基于资源定时 API 生成网页资源加载的前端性能热图。热图的颜色和第一个毫秒值指示在什么时候页面的图像加载完毕,这是用户体验的一个很好的指标。括号中的第二个值是浏览器加载特定图像的时间。 Github主页 插件下载 您…

Microsoft Azure WebSite创建网站

Microsoft Azure WebSite是Microsoft Azure中PaaS平台既服务到一个重要组件,WebSite具有以下特点,方便我们WEB部署和上线发布l 入门简单,开始简单,可以按照你的想法扩展,无任何的困难。l 编码容易,可以使用…

php手机网站支付宝_PHP实现支付宝手机网站支付功能

PHP实现支付宝手机网站支付功能的方法:首先开通支付宝商家中心里面的手机网站支付;然后进入开发者中心,获取到APPID;接着去文档中心下载“DEMO”;最后将“demo”配置到项目中即可。PHP实现支付宝手机网站支付功能1.开通…

php 系统找不到指定的路径.,PHP网站(windows2003服务器 IIS6)提示:系统找不到指定的路径。...

今天早上起来一看其它某php网站(下称:A站),直接就提示:“系统找不到指定的路径。”,其它的什么也没有。输入网站的各种网址都是这样。回想一下近期的操作,由于服务器的PHP版本太低,自己下载了下个phpStudy(…

想让自己的网站变得精致吗?那就进来看看吧:跟随鼠标的天使

跟随鼠标的天使 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible"…

Tomcat发布自己的一个web网站

Tomcat发布自己的一个web网站 将自己写的网站&#xff0c;放到服务器&#xff08;Tomcat&#xff09;中指定的web应用文件夹&#xff08;webapps&#xff09;下&#xff0c;即可以访问 850)]

配置网站之后500.19错误

HTTP错误 500.19 - Internet Server Error 无法访问请求的页面&#xff0c;因为该页的相关配置数据无效。IIS&#xff0c;出现这个错误怎么回事&#xff1f;-------------------------------------------------------------------------------- ------------------------------…

Java爬虫实战(一):抓取一个网站上的全部链接

前言&#xff1a;写这篇文章之前&#xff0c;主要是我看了几篇类似的爬虫写法&#xff0c;有的是用的队列来写&#xff0c;感觉不是很直观&#xff0c;还有的只有一个请求然后进行页面解析&#xff0c;根本就没有自动爬起来这也叫爬虫&#xff1f;因此我结合自己的思路写了一下…

你的网站首页完成最重要的使命了吗?

2019独角兽企业重金招聘Python工程师标准>>> 主页要承担的作用&#xff1a;最关键的问题&#xff1a;想象一个在高速路上经过的车主&#xff0c;一闪而过的时间里&#xff0c;如何让他明白前面这块广告牌在说什么&#xff1f;文末有我自己的答案。 背景&#xff1a;…

大型网站架构系列:电商网站架构案例(2)

转自&#xff1a;itfly8大型网站架构系列&#xff1a;电商网站架构案例(2) 电网网站架构案例系列的第二篇文章。主要讲解网站架构分析&#xff0c;网站架构优化&#xff0c;业务拆分&#xff0c;应用集群架构&#xff0c;多级缓存&#xff0c;分布式Session。 五、网站架构分析…

开发微信网页版登录(像segmentfault 网站那样登录)

2019独角兽企业重金招聘Python工程师标准>>> 一开始做的微信登录是这样的:点击微信登录,页面跳到扫面二维码那个页面,扫描并同意之后,回跳到自己给的redirect_url 那里. 很想做成 segmentfault 网站那样,感觉用户体更加好,如下图: 一直不知道该怎么去做..直到今天,…

网站开发流程以及HTML5简介(七)

2019独角兽企业重金招聘Python工程师标准>>> 第八大原因&#xff1a;Doctype 没错&#xff0c;就是doctype&#xff0c;没有更多内容了。是不是非常简答&#xff1f;不需要拷贝粘贴一堆无法理解的代码&#xff0c;也没有多余的head标签。最大的好消息在于&#xff0…

基于 Vue 的轻量级静态网站生成器 VuePress

Vue.js 的创始人尤雨溪大大在 twitter 上发布了一个全新的基于 Vue 的静态网站生成器-&#xff0c;这对于广大 Vue 爱好者来说无疑是一个好消息&#xff01; 什么是VuePress VuePress由两部分组成&#xff1a;一个基于Vue的轻量级静态网站生成器&#xff0c;以及为编写技术文…

网站功能小Demo——学习MD5加密的一点心得

生活在数字信息化时代&#xff0c;我们每天接触最多的就是网络&#xff0c;其中包括我们在各大形形色色的网站注册的账户。从而网络安全变得极其重要&#xff0c;毕竟涉及到自身的账户信息安全以及财产安全。那么网站在建设的过程中时如何做到保护信息安全的呢&#xff1f;下面…

百度网页搜索无法通过域名访问_网站换域名或网页内容改版对网站的影响以及网站换域名注意事项...

一个网站如果换域名等于是重头开始做一个网站&#xff0c;之前的收录和排名都是全部为零&#xff0c;风险是非常大的。因此有想过换域名的站长需要谨慎&#xff0c;那么换域名对网站带来什么影响呢&#xff0c;给大家简单讲述几点。网站换域名或网页内容改版对网站有什么影响&a…

大型网站架构演进(4)使用应用服务器集群

使用应用服务器集群是解决高并发的常用手段&#xff0c;当一台应用服务器的处理能力不足时&#xff0c;不要企图更换配置更高的服务器&#xff0c;对于大型网站而言&#xff0c;不管多么强大的服务器&#xff0c;都满足不了持续增长的业务需求&#xff0c;在这种情况下&#xf…

常用下载工具的网站

1、MSDN 网站https://msdn.itellyou.cn/&#xff0c; 2、盒子部落 https://www.hezibuluo.com/system/install 参考链接 &#xff1a; office 2016最新安装及KMS使用教程【亲测有效】&#xff01;&#xff01;&#xff01; &#xff1a;https://blog.csdn.net/qq_41785863/…

网站流量查询

1、http://www.alexa.cn/ 2&#xff09;TestinAPP测试&#xff1a;https://www.testin.cn/ 3&#xff09;APP Annie&#xff1a;https://www.appannie.com/cn/ 脑图工具 1&#xff09;百度脑图&#xff1a;http://naotu.baidu.com/ 2&#xff09;MindPin&#xff1a;http:/…

web网站服务(二)-1

博主QQ&#xff1a;819594300博客地址&#xff1a;http://zpf666.blog.51cto.com/有什么疑问的朋友可以联系博主&#xff0c;博主会帮你们解答&#xff0c;谢谢支持&#xff01;案例一&#xff1a;搭建基于域名的虚拟主机首先为两个网站搭建dns服务器&#xff0c;并新建区域&am…