爬取博客并转成pdf

前些天无意间看到了“birdben”的博客,写的比较详细,但是最新的文章更新时间是“2017-05-07”,时间很是久远,本打算有时间认真学习一下博主所写的文章,但是担心网站会因为某些原因停止服务,于是想到将博主写的所有文章爬下来保存成pdf,说干就干!



你们可以点击这里,查看博主的网站。

一、使用到的模块

  pdfkit:可以将文本、html、url转成pdf,但是需要安装wkhtmltopdf.exe,并获取它的安装路径

      pdfkit是基于wkhtmltopdf的python封装,支持url,本地文件,文本内容转成pdf,最终还是调用wkhtmltopdf的命令

  PyPDF2:处理pdf的模块,可读可写可合并

 

二、思路分析

  1、博客url分析

主页url:https://birdben.github.io/
第二页url:https://birdben.github.io/page/2/
最后一页url:https://birdben.github.io/page/14/

 某篇文章的url:

  查看主页的html

  可以看出:该博客网站共有15个主页面,每篇文章的url可以使用 “主页url” + “href”  (见上图)

  2、整体思路

    • 生成所有页面的url列表
    • 遍历每个页面的url,在html中匹配出每个文章的href,拼接成每个文章的url
    • 利用url生成pdf
    • 合并pdf

三、代码过程

  1、博客网站共有15个页面,生成这15个页面的url

	def geturl():
	    url = "https://birdben.github.io/archives/"
	    list = [url]
	    for i in range(2,15):
	        str = "%spage/%d/" % (url,i)
	        list.append(str)
          return list

   返回的结果:

  2、根据已经获得的页面url,读取url,查看html,匹配符合要求的href 

	def getname(url,):
	    r = requests.get ( url )
	    str = "".join(r.text)
	    pattern = re.compile(r‘<a class="archive-article-title" href="(.*)">.*?</a>‘)
	    match = pattern.findall(str)
	    r.close()
         return match

  结果:

  3、拼接url,生成每个文章的url,利用url转成pdf

  4、合并pdf

四、最终代码

import requests
import re
import pdfkit
from PyPDF2 import PdfFileReader, PdfFileMerger
import os

#获取一个页面所有的 文章全称 用于构建每篇文章的url路径
def getname(url,):
    r = requests.get ( url )
    str = "".join(r.text)
    pattern = re.compile(r‘<a class="archive-article-title" href="(.*)">.*?</a>‘)
    match  = pattern.findall(str)
    r.close()
    return match

#获取他的所有页面,每个页面会有很多文章
def geturl():
    url = "https://birdben.github.io/archives/"
    list = [url]
    for i in range(2,15):
        str = "%spage/%d/" % (url,i)
        list.append(str)
    return list

#将url转换成pdf
def savepdf(url,pdfname):
    path_wkthmltopdf = r"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"
    config = pdfkit.configuration ( wkhtmltopdf=path_wkthmltopdf )
    pdfkit.from_url ( url , pdfname , configuration=config )

#爬取所有文章转成pdf
def do():
    urllist = geturl()
    for url in urllist:
        namelist = getname(url)
        for blog in namelist:
            blogurl = "https://birdben.github.io" + blog
            pdfname = r"pdf\%s.pdf" % blog.strip("/").split("/")[-1]  #将pdf保存到当前目录下的pdf目录下,需提前创建
            print(blogurl,pdfname)
            savepdf(blogurl,pdfname)

#合并pdf
def mergepdf(tmpdir,mergename):  #合并文件存放的路径,合并后的pdf文件名
    merger = PdfFileMerger()
    listfile = [os.path.join(tmpdir, file) for file in os.listdir(tmpdir)]
    for file in listfile:
        if file.endswith(‘.pdf‘):
            filemsg = PdfFileReader(open(file, ‘rb‘))
            label = file.split(‘\\‘)[-1].replace(".pdf", "")
            merger.append (filemsg, bookmark=label , import_bookmarks=False)
    merger.write(mergename)
    merger.close()

 以上代码是使用到的所有函数

 执行:

if __name__ == ‘__main__‘:
    do()
    #mergepdf("merge",r"merge\docker.pdf")   当do函数执行完后,将需要合并的pdf放到merge目录下(提前创建),再将do注释,再执行mergepdf函数即可

  爬取所有文章生成pdf,将生成的pdf放在pdf目录下,需提前创建

将每部分pdf拷贝到另外目录merge下

最终的pdf:

原文地址:https://www.cnblogs.com/zqj-blog/p/10602702.html

时间: 2024-10-16 07:45:30

爬取博客并转成pdf的相关文章

Python爬虫爬取博客园并保存

Python爬虫爬取博客园并保存        爬取博客园指定用户的文章修饰后全部保存到本地 首先定义爬取的模块文件: crawlers_main.py 执行入口 url_manager.py url管理器 download_manager.py 下载模块 parser_manager.py html解析器(解析html需要利用的内容) output_manager.py 输出html网页全部内容文件(包括css,png,js等) crawlers_main.py 执行入口 1 # coding

java爬虫爬取博客园数据

网络爬虫 编辑 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. 网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler).聚焦网络爬虫(Focused Web Crawler).增量式网络爬虫(Incremental Web Crawler).深层网络爬虫(Deep We

nodejs爬取博客园的博文

其实写这篇文章,我是很忐忑的,因为爬取的内容就是博客园的,万一哪个顽皮的小伙伴拿去干坏事,我岂不成共犯了? 好了,进入主题. 首先,爬虫需要用到的模块有: express ejs superagent (nodejs里一个非常方便的客户端请求代理模块) cheerio (nodejs版的jQuery) 前台布局使用bootstrap 分页插件使用 twbsPagination.js 完整的爬虫代码,在我的github中可以下载.主要的逻辑代码在 router.js 中. 1. 爬取某个栏目第1页

python——关于简单爬取博客园班级成员发的博文的题目、发布人、阅读、评论,再存到csv文件中

因为老师要以班里每个人发的博客质量作为最后总成绩的评定的一部分,就要把班上所有同学发的博客都统计起来,可以用来评定的因素有:阅读.评论.推荐等,但因为今天只是做一个简单的爬取,推荐这个元素在班级博客中需要点开每一篇博文才能看到获取,就不爬取了,只爬取阅读和推荐,加上每篇博文的发布人和标题. 我先会放上代码,再逐条解释其含义及作用. 代码如下(其中爬取的网页是以我自己的班级为例): 1 from bs4 import BeautifulSoup 2 import pandas as pd 3 im

webmagic爬取博客园所有文章

最近学习了下webmagic,学webmagic是因为想折腾下爬虫,但是自己学java的,又不想太费功夫,所以webmagic是比较好的选择了. 写了几个demo,源码流程大致看了一遍.想着把博客园的文章列表爬下来吧. 首页显示的就是第一页文章的列表, 但是翻页按钮不是链接,而是动态的地址: 实际请求的地址及参数: 针对这个动态页面的情况,有两种解决方案: 1. webmagic模拟post请求,获取返回页面. 1 public class CnblogsSpider implements Pa

Python+webdriver爬取博客园“我的闪存”并保存到本地

前篇 用webdriver+phantomjs实现无浏览器的自动化过程 本篇 想法与实现 我想要将博客园“我的闪存”部分内容爬取备份到本地文件,用到了WebDriver和Phantomjs的无界面浏览器.对于xpath的获取与校验需要用到firefox浏览器,安装firebug和firepath插件.代码如下: # -*- coding: utf-8 -*- import os,time from selenium import webdriver from selenium.webdriver

Python - 爬取博客园某一目录下的随笔 - 保存为docx

1 #coding:utf-8 2 import requests 3 from bs4 import BeautifulSoup 4 import MySQLdb 5 6 7 def get_html(url): 8 ''' 9 获取页面HTML源码,并返回 10 ''' 11 html = requests.get(url) 12 content = html.text.encode('utf-8') 13 return content 14 15 def get_blog_html_lis

使用JAVA爬取博客里面的所有文章

主要思路: 1.找到列表页. 2.找到文章页. 3.用一个队列来保存将要爬取的网页,爬取队头的url,如果队列非空,则一直爬取. 4.如果是列表页,则抽取里面所有的文章url进队:如果是文章页,则直接爬取至本地. 一个博客是起始页url是这样的: http://www.cnblogs.com/joyeecheung/ 第n页是这样的: http://www.cnblogs.com/joyeecheung/default.html?page=n 文章的url是这样的: http://www.cnb

爬虫实战【1】使用python爬取博客园的某一篇文章

第一次实战,我们以博客园为例. Cnblog是典型的静态网页,通过查看博文的源代码,可以看出很少js代码,连css代码也比较简单,很适合爬虫初学者来练习. 博客园的栗子,我们的目标是获取某个博主的所有博文,今天先将第一步. 第一步:已知某一篇文章的url,如何获取正文? 举个栗子,我们参考'农民伯伯'的博客文章吧,哈哈.他是我关注的一个博主. http://www.cnblogs.com/over140/p/4440137.html 这是他的一篇名为"[读书笔记]长尾理论"的文章. 我