美文网首页
Python爬取Python教程并制作成pdf

Python爬取Python教程并制作成pdf

作者: 嗨学编程 | 来源:发表于2019-01-11 10:57 被阅读0次

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

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

    2、将html转换成pdf(wkhtmltopdf)

    3、由于反爬做的比较好,在爬取的过程中还需要代理ip(免费 or 付费)

    推荐下我自己创建的Python学习交流群960410445,这是Python学习交流的地方,不管你是小白还是大牛,小编都欢迎,不定期分享干货,包括我整理的一份适合零基础学习Python的资料和入门教程。

    开始使用

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

    如下所示:

    首先,文档被转换成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方法用于得到标签下的属性值,注意这是一个重要的方法,在许多场合都能用到,比如你要得到<img src="#">标签下的图像url,那么就可以用soup.img.get('src'),具体解析如下:

    # 得到第一个p标签下的src属性printsoup.p.get("class")

    string

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

    # 在上面的一段文本中p标签没有子标签,因此能够正确返回文本的内容printsoup.p.string# 这里得到的就是None,因为这里的html中有很多的子标签printsoup.html.string

    get_text()

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

    搜索文档树

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

    https://wkhtmltopdf.org/downloads.html

    pdfkit

    shell pip3 install pdfkit

    转换url/file/string

    importpdfkitpdfkit.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')

    转换打开文件

    withopen('file.html')asf:    pdfkit.from_file(f,'out.pdf')

    自定义设置

    使用代理ip

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

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

    运行结果

    运行过程截图:

    运行过程

    生成的效果图:

    效果图

    代码如下:

    相关文章

      网友评论

          本文标题:Python爬取Python教程并制作成pdf

          本文链接:https://www.haomeiwen.com/subject/aawtdqtx.html