网页版微信公众号的文章url是临时链接,如果你想过段时间再查看该篇文章就会发现链接过期,因此在爬取到文章后非常有必要把网页保存下来。
保存网页的时候,我们希望把图片、js、css等文件同时保存,使得html文件打开后与原网页一模一样。
但是我在保存微信公众号文章的时候发现,即使我已经成功下载了图片,但图片总是无法加载。仔细研究之后我发现是一个参数导致的:
crossorigin="anonymous
注解crossorigin:出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。跨源资源共享(CORS)是由大多数浏览器实现的W3C规范,允许您灵活地指定什么样的跨域请求被授权,而不是使用一些不太安全和不太强大的策略,如IFRAME或JSONP。
以下为我随意找的一篇文章的img部分代码:
<img class="rich_pages" data-backh="290" data-backw="574" data-before-oversubscription-url="https://mmbiz.qlogo.cn/mmbiz_jpg/kuIKKC9tNkAO48fO1QHbYko66soMEOqadkTgicK7pxNcfoTM2Jv3KVcZR8FoJicfiaHN4HGRkDRUqCfa9w0AygrAA/0?wx_fmt=jpeg" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_png/kuIKKC9tNkAO48fO1QHbYko66soMEOqaWutib4aKEVIE6E6JWb6mvKEVuxxKoPLApXK8A6tscLPpMRuSxfYwWUg/0?wx_fmt=png" data-cropx1="0" data-cropx2="1211" data-cropy1="0" data-cropy2="609.719512195122" data-ratio="0.5045417010734929" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/kuIKKC9tNkAO48fO1QHbYko66soMEOqadkTgicK7pxNcfoTM2Jv3KVcZR8FoJicfiaHN4HGRkDRUqCfa9w0AygrAA/640?wx_fmt=jpeg" data-type="jpeg" data-w="1211" style="width: 100%;height: auto;" crossorigin="anonymous" />
值得注意的是,如果使用了crossorigin这个参数,必须跨域才可以成功加载,而微信文章的domain是mp.weixin.com,img的src是mmbiz,因此可以成功加载图片。如果保存图片在本地,那么就不构成跨域,自然无法加载图片。因此,只需删除这个属性,就可以让你的html加载保存好的图片啦!我使用的beautifulsoup对html网页进行解析的,删除属性只需要简单的一句:
soup = BeautifulSoup(html_cont, 'html.parser')
title = soup.title.string
del soup.img["crossorigin"]
OK,这么一来网页就可以成功保存啦!