网站复制之链接与图片文件的下载地址是什么?
优采云 发布时间: 2021-03-28 18:13网站复制之链接与图片文件的下载地址是什么?
在前面说话
由于行业中某些不可抗力因素,我们必须做一些麻烦的事情来备份数据。为了尽可能多地保留该知识,有此文章和最终脚本。 (文章和脚本非常粗糙,希望高手不要介意。)
关于网站副本:
网站复制,也称为网站备份。它是通过该工具保存网页上的所有内容。当然,不仅可以保存html页面,还可以保存网页源代码中收录的所有css,js和静态文件,以便您可以在本地浏览整个网站。 Internet上有一些类似的工具,但是并不理想。因此,我计划编写一个Python脚本,以方便网站的个人备份,并也方便采集一些网络数据。
处理并保存单个页面网站复制需要保存的内容
在开始编写代码之前,我们需要确定要保存的内容,以便稍后可以编写脚本来对其进行处理。
目前分为两部分:
网页源代码(单页的html源代码)css,js和图像文件(静态文件)
css,js和图像文件的下载地址是从网页的源代码中获得的,如图所示:
内容似乎并不多,只需从网页源代码中提取静态文件的下载地址,然后下载并保存即可。但是实际情况会更麻烦,为什么?
下图是保存静态文件的过程。在下载并保存文件之前,需要处理相对地址以获得文件的下载地址以及将其保存到本地的路径。另外,必须替换HTML源代码中的原创相对地址,以便可以在本地正常使用和显示文件内容。这也是保存网页的相对复杂的部分。获取链接后,让我们看一下如何处理这种情况。
网站提取复制的链接
通过页面链接,您可以通过此链接获取HTML源代码,并获取各种文件的相对地址。与路径处理相比,这里的方法更简单,更直接。使用beautifulsoup直接获取标签,然后获取链接。该过程如图所示:
通过构造一个ExtractLinks()函数来获取网页中相同类型的所有标签的相同参数。您可以保存一些重复的语句,并获取css,js,img,标签的网址。
此处的过滤内容如下:
重复数据删除并丢弃无效的URL地址,例如:#,javascript伪协议等。
获取链接后,您需要处理路径。
网站复制路径的处理
在网页的源代码中有很多相对地址形式的情况。
需要正常处理几种形式的相对地址?以图片文件为例,简要概述如下:
页面地址的源代码中的地址下载地址
1
没有
没有
2
#
没有
3
test / a.jpg
4
./ test / a.jpg
5
../ a.jpg
6
//// a.jpg
7
8
/ test?id = 1
9
/./ a.jpg
10
data:image / png; base64,...
data:image / png; base64,...
(除了某种形式之外,还有许多情况我们无法预测。对于那些不确定的地址,它们将被直接丢弃。)
从相对地址的类型还可以看出,编写要处理的代码时有很多不同的情况,并且每种情况基本上都需要分别处理,并且其中的逻辑有些特殊。
在这里我们创建一个ProcessResourcePath函数来处理文件相对地址之间的关系
处理链接时需要输入参数:
页面地址:用于获取源代码中的文件地址,并根据url的层次关系确定保存图片的路径。图片地址:根据页面地址和图片地址确定图片的下载地址
返回的参数:
页面地址,图片地址,图片的下载地址,图片地址的保存路径以及图片地址的类型(方便调试)
函数处理的过程如图所示:
功能说明:
不解释URL层次关系的处理,这比较麻烦。如果您对单个过程感兴趣,可以直接与我联系。
通过此功能处理后,保存网页变得非常方便。因为您只需要提取css,js,图片和其他文件的链接进行处理,然后替换处理后的地址即可。
网站处理和保存复制的单页
在保存单个页面之前,您需要先考虑一下。最终文件将保存在常规文件夹中,并且该文件夹的名称必须事先确定。在这里,我想将网站保存在以域名命名的文件夹中。例如,的所有页面和资源都保存在www_bilibili_com文件夹中。因此,保存单个页面所需的参数是页面的地址,然后通过页面的地址获取域名以定义保存的文件夹。
保存时,您需要替换页面html源代码中的地址。
文件和页面直接保存,页面如何调用本地js并正常显示本地图片?我们需要做的是替换页面中的所有文件地址。
与以前的URL处理功能配合,通过ProcessResourcePath处理页面地址和文件地址,以获得适应的本地地址,然后替换它。
不仅需要很好地处理css,js和图像文件的相对位置,而且还需要在单个页面中处理各个链接。这样,您可以在本地正常切换每个页面。
由于服务器上的页面是动态生成的,因此在保存页面后,我们应该将其修改为以.html结尾的文件,因此存在以下几种情况:
以.html =>结尾直接保存为原创文件名,以.php等结尾。不合适.html
当保存单个页面时,此过程执行一次,并且当替换链接地址以确保每个页面的地址之间的正常交互时,标记中的地址也将执行一次。 (链接的处理仅限于相同的子域名)
已保存文件的摘要
要保存和处理网页,必须确保可以正常调用和显示css,js和图像文件。链接可以与多个页面进行交互。
获取网站的所有页面的链接获取网站的所有页面的链接
通过前面的内容,您已经可以获取单个页面的所有内容,并且可以更好地处理内部的链接关系。如何获得整个网站的所有页面?
这是非常简单和粗鲁的,只需遍历所有链接! (我没想到其他好的方法)
遍历网页网址的流程图:
以这种方式获取网站的所有URL,然后分批保存单个页面。
加快获取链接和保存文件的速度
为了加快获取网站所有页面的链接并保存每个页面的文件,我们需要使用多线程和协程来提高执行效率。
我使用我编写的简单协程框架:
用于协程初步经验的简单利用框架
该框架的流程如下图所示:
该框架的编写相对简单,如果您对其进行修改,则可以直接使用它来复制网站脚本。具体内容可以在文章中阅读。
通过协程,可以显着提高获得网站所有页面并保存单个页面的速度。
Github项目摘要
文章各个部分的代码实现均在python脚本中,github仓库地址如下:
SiteCopy:
复制一页:
python sitecopy.py -u“”
复制整个网站(-t设置线程):
python sitecopy.py -u“” -e -t 30