博客园文章转PDF之非多线程方式

问题:

现在博客园写的文章想要在自己本地存一份,一个一个复制有点麻烦,希望能够程序化解决这个问题

思路:

博客园园第二页会出现页码,可以通过请求第二页,获得页面信息,然后把总页码获取到

每个页面的地址一样除了页码的地方不一样,因此,循环总页码,就可以得到每一个文章列表页的内容

得到了文章列表页的内容,可以把每个文章列表的文章链接获取到,且放在list中

循环文章链接,访问文章页面,获取文章标题和内容,并加上head,得到文章HTML且排除了左边栏及上下底部

把生成的HTML且排除了非文章内容的文件生成PDF

代码如下:

# coding=utf-8
import  requests
import pdfkit #PDF模块
import re
import os
from bs4 import BeautifulSoup #html解析

#定义头部
header=‘‘‘<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="referrer" content="origin">

    <meta http-equiv="Cache-Control" content="no-transform">
    <meta http-equiv="Cache-Control" content="no-siteapp">
    <title>小戳同学 - 博客园</title>

    <link rel="stylesheet" href="https://www.cnblogs.com/css/blog-common.min.css?v=sqi5FxOybx6gjGoG6Zfy1wD-0AwznLNLYOVx7Y9tIN0">
    <link id="MainCss" rel="stylesheet" href="https://www.cnblogs.com/skins/coffee/bundle-coffee.min.css?v=pdMIVgsH8kXt-vOWnlL0N20TlHt3UyP9HzGgocfsP4s">

    <link id="mobile-style" media="only screen and (max-width: 767px)" type="text/css" rel="stylesheet" href="https://www.cnblogs.com/skins/coffee/bundle-coffee-mobile.min.css?v=MGucLWekW6t3A88Ks-YfEzrx4X_hEIpMacbOAC9lJUs">

    <link type="application/rss+xml" rel="alternate" href="https://www.cnblogs.com/xiaokuangnvhai/rss">
    <link type="application/rsd+xml" rel="EditURI" href="https://www.cnblogs.com/xiaokuangnvhai/rsd.xml">
    <link type="application/wlwmanifest+xml" rel="wlwmanifest" href="https://www.cnblogs.com/xiaokuangnvhai/wlwmanifest.xml">
    <script async="" src="https://www.google-analytics.com/analytics.js"></script><script src="https://common.cnblogs.com/scripts/jquery-2.2.0.min.js"></script>
    <script src="https://www.cnblogs.com/js/blog-common.min.js?v=ruOFvx8_pDlyiWjHGHyOXclVmNo396_IKB8YFZjMllo"></script>
    <script>
        var currentBlogId = 516754;
        var currentBlogApp = ‘xiaokuangnvhai‘;
        var cb_enable_mathjax = false;
        var isLogined = true;
    </script>
</head>‘‘‘

#获取博客一共多少页码
def page_num():
    page_url="https://www.cnblogs.com/xiaokuangnvhai/default.html?page=2"
    page_request=requests.request("get",page_url)
    page_list=re.findall(‘共(.*?)页‘,page_request.text)  #正则提取页面上的总页码
    return  int(page_list[0].strip())  #返回总页码

#文章链接获取
def page_url_list(pagenum):
    page_url_list=[]
    for num in range(1,pagenum+1): #遍历每个文章列表页面,获取每个文章列表的文章URL
        page_url= ‘https://www.cnblogs.com/xiaokuangnvhai/default.html?page=%d‘ % num
        page_request=requests.request("GET",page_url)
        page_list=re.findall(‘<a class="postTitle2" href="(.*?)">‘,page_request.text) #正则获取文章列表页面的所有文章链接
        page_url_list.extend(page_list) #叠加文章链接list
    return page_url_list #返回总的文章链接list

#文章HTML文件生成
def file_page(page_url_list):
    for url in page_url_list:
        new_html=requests.request("GET",url,) #遍历获取文章页面HTML

        try:
            soup=BeautifulSoup(new_html.text,"html.parser",from_encoding="utf-8") #声明文章对象
            link_node2=soup.find("h1",class_=‘postTitle‘) #获取文章标题的HTML代码
            link_node=soup.find(‘div‘,class_=‘postBody‘) #获取文章主体的HTML代码

            #打开文章文件
            file=open("./page_html/%s.html"%soup.find(‘a‘, class_=‘postTitle2‘).text,‘w+‘,encoding="utf-8")
            file.write(header) #写文章头部
            file.write("<h1 class=‘postTitle‘>"+str(link_node2.contents[1])+"</h1") #写文章标题
            file.write("<div class=‘postBody‘>"+str(link_node.contents[1])+"</div>") #写文章主体
            file.close() #写完毕后,文件关闭

        except Exception as e:
            print("问题链接:%s"%url) #如果有带密码等异常的文章,输出连接

#生成PDF
def pdf_html(path):

    pagelist=os.listdir(path)  #获取文件名称list
    for filename in pagelist: #遍历文件
        file="./page_html/%s"%filename #HTML文件路径拼接
        confg = pdfkit.configuration(wkhtmltopdf=r‘C:\zwj\besttest\wkhtmltox\bin\wkhtmltopdf.exe‘) #声明wkhtmltopdf地址
        pdfkit.from_file(file, ‘./blog_pdf/%s.pdf‘%filename, configuration=confg) #HTML文件转换为PDF

