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

python爬虫-爬取github博客文章并存储为PDF,第1张

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

目标页面

Tags - yanmie's blog
 

我们需要用到的库:

import pdfkit

import requests

import parsel

相关模块可pip安装

分析页面结构

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

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

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

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

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

爬取每一篇文章的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)

爬取文章标题以及内容

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

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

对于标题和内容的提取解析,同样使用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)
    # 获取文章标题,,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)

以标题名存储为PDF格式

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

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

wkhtmltopdf.exe 工具

有了这个小工具就可以将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 = """



    
    document


{article}


"""
​
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)
    # 获取文章标题,,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)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5689321.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存