python爬虫-爬取github博客文章并存储为PDF

目标页面:

Tags - yanmie's blog
 

image-20220101222342804

我们需要用到的库:

import pdfkit

import requests

import parsel

相关模块可pip安装

分析页面结构

大概浏览以下页面,tags页面中包含了所有文章,不存在分页情况,这样就省去一步了。

F12打开开发者工具,查看页面源码,我们看到一个标签列表。

image-20220101224434586

打开列表中的一个就会发现,该标签下的文章。

image-20220101224840417

ctrl + shift +c ,选择 tags 页面中的文章标题 ”使用github个人博客“,我们看到了文章标题,链接以及class。

image-20220101223527135

但是这里的链接只有后半部分,所以我们需要自己补全url

image-20220101223721126

爬取每一篇文章的URL

实现代码

这里需要掌握 css选择器。(本人是初学者,所以下面内容如果存在错误之处,欢迎指出!)

需要注意的是,当页面结构发生改变时,css选择器对应的代码就要改变!

经过分析 文章的url 属于 post-preview 类,且位于a标签中,所以提取href的内容

selector.css('.post-preview a ::attr(href)').getall()

源码:

import requests
import pdfkit
import parsel
​
​
# 目标url
url = "https://yanmie-art.github.io/tags/"
# 文章url 前缀
url0 = "https://yanmie-art.github.io"
​
response = requests.get(url=url)
# 将网页变成选择器
selector = parsel.Selector(response.text)
# 爬取每篇文章的url(不完整)
urls1 = selector.css('.post-preview a ::attr(href)').getall()
# 爬取每篇文章的title
# titles = selector.css('.post-title::text').getall()
​
for url1 in urls1:
    # 补全文章url
    article_url = url0 + url1
    # 打印验证
    print(article_url)

image-20220101225152013

爬取文章标题以及内容

爬取到每一篇文章的URL后,我们爬出每篇文章的标题和内容

同样分析页面结构,获得标题位置和内容位置

image-20220101225606667

image-20220101231334383

对于标题和内容的提取解析,同样使用css选择器,下面直接附上源码:

实现代码:

import requests
import pdfkit
import parsel
​
​
# 目标url
url = "https://yanmie-art.github.io/tags/"
# 文章url 前缀
url0 = "https://yanmie-art.github.io"
​
response = requests.get(url=url)
# 将网页变成选择器
selector = parsel.Selector(response.text)
# 爬取每篇文章的url(不完整)
urls1 = selector.css('.post-preview a ::attr(href)').getall()
# 爬取每篇文章的title
# titles = selector.css('.post-title::text').getall()
​
for url1 in urls1:
    # 补全文章url
    article_url = url0 + url1
    # print(article_url)
    # 请求文章url
    response = requests.get(url=article_url)
    selector = parsel.Selector(response.text)
    # 获取文章标题,class="post-heading",h1标签,获取text
    title = selector.css('.post-heading h1 ::text').getall()
    # 过滤文章标题中不合法的字符,保证以文章标题为名存储为PDF时不报错
    title = title[0]
    title = title.replace('.', '')
    title = title.replace('?', '')
    title = title.replace('\'', '')
    title = title.replace('"', '')
    title = title.replace('/', '')
    title = title.replace('\\', '')
    # 获取文章内容
    content = selector.css('.post-container').get()
    # 打印验证
    print(title)
    print("*"*40)
    print(content)
    print("*"*40)

image-20220101230943222

以标题名存储为PDF格式

现在所看到的返回的内容结果,除了标题是咱们需要的那样,但是内容还是网页数据。

咱们只需要把html改成PDF格式

wkhtmltopdf.exe 工具

image-20220101231739762

有了这个小工具就可以将html格式改为PDF格式,直接上源码

完整代码:

import requests
import pdfkit
import parsel
​
​
# 目标url
url = "https://yanmie-art.github.io/tags/"
# 文章url 前缀
url0 = "https://yanmie-art.github.io"
​
html_str = """
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{article}
</body>
</html>
"""
​
response = requests.get(url=url)
# 将网页变成选择器
selector = parsel.Selector(response.text)
# 爬取每篇文章的url(不完整)
urls1 = selector.css('.post-preview a ::attr(href)').getall()
# 爬取每篇文章的title
# titles = selector.css('.post-title::text').getall()
​
for url1 in urls1:
    # 补全文章url
    article_url = url0 + url1
    # print(article_url)
​
    # 请求文章url
    response = requests.get(url=article_url)
    selector = parsel.Selector(response.text)
    # 获取文章标题,class="post-heading",h1标签,获取text
    title = selector.css('.post-heading h1 ::text').getall()
    # 过滤标题的非法字符,保证以标题名存储时正确
    title = title[0]
    title = title.replace('.', '')
    title = title.replace('?', '')
    title = title.replace('\'', '')
    title = title.replace('"', '')
    title = title.replace('/', '')
    title = title.replace('\\', '')
    # 获取文章内容
    content = selector.css('.post-container').get()
    # 打印验证
    # print(title)
    # print(content)
    # print("*"*40)
    
    # 转换格式
    html = html_str.format(article=content)
    # 写入html文件
    with open(f'{title}.html', mode='w', encoding='utf-8') as f:
        f.write(html)
    print('{}已下载完成'.format(title))
    # exe 文件存放的路径
    config = pdfkit.configuration(wkhtmltopdf='D:\\wkhtmltox\\wkhtmltopdf\\bin\\wkhtmltopdf.exe')
    # 报错:由于网络错误,以代码 1 退出:ProtocolUnknownError
    # 解决方法:https://githubmate.com/repo/HAKSOAT/EpubToPdf/issues/3
    options = {
        "enable-local-file-access": None,
        "quiet": ""
    }
    # 把 html 通过 pdfkit 变成 pdf 文件
    pdfkit.from_file(f'{title}.html', f'{title}.pdf', configuration=config, options=options)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ErYao7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值