#调取函数
file_page(page_url_list(page_num()))
pdf_html("./page_html")

原文地址:https://www.cnblogs.com/xiaokuangnvhai/p/11737400.html

时间: 2024-10-03 13:39:05

博客园文章转PDF之非多线程方式的相关文章

简单爬虫-抓取博客园文章列表

原文:简单爬虫-抓取博客园文章列表 如果使用对方网站数据,而又没有响应的接口,或者使用接口不够灵活的情况下,使用爬虫在合适不过了.爬虫有几种,对方网站展示形式有几种都是用分析,每个网站展示有相似的地方,有不同的地方. 大部分使用httpRequst就能完成,不管是否添加了口令.随即码.请求参数.提交方式get或者post.地址来源.多次响应等等.但是有些网站使用ajax如果是返回json或固定格式的也好处理,如果是很复杂的,可以使用webbrower控件进行抓取,最后正则解析,获取所需要的数据即

Python抓拍博客园文章,并存入数据库

在学习python后,想做个爬虫,抓取博客园文章. 爬虫思路很简单,模拟浏览器访问网页,得到网页的html代码,再根据页面结构,从html中提取自己需要的内容. 本文代码主要分为3个部分: 1.读取博客园首页文章链接. https://www.cnblogs.com/是博客园的首页,列出了文章,分析页面内容,读取文章的链接. 这需要看页面的结构,可以使用浏览器,再浏览页面代码,选择元素,看界面上选中哪一部分,根据自己的需要,可以看到对应模块的代码. 2.对于每个页面,分析页面内容. 这需要看页面

利用GitHook实现博客园文章的备份和自动发布

在使用vscode中的writecnblog插件时有所启发,链接: 用vscode写博客和发布,大家可以看看. 我们在本地可以利用git轻松实现博客园文章的历史记录管理,利用博客园的MetaWeblog API 别人的介绍编写小程序来自动化上传文章(参考插件). 更进一步,将这个程序放到githook里,每次commit时自动执行,就实现了现博客园文章的备份和自动发布. 这样,你每次发布文章的步骤就简化为: 编写本地一个Git仓库内的xx.md文件 commit更改 程序会自动获取diff,然后

利用GitHook实现博客园文章的备份和自动发布.md

在使用vscode中的writecnblog插件时有所启发,链接: [用vscode写博客和发布](https://www.cnblogs.com/caipeiyu/p/5475761.html),大家可以看看. 我们在本地可以利用git轻松实现博客园文章的历史记录管理,利用博客园的MetaWeblog API [别人的介绍](https://www.cnblogs.com/caipeiyu/p/5354341.html)编写小程序来自动化上传文章(参考插件). 更进一步,将这个程序放到gith

实用scrapy批量下载自己的博客园文章

首先,在items.py中定义几个字段用来保存网页数据(网址,标题,网页源码) 如下所示: import scrapy class MycnblogsItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() page_title = scrapy.Field() page_url = scrapy.Field() page_html = scrapy.Field() 最重要的是我

博客园文章添加版权信息的方法

管理--操作--博客签名,进入到制作签名的页面.在"内容"的文本框输入如下信息并替换相应的文字: <div>作者:<a href="http://www.cnblogs.com/lamp01/" target="_blank">郁冬</a></div><div>出处:<a href="http://www.cnblogs.com/lamp01/" target=

对博客园文章审核规则的质疑

几次发文章都被移出首页,让我很是郁闷. http://www.cnblogs.com/zhupengfei/p/8983666.html http://www.cnblogs.com/zhupengfei/p/8934072.html 移出的原因都是因为图片太多,文字太少. 我就很郁闷了,实例讲解,不用图片用什么?文字能有图片描述的清楚吗? 同样的文章在CSDN就没有任何问题,几分钟后就可以审核通过. 目前还有一个问题就是我在博客园发的文章无法被百度收录到,而在CSDN的却可以. 是否考虑转到C

JS批量删除博客园文章

$('tr').each(function(){ if($(this).attr('id')!=null){ var s = $(this).attr('id').slice(9); console.info("正在删除:"+s); deletePost(s); } }); window.location.reload(); 以前都是用新浪博客的,但是新浪博客对编程类文章支持不好,记录一些html代码总是隐藏. 第一次用博客园,被他简洁的界面吸引. 一看还有博客搬家功能,于是把新浪博客

你博客园文章中的图片可以放大吗?反正我的是可以放大了!

序 看看项目经理是如何实现的? 插件选择 试了几个插件,感觉还是 lightbox 插件好用,链接:https://github.com/lokesh/lightbox2,该插件具备如下几个特点: 点击图片后根据图片实际尺寸自动显示 图片有加载动画特效,有前.后.关闭按钮 想看详细介绍,可以查看:https://www.lokeshdhakar.com/projects/lightbox2/ 具体实现 通过上面的链接下载好后需要如下几个文件:lightbox.css.lightbox-plus-