两天有个客户需要把网页转为pdf,之前也没开发过类似的工具,就在百度搜索了一波,主要有下面三种
在百度(我一般用必应)搜索“在线网页转pdf”就有很多可以做这个事的网站,免费的如
各种pdf的操作都有,免费使用,速度一般。
官网地址https://tools.pdf24.org/zh
PDF24 Tools
开源免费项目,使用golang写的,提供在线转
官网地址http://doctron.lampnick.com/
doctron在线体验demo
还有挺多其他的,可以自己搜索,但是都不符合我的预期。
Doctron,这是我今天要介绍的重头戏。
Doctron是基于Docker、无状态、简单、快速、高质量的文档转换服务。目前支持将html转为pdf、图片(使用chrome(Chromium)浏览器内核,保证转换质量)。支持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等),然后实时显示。被镜像的网站有任何更新,镜像网站是实时同步的。
网上有卖用于镜像网站的小偷程序的。小偷程序通常也可以用来做采集。为了不给他们做宣传,就不提名字了。从他们的官网摘取几条程序功能,有助于理解后面的内容:
从SEO角度看,权重不高的小站、新站,被镜像意味着有其它网站和你的网站内容基本一样,搜索引擎有可能认为你的网站不是原版,镜像网站才是,所以把排名、流量给了镜像网站。
对有一定历史、权重的网站,镜像网站取代原版网站的可能性微乎其微。但从心情角度考虑,被别人镜像,内容被别人偷走,即使没有其它明显后果,也还是挺烦人的一件事。
另一个烦人的事是,镜像网站一般来说并不是要和你提供同样的产品或服务,而是把用户转到赌博、色情等服务上去。有的是通过JS把赌博、色情内容显示给用户,有的直接把用户转向到另外的网站上去。
有时候注意到被镜像了是因为自己网站排名下降,怀疑有人负面SEO。有时候是搜索品牌名称,看到镜像网站。已经知道自己被镜像了好办,直接看下面怎么处理部分。
一是百度统计后台:
受访域名部分列出了使用相同百度统计代码的域名。其中出现快照、百度/谷歌翻译等是正常的,但出现一些奇奇怪怪的域名就要查看一下了,比如上图里的第5、7、8个,访问一下就知道都是镜像SEO每天一帖,引诱用户赌博的网站,然后站长把SEO每天一帖的统计代码也照抄过去了。
看看上面列出的小偷出现功能就知道,其实统计代码很容易替换或删除的。所以在受访域名只能看到一小部分镜像网站。
第二是搜索网站的特征句子。最容易想到的是网站品牌名称、首页标题等,确实可以发现一些镜像网站。但如前所述,品牌名绝大多数是会被替换的,所以我更喜欢搜索一些页面上的特征句子,比如本博客最上面的副标题:Zac的SEO博客,坚持12年,优化成为生活。搜索一下就会看到:
把对方主机IP先屏蔽了。不过镜像网站来实时抓取用的IP大部分情况下不是域名主机IP,可能是CDN,可能是伪造IP,也可能是多IP的服务器。要发现必须屏蔽的IP,需要查看网站原始日志。我的一个小窍门是,访问镜像网站上一个很少人会访问的页面,比如翻页第70页,然后马上查看日志,这个页面被访问的IP就是应该屏蔽的IP,等等。
*请认真填写需求信息,我们会在24小时内与您取得联系。