700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python抓取网页并保存为PDF

Python抓取网页并保存为PDF

时间:2021-12-17 14:26:10

相关推荐

Python抓取网页并保存为PDF

1、开发环境搭建

(1)Python2.7.13的安装:参考《廖雪峰老师的网站》

(2)Python包管理器pip的安装:参考《pip安装文档说明》

因为基于版本2.7.13,因为2.7.9以上已经自带pip,所以不需要单独安装,但是需要我们更新。上面的说明文档有说明。

(3)Python下的PDF工具:PyPDF2;

安装命令:

pip install PyPDF2

说明文档:《PyPDF2 1.26.0 说明文档》

PyPDF2简易示例:

from PyPDF2 import PdfFileMergermerger = PdfFileMerger()input1 = open("1.pdf", "rb")input2 = open("2.pdf", "rb")merger.append(input1)merger.append(input2)# 写入到输出pdf文档中output = open("hql_all.pdf", "wb")merger.write(output)

(4)Python下的Microsoft Word 工具:

pip install python-docx

说明文档:《python-docx 0.8.6 说明文档》

(5)依赖工具的安装

requests、beautifulsoup 是爬虫两大神器,reuqests 用于网络请求,beautifusoup 用于操作 html 数据。有了这两把梭子,干起活来利索。scrapy 这样的爬虫框架我们就不用了,这样的小程序派上它有点杀鸡用牛刀的意思。此外,既然是把 html 文件转为 pdf,那么也要有相应的库支持, wkhtmltopdf 就是一个非常的工具,它可以用适用于多平台的 html 到 pdf 的转换,pdfkit 是 wkhtmltopdf 的Python封装包。首先安装好下面的依赖包

pip install requestspip install beautifulsoup4pip install pdfkit

(6)手动安装wkhtmltopdf

Windows平台直接在 /downloads.html 下载稳定版的 wkhtmltopdf 进行安装,安装完成之后把该程序的执行路径加入到系统环境 $PATH 变量中,否则 pdfkit 找不到 wkhtmltopdf 就出现错误 “No wkhtmltopdf executable found”。Ubuntu 和 CentOS 可以直接用命令行进行安装

$ sudo apt-get install wkhtmltopdf # ubuntu$ sudo yum intsall wkhtmltopdf# centos

2、源代码

# coding=utf-8 import os import re import time import logging import pdfkit import requests from bs4 import BeautifulSoup from PyPDF2 import PdfFileMerger html_template = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> {content} </body> </html> """ def parse_url_to_html(url, name): """ 解析URL,返回HTML内容 :param url:解析的url :param name: 保存的html文件名 :return: html """ try: response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 正文 body = soup.find_all(class_="x-wiki-content")[0] # 标题 title = soup.find('h4').get_text() # 标题加入到正文的最前面,居中显示 center_tag = soup.new_tag("center") title_tag = soup.new_tag('h1') title_tag.string = title center_tag.insert(1, title_tag) body.insert(1, center_tag) html = str(body) # body中的img标签的src相对路径的改成绝对路径 pattern = "(<img .*?src=\")(.*?)(\")" def func(m): if not m.group(3).startswith("http"): rtn = m.group(1) + "" + m.group(2) + m.group(3) return rtn else: return m.group(1)+m.group(2)+m.group(3) html = pile(pattern).sub(func, html) html = html_template.format(content=html) html = html.encode("utf-8") with open(name, 'wb') as f: f.write(html) return name except Exception as e: logging.error("解析错误", exc_info=True) def get_url_list(): """ 获取所有URL目录列表 :return: """ response = requests.get("/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000") soup = BeautifulSoup(response.content, "html.parser") menu_tag = soup.find_all(class_="uk-nav uk-nav-side")[1] urls = [] for li in menu_tag.find_all("li"): url = "" + li.a.get('href') urls.append(url) return urls def save_pdf(htmls, file_name): """ 把所有html文件保存到pdf文件 :param htmls: html文件列表 :param file_name: pdf文件名 :return: """ options = { 'page-size': 'Letter', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'encoding': "UTF-8", 'custom-header': [ ('Accept-Encoding', 'gzip') ], 'cookie': [ ('cookie-name1', 'cookie-value1'), ('cookie-name2', 'cookie-value2'), ], 'outline-depth': 10, } pdfkit.from_file(htmls, file_name, options=options) def main(): start = time.time() file_name = u"liaoxuefeng_Python3_tutorial" urls = get_url_list() for index, url in enumerate(urls): parse_url_to_html(url, str(index) + ".html") htmls =[] pdfs =[] for i in range(0,124): htmls.append(str(i)+'.html') pdfs.append(file_name+str(i)+'.pdf') save_pdf(str(i)+'.html', file_name+str(i)+'.pdf') print u"转换完成第"+str(i)+'个html' merger = PdfFileMerger() for pdf in pdfs: merger.append(open(pdf,'rb')) print u"合并完成第"+str(i)+'个pdf'+pdf output = open(u"廖雪峰Python_all.pdf", "wb") merger.write(output) print u"输出PDF成功!" for html in htmls: os.remove(html) print u"删除临时文件"+html for pdf in pdfs: os.remove(pdf) print u"删除临时文件"+pdf total_time = time.time() - start print(u"总共耗时:%f 秒" % total_time) if __name__ == '__main__': main()

3、学习网站

(1)菜鸟教程

(2)Python2.7官网文档

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。