一步步教你打造微信公众号文章爬虫(2)-下载网页
书接上文,今天一起来学习把网页版文章下载到本地电脑上。
前面讲过,请求网页的流程是浏览器先向服务器请求html,服务器返回html,浏览器分析这个html,发现html中还需要一堆的js,css,图片,然后浏览器再去下载这些文件,最终组装成一个完整的html页面。
所以,第一步,要把这个html下载下来。
是时候请出大家期待已久的python了,我在讲解的过程中只列出核心代码,完整代码会列在文章最后,所以强烈建议先把整篇文章看完了再动手自己敲代码。其他文章也是相同的逻辑,以后不再重复。
需要用到一个鼎鼎大名的第三方库 requests ,用它来模拟浏览器给微信服务器发送请求和接收请求。
那么发送的请求中都要包含什么内容呢?
上文介绍chrome开发者工具时提过这个问题,奥秘在Headers这个标签中,见下图,理论上来讲chrome浏览器发送了什么我们的最好就原样照着用python发送什么,即把下图所示的General 和 Request Headers 块中的参数全都发送出去。但多数时候并不需要这样,特别是对于get请求,一般只需要少数几个参数即可,但是请注意User-Agent这一项一定要改得跟chrome一样。其他细节不再多述,过后您操作的多了自然会明白。
简单的注释会直接在代码中列出,复杂的会在代码后面用文字再解释,另外本文是一份原稿发布在多个平台,可能有的平台显示代码会有缩进错乱的问题,当你发现运行代码出错时请秉持“尽信书不如无书”的批判态度。
运行上面代码之前,请先手动在C盘下新建vWeChatFiles文件夹,本项目之后下载的所有文件都放在此目录下,请注意这里是保存下载的网页文件的,而你的python源代码可以放在其他目录下。
运行上面的代码,你将看到屏幕刷刷得显示一堆网页源代码,并且在c:/vWeChatFiles文件夹下生成一个test.html文件。
下面,来看这个下载下来的test.html能否正常工作,请先打开chrome,按F12,弹出开发者工具,在最上面一行标签中切换到 Network,然后在chrome 的网页中输入C:/vWeChatFiles/test.html,回车。可能需要等几十秒,看到了刚才我们下载的网页。
同时chrome开发者工具显示如下图所示
注意第21行,有的图片会以 //http://res.wx.qq.com开头,需要换成常见的http://res.wx.qq.com 形式开头,否则本地打开网页时这些图片会无法正常加载。至于为什么会有 // 开头的网址您可以自行百度。
C:\vWeChatFiles文件夹下会有一个test2.html文件,在chrome中打开,网页可以正常显示了,但是开发者工具中依然显示有许多请求是红字状态,先不用管。
接下来的问题是,虽然图片可以在网页中显示了,但src是一个网址,图片是在每次打开网页时从远程服务器下载的,并没有保存到本地,如果远程文章被删了图片就没法看了。
接下来我们要做的是:把图片下载到本地,并在html中把图片的src指向本地图片的位置。
主要代码如下,需要先在vWeChatFiles目录下新建一个images文件夹
至此,网页保存到本地基本完成,其实还有几个小问题,比如: