学以致用:Python爬取廖大Python教程制作pdf!

python-tutorial-pdf

当我学了廖大的Python教程后,感觉总得做点什么,正好自己想随时查阅,于是就开始有了制作PDF这个想法。

想要把教程变成PDF有三步:

先生成空html,爬取每一篇教程放进一个新生成的div,这样就生成了包含所有教程的html文件(BeautifulSoup)

将html转换成pdf(wkhtmltopdf)

由于廖大是写教程的,反爬做的比较好,在爬取的过程中还需要代理ip(免费 or 付费)

学以致用:Python爬取廖大Python教程制作pdf!

BeautifulSoup

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

安装

pip3 install BeautifulSoup4

开始使用

将一段文档传入 BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄.

如下所示:

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("index.html"))

soup = BeautifulSoup("data")

首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码.

然后,Beautiful Soup选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档.

对象的种类

Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为 4 种: Tag , NavigableString , BeautifulSoup , Comment .

Tag:通俗点讲就是 HTML 中的一个个标签,类似 div,p。

NavigableString:获取标签内部的文字,如,soup.p.string。

BeautifulSoup:表示一个文档的全部内容。

Comment:Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号.

Tag

Tag就是html中的一个标签,用BeautifulSoup就能解析出来Tag的具体内容,具体的格式为soup.name,其中name是html下的标签,具体实例如下:

print soup.title输出title标签下的内容,包括此标签,这个将会输出

The Dormouse's story

print soup.head输出head标签下的内容

The Dormouse's story

如果 Tag 对象要获取的标签有多个的话,它只会返回所以内容中第一个符合要求的标签。

Tag 属性

每个 Tag 有两个重要的属性 name 和 attrs:

name:对于Tag,它的name就是其本身,如soup.p.name就是p

attrs是一个字典类型的,对应的是属性-值,如print soup.p.attrs,输出的就是{'class': ['title'], 'name': 'dromouse'},当然你也可以得到具体的值,如print soup.p.attrs['class'],输出的就是[title]是一个列表的类型,因为一个属性可能对应多个值,当然你也可以通过get方法得到属性的,如:print soup.p.get('class')。还可以直接使用print soup.p['class']

get

get方法用于得到标签下的属性值,注意这是一个重要的方法,在许多场合都能用到,比如你要得到标签下的图像url,那么就可以用soup.img.get('src'),具体解析如下:

# 得到第一个p标签下的src属性

print soup.p.get("class")

string

得到标签下的文本内容,只有在此标签下没有子标签,或者只有一个子标签的情况下才能返回其中的内容,否则返回的是None具体实例如下:

# 在上面的一段文本中p标签没有子标签,因此能够正确返回文本的内容

print soup.p.string

这里得到的就是None,因为这里的html中有很多的子标签

print soup.html.string

get_text()

可以获得一个标签中的所有文本内容,包括子孙节点的内容,这是最常用的方法。

搜索文档树

BeautifulSoup 主要用来遍历子节点及子节点的属性,通过Tag取属性的方式只能获得当前文档中的第一个 tag,例如,soup.p。如果想要得到所有的

标签,或是通过名字得到比一个 tag 更多的内容的时候,就需要用到 find_all()

find_all(name, attrs, recursive, text, **kwargs )

find_all是用于搜索节点中所有符合过滤条件的节点。

name参数:是Tag的名字,如p,div,title

# 1. 节点名

print(soup.find_all('p'))

2. 正则表达式

print(soup.find_all(re.compile('^p')))

3. 列表

print(soup.find_all(['p', 'a']))

另外 attrs 参数可以也作为过滤条件来获取内容,而 limit 参数是限制返回的条数。

CSS 选择器

以 CSS 语法为匹配标准找到 Tag。同样也是使用到一个函数,该函数为select(),返回类型是 list。它的具体用法如下:

# 1. 通过 tag 标签查找

print(soup.select(head))

2. 通过 id 查找

print(soup.select('#link1'))

3. 通过 class 查找

print(soup.select('.sister'))

4. 通过属性查找

print(soup.select('p[name=dromouse]'))

5. 组合查找

