整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

网页转pdf,这个工具真好用

两天有个客户需要把网页转为pdf,之前也没开发过类似的工具,就在百度搜索了一波,主要有下面三种

  1. 在线转pdf
  2. 使用浏览器打印功能转pdf
  3. 使用本地软件工具转pdf

在线转pdf

在百度(我一般用必应)搜索“在线网页转pdf”就有很多可以做这个事的网站,免费的如

  • PDF24Tools

各种pdf的操作都有,免费使用,速度一般。

官网地址https://tools.pdf24.org/zh

PDF24 Tools

  • doctron

开源免费项目,使用golang写的,提供在线转

官网地址http://doctron.lampnick.com/

doctron在线体验demo

还有挺多其他的,可以自己搜索,但是都不符合我的预期。

使用浏览器打印功能转pdf

  1. 在浏览器右键,点击打印或者ctrl+p
  2. 在弹出的打印对话框中找到目标打印机选择“另存为PDF”
  3. 点击“保存”按钮即可下载pdf了

使用本地软件工具转pdf

Doctron,这是我今天要介绍的重头戏。

Doctron是基于Docker、无状态、简单、快速、高质量的文档转换服务。目前支持将html转为pdf、图片(使用chrome(Chromium)浏览器内核,保证转换质量)。支持PDF添加水印。

  • 使用chrome内核保证高质量将HTML转为pdf/图片。
  • 简易部署(提供docker镜像,Dockerfile以及k8s yaml配置文件)。支持丰富的转换参数。转为pdf和图片支持自定义大小。
  • 无状态服务支持。

管他的,先把代码下载下来再说

git clone https://gitcode.net/mirrors/lampnick/doctron.git

仓库

运行

go build
./doctron --config conf/default.yaml

运行截图

转pdf,访问http://127.0.0.1:8080/convert/html2pdf?u=doctron&p=lampnick&url=<url>,更换链接中的url为你需要转换的url即可。

转换效果

然后就可以写程序去批量转换需要的网页了,但是我需要转换的网页有两个需求

1、网站需要会员登录,不然只能看得到一部分

2、需要把网站的头和尾去掉的

这就为难我了,不会go语言啊,硬着头皮搞了,肯定有个地方打开这个url的,就去代码慢慢找,慢慢调试,功夫不负有心人,终于找到调用的地方了。

第一步:添加网站用户登录cookie

添加cookie之前

添加cookie之后

第二步:去掉网站头尾

chromedp.Evaluate(`$('.header').css("display" , "none");
		$('.btn-group').css("display" , "none");
		$('.container .container:first').css("display" , "none");
		$('.breadcrumb').css("display" , "none");
		$('.footer').css("display" , "none")`, &ins.buf),

打开网页后执行js代码把头尾隐藏掉

第三步:程序化,批量自动生成pdf

public static void createPDF(String folder , String cl ,  String pdfFile, String urlhref) {
        try {
            String fileName = pdfFile.replace("/", ":");
            String filePath = folder + fileName;
            File srcFile = new File(filePath);
            File newFolder = new File("/Volumes/disk2/myproject" + File.separator + cl);
            File destFile = new File(newFolder, fileName);
            if(destFile.exists()){
                return;
            }
            if(srcFile.exists()){
                //移动到对应目录
                if(!newFolder.exists()){
                    newFolder.mkdirs();
                }
                FileUtils.moveFile(srcFile , destFile);
                return;
            }
            if(!newFolder.exists()){
                newFolder.mkdirs();
            }
            String url = "http://127.0.0.1:8888/convert/html2pdf?u=doctron&p=lampnick&url="+urlhref;
            HttpEntity<String> entity = new HttpEntity<String>(null, null);
            RestTemplate restTemplate = new RestTemplate();
            ResponseEntity<byte[]> bytes = restTemplate.exchange(url, HttpMethod.GET, entity, byte[].class);
            if (bytes.getBody().length <= 100) {
                if(urlList.containsKey(urlhref)){
                    Integer failCount = urlList.get(urlhref);
                    if(failCount > 3){
                        System.out.println("下载失败:" + cl + " / " + pdfFile +"  " + urlhref);
                        return;
                    }
                    failCount++;
                    urlList.put(urlhref , failCount);
                }else{
                    urlList.put(urlhref , 1);
                }

                createPDF(folder , cl ,  pdfFile , urlhref);
            }else{
                if (!destFile.exists()) {
                    try {
                        destFile.createNewFile();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                try (FileOutputStream out = new FileOutputStream(destFile);) {
                    out.write(bytes.getBody(), 0, bytes.getBody().length);
                    out.flush();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

最终成果:


文件夹分类存放

pdf文件

融界2024年1月6日消息,据国家知识产权局公告,杭州安恒信息技术股份有限公司申请一项名为“一种镜像网站制作方法、装置、设备及存储介质“,公开号CN117349567A,申请日期为2023年11月。

专利摘要显示,本发明公开一种镜像网站制作方法、装置、设备及存储介质,应用于网站镜像领域,从目标网站中获取动态网页和/或伪静态网页在不同请求参数下的动态网页内容和/或伪静态网页内容;将动态网页内容和/或伪静态网页内容以HTML格式存储得到动态资源文件和/或伪静态资源文件;基于资源文件路径、资源文件名及请求参数对动态资源文件和/或伪静态资源文件进行唯一性命名;基于动态资源文件和/或伪静态资源文件构建目标网站的镜像网站。将在不同请求参数下的动态网页内容和/或伪静态网页内容以HTML格式进行存储,基于唯一性命名后的动态资源文件和/或伪静态资源文件构建镜像网站,实现了制作包含伪静态网页和动态网页的网站的镜像网站。

本文源自金融界

像网站指的是和你的网站基本一样、并且实时同步的其它网站。就像照镜子一样,所以名为镜像。

有的镜像网站是没有恶意的,很可能是你自己设置的,为了方便用户能从多个域名访问网站,被封了一个,还有其它的域名。比如著名的草榴社区,好像就有很多镜像可以访问。

有的镜像,也就是这里讨论的镜像,是不怀好意的,通常是别人设置的,要么为了负面SEO你的网站,要么为了利用你的内容获得排名,然后把用户转向到敏感、非法内容网站上去。

网上有的文章把采集和镜像混在一起。虽然表现形式差不多,但严格来说,采集和镜像实现方法、表现形式是有区别的。

采集的网站一般是提前抓取别人网站的内容,放入自己数据库,再用程序调用到页面上。被采集网站有新内容时,采集网站并不能实时同步更新,要再采集之后才能出现。一旦被采集,内容已经在对方数据库里了,从技术上是无法阻止采集网站显示这些内容的。这篇帖子说的不是这种。

镜像网站并不事先抓取内容,而是有人访问网站时,实时从被镜像的网站调取内容,做些处理(替换URL、文字,加文字、加JS等),然后实时显示。被镜像的网站有任何更新,镜像网站是实时同步的。

网上有卖用于镜像网站的小偷程序的。小偷程序通常也可以用来做采集。为了不给他们做宣传,就不提名字了。从他们的官网摘取几条程序功能,有助于理解后面的内容:

  • 全自动分析,内外链接自动转换、图片地址、css、js,自动分析CSS内的图片
  • 内置强大替换和过滤功能,标签过滤、站内外过滤、字符串替换、等等
  • 伪原创,近义词替换有利于seo
  • 增加URL路由,实现全站URL变换,个性化本站URL地址
  • 超级模板增加移动模板、自定义栏目功能
  • 增加自动获取301、302重定向的采集,解决跳WWW,跳https采集
  • 代理IP、伪造IP、随机IP、伪造user-agent、伪造referer来路、自定义cookie,以便应对防采集措施

从SEO角度看,权重不高的小站、新站,被镜像意味着有其它网站和你的网站内容基本一样,搜索引擎有可能认为你的网站不是原版,镜像网站才是,所以把排名、流量给了镜像网站。

对有一定历史、权重的网站,镜像网站取代原版网站的可能性微乎其微。但从心情角度考虑,被别人镜像,内容被别人偷走,即使没有其它明显后果,也还是挺烦人的一件事。

另一个烦人的事是,镜像网站一般来说并不是要和你提供同样的产品或服务,而是把用户转到赌博、色情等服务上去。有的是通过JS把赌博、色情内容显示给用户,有的直接把用户转向到另外的网站上去。

有时候注意到被镜像了是因为自己网站排名下降,怀疑有人负面SEO。有时候是搜索品牌名称,看到镜像网站。已经知道自己被镜像了好办,直接看下面怎么处理部分。

一是百度统计后台:

受访域名部分列出了使用相同百度统计代码的域名。其中出现快照、百度/谷歌翻译等是正常的,但出现一些奇奇怪怪的域名就要查看一下了,比如上图里的第5、7、8个,访问一下就知道都是镜像SEO每天一帖,引诱用户赌博的网站,然后站长把SEO每天一帖的统计代码也照抄过去了。

看看上面列出的小偷出现功能就知道,其实统计代码很容易替换或删除的。所以在受访域名只能看到一小部分镜像网站。

第二是搜索网站的特征句子。最容易想到的是网站品牌名称、首页标题等,确实可以发现一些镜像网站。但如前所述,品牌名绝大多数是会被替换的,所以我更喜欢搜索一些页面上的特征句子,比如本博客最上面的副标题:Zac的SEO博客,坚持12年,优化成为生活。搜索一下就会看到:

把对方主机IP先屏蔽了。不过镜像网站来实时抓取用的IP大部分情况下不是域名主机IP,可能是CDN,可能是伪造IP,也可能是多IP的服务器。要发现必须屏蔽的IP,需要查看网站原始日志。我的一个小窍门是,访问镜像网站上一个很少人会访问的页面,比如翻页第70页,然后马上查看日志,这个页面被访问的IP就是应该屏蔽的IP,等等。