兩天有個客戶需要把網頁轉為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小時內與您取得聯系。