print(soup.select("body p"))

wkhtmltopdf

wkhtmltopdf主要用于HTML生成PDF。

pdfkit是基于wkhtmltopdf的python封装,支持URL,本地文件,文本内容到PDF的转换,其最终还是调用wkhtmltopdf命令。

安装

先安装wkhtmltopdf,再安装pdfkit。

转换url/file/string

import pdfkit

pdfkit.from_url('http://google.com', 'out.pdf')

pdfkit.from_file('index.html', 'out.pdf')

pdfkit.from_string('Hello!', 'out.pdf')

转换url或者文件名列表

pdfkit.from_url(['google.com', 'baidu.com'], 'out.pdf')

pdfkit.from_file(['file1.html', 'file2.html'], 'out.pdf')

转换打开文件

with open('file.html') as f:

pdfkit.from_file(f, 'out.pdf')

自定义设置

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'),

],

'no-outline': None,

'outline-depth': 10,

}

pdfkit.from_url('http://google.com', 'out.pdf', options=options)

使用代理ip

爬取十几篇教程之后触发了这个错误:

学以致用:Python爬取廖大Python教程制作pdf!

503

看来廖大的反爬虫做的很好,于是只好使用代理ip了,尝试了免费的西刺免费代理后,最后选择了付费的 阿布云 ,感觉响应速度和稳定性还OK。

运行结果

运行过程截图:

学以致用:Python爬取廖大Python教程制作pdf!

运行过程

生成的效果图:

学以致用:Python爬取廖大Python教程制作pdf!

效果图

代码如下:

import time

import pdfkit

import requests

from bs4 import BeautifulSoup

使用 阿布云代理

可以选择不使用或是其他代理

def get_soup(target_url):

proxy_host = "http-dyn.abuyun.com"

proxy_port = "9020"

proxy_user = "你的用户"

proxy_pass = "你的密码"

proxy_meta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {

"host": proxy_host,

"port": proxy_port,

"user": proxy_user,

"pass": proxy_pass,

}

proxies = {

"http": proxy_meta,

"https": proxy_meta,

}

headers = {'User-Agent':

'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}

flag = True

while flag:

try:

resp = requests.get(target_url, proxies=proxies, headers=headers)

flag = False

except Exception as e:

print(e)

time.sleep(0.4)

soup = BeautifulSoup(resp.text, 'html.parser')

return soup

def get_toc(url):

soup = get_soup(url)

toc = soup.select("#x-wiki-index a")

print(toc[0]['href'])

return toc

⬇️教程html

def download_html(url, depth):

soup = get_soup(url)

处理目录

if int(depth) <= 1:

depth = '1'

elif int(depth) >= 2:

depth = '2'

title = soup.select(".x-content h4")[0]

new_title = BeautifulSoup('' + title.string + '', 'html.parser')

print(new_title)

加载图片

images = soup.find_all('img')

for x in images:

x['src'] = x['data-src']

div_content = soup.find('div', class_='x-wiki-content')

return new_title, div_content

def convert_pdf(template):

html_file = "python-tutorial-pdf.html"

with open(html_file, mode="w", encoding="utf8") as code:

code.write(str(template))

pdfkit.from_file(html_file, 'python-tutorial-pdf.pdf')

if name == 'main':

html 模板

template = BeautifulSoup(

'

',

'html.parser')

教程目录

⬇️教程html

content = download_html(url, x.parent['depth'])

往template添加新的教程

new_div = template.new_tag('div', id=i)

template.body.insert(3 + i, new_div)

new_div.insert(3, content[0])

new_div.insert(3, content[1])

time.sleep(0.4)

convert_pdf(template)

python制作pdf教程_学以致用:Python爬取廖大Python教程制作pdf!相关推荐

  1. python视频网站分类_科学网—爬取网站视频简单方法之一:python的you-get模块使用方法 - 周朝宪的博文...

    目的:网站有海量的视频(包括讲座.电影电视剧等),用python语言的you-get模块爬下来 1.安装you-get模块 在pycharm的terminal下安装.pip install you-g ...

  2. python商品评论分析_用python3爬取天猫商品评论并分析(1)

    在上一篇文章我们已经完成数据的采集,并将数据存储在mysql,现在我们来继续后面的数据分析工作,先放出项目流程: 0.主要流程 0.数据采集 0. 目标网址获取 1. 爬虫框架选用 注:了解这一步请登 ...

  3. python爬虫小案例_从豆瓣爬取《哪吒之魔童降世》的剧照

    一.在豆瓣电影网爬取以下剧照保存到本地: 本次案例只爬取前 5 页的剧照,先获取前五页的链接: for i in range(5):url = 'https://movie.douban.com/su ...

  4. 廖雪峰python3爬虫教程_Scrapy爬虫框架入门教程(1)——爬取廖雪峰老师的博客...

    最近一直在学习scrapy,但是网上关于scrapy的教程实在是太少,能找到的教程大多都是基于py2.7/scrapy0.2以下,甚至很多教程都是互相抄袭,连代码都抄漏了好多,更别提各种缩进错误.变量 ...

  5. Python爬虫入门教程 50-100 Python3爬虫爬取 m3u8 视频-Python爬虫6操作

    爬虫背景 原计划继续写一下关于手机APP的爬虫,结果发现夜神模拟器总是卡死,比较懒,不想找原因了,哈哈,所以接着写后面的博客了,从50篇开始要写几篇python爬虫的骚操作,也就是用Python3通过 ...

  6. 扇贝python学完_爬虫:爬取扇贝上python常用单词,减少登陆和贝壳的繁琐

    import requests import re file = open("vocabulary.doc", "w", encoding="utf- ...

  7. python手机代码编辑器_最受欢迎的6大Python IDE和代码编辑器

    开源社区版本为开发人员提供了高效的Python开发所需的所有工具,包括快速代码导航,代码重构,单元测试和调试器.商业版本完全支持Django,Mako和Web2Py用于Web开发. 2.Spyder ...

  8. python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...

    原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方 ...

  9. python 制作网站教程_Python爬取网站博客教程并制作成PDF

    要把教程变成PDF有三步: 1.先生成空html,爬取每一篇教程放进一个新生成的div,这样就生成了包含所有教程的html文件(BeautifulSoup) 2.将html转换成pdf(wkhtmlt ...

最新文章

  1. VSS (Visual Source Safe 2005) 用法详解
  2. C++Merege Sort合并排序的实现算法(附完整源码)
  3. mysql的原理图解_MySQL排序工作原理
  4. 健身小管家--android app源码
  5. 在Linux下不使用密码远程登陆其他Linux
  6. c++ winpcap开发(9)
  7. 设计模式学习笔记——装饰(Decorator)模式
  8. 远程主机访问mysql权限_如何给远程主机开启mysql远程登录权限
  9. 使用Maven构建Web项目-测试
  10. Android smartimageview网络图片查看器
  11. 在软件测试中UT,IT,ST,UAT分别是什么意思
  12. Gnome3 快捷键
  13. 从前端页面上下载为png格式的图片
  14. python-set
  15. R语言可视化——熵曲线
  16. 热点drcom 破解
  17. 两年多工作心得和体会
  18. 手机报彩信易操作平台
  19. 2021年应届生的就业形势怎么样呢?
  20. 《惢客创业日记》2021.07.19-24(周一)有机会,就争取

热门文章

  1. 计算机组成原理勘误,《计算机组成原理》勘误表.doc
  2. wps如何在目录里面打省略号_电脑wps里省略号怎么打相关阅读-电脑wps里省略号怎么打文章阅读-123文学网...
  3. 江苏省高中计算机合格性考试题目,江苏省2020年普通高中学业水平合格性考试试卷(含答案)...
  4. CorelDRAW版本限制使用关闭永久禁止联网登录弹窗口错误修复教程
  5. 成都最最最牛逼的IT公司全在这了,来成都一起造富。。。
  6. 比尔盖茨The Best Books I Read in 2013
  7. Android出海攻略(一):Google Play 上架扫盲
  8. 枢轴点(Pivot Point)系统
  9. html 设置元素向左浮动
  10. 【前端基础】Vue学习笔记