首页 > 其他分享 >爬虫基础之爬取博客博主文章保存为PDF

爬虫基础之爬取博客博主文章保存为PDF

时间:2025-01-03 10:56:46浏览次数:3  
标签:cookies title url wkhtmltopdf 爬虫 html params 博主 PDF

网址:爬虫基础之爬取某阁小说(最新版1)_小说在线爬虫-CSDN博客

工具:爬虫工具库-spidertools.cn

本案列所需要的模块:

requestswkhtmlwopdf
parselos
pdfkitpprint

以我自己的博客为例:

爬取步骤:
一.请求数据 模拟浏览器向服务器发送请求

确定爬取的目标--文章的标题和内容
        F12 or 右击 打开开发者工具  点击网络 刷新页面 因为打开开发者工具之前 我们的数据包就已经加载完成了 需要重新加载

        1.Ctrl+F 打开搜索框 搜索文章的标题 得到放回的数据包
        2.接着搜索文章内容  发现都在一个数据包中


        

        接着我们一篇文章的分析就可以了 接着分析多篇文章的采集 拿到所有文章的url即可 因此在所有的文章的列表页中 搜索一篇文章的标题 查看所返回的数据包

        此时发现有两个数据包 我们选择下面这个 返回的数据类型为JSON 格式的方便我们后续提取数据
 

OK 所有的分析到此结束 接着就是具体的步骤:

  1. 向列表页发送请求拿到所有文章的URL 
  2. 再次向每篇文章的URL发送请求 获取到文章的标题和内容
  3. 保存成HTML 再转换成PDF
     

右击数据包 复制cURL地址 注意是bash

        接着打开我们的爬虫工具  选择cURL 转Headers

        接着复制右边的代码到本地py文件中运行

 Nice 成功获取到数据
  这个地方因为打印成一行了 不太好看信息 我们可以使用pprint模块 对JSON 格式的数据进行格式化  

import pprint

# 因为放回的数据类型是JSON格式的 我们直接获取json数据

pprint.pprint(response.json)

此时再次运行代码 巴适 一目了然

二.提取数据 从返回的数据中提取我们所需要的

#拿到JSON 格式的数据
response = requests.get(url, headers=headers, cookies=cookies, params=params).json()
# 提取数据 根据键值对取值
all_info= response['data']['list']
# 循坏列表 拿到标题和文章的链接
for i in all_info:
    all_title = i['title']
    all_url = i['url']
    print(all_title)
    print(all_url)


        

接着我们向多个链接发送请求拿到详情页的数据
找到之前分析的数据包

    resp = requests.get(url=all_url,headers=headers, cookies=cookies, params=params).text
    print(resp)
    exit()

确定标题和内容是否包含在里面

需要准备我们的前端的基本格式  如下  学过前端的就知道

html_str = '''
<!DOCTYPE html>
    <html lang ="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title >
</ head>
<body>
{article}
</body>
</html>
'''

接着我们打开元素面板 找到我们文章内容的位置

class属性为baidu_pl的article标签中包含所有的内容 获取它就可以了

然后我们使用数据解析模块 parsel对数据进行解析提取 

    selector = parsel.Selector(resp)
    # 获取文章内容 包括标签  因为是保存为html
    all_text = selector.css('.baidu_pl').get()
    # 将前端html 基本的模板 用fomat填充内容
    html = html_str.format(article=all_text)
   

三.保存数据 保存数据到本地 HTML --- PDF

 with open(f'PDF\\'+all_title+'.html', 'w',encoding='utf-8') as f:
        f.write(html)
        print(f'{all_title}保存成功')


 打开看看是否保存成功

 最后将HTML文件转换为 PDF
        需要安装模块 pip install  pdfkit  还需要下载个软件 wkhtmltopdf 在网上搜一下
        很快就下载好了 找到下载好的文件 bin目录下的wkhtmltopdf

    # 路径为wkhtmltopdf.exe 下载的目录
    config = pdfkit.configuration(wkhtmltopdf=r'E:\wkhtmltopdf\bin\wkhtmltopdf.exe')
    # 生成pdf 需要传入 html文件路径和pdf文件路径
    pdfkit.from_file(html_path, pdf_path, configuration=config)

成功  

本案例的所有代码如下 供大家学习参考

import pprint
import pdfkit
import parsel
import requests

headers = {
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Connection": "keep-alive",
    "Referer": "https://blog.csdn.net/2302_80243887?type=blog",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
    "sec-ch-ua": "\"Not;A=Brand\";v=\"24\", \"Chromium\";v=\"128\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\""
}
cookies = {
    "uuid_tt_dd": "10_37481693270-1735546529918-692779",
    "dc_session_id": "10_1735546529918.215075",
    "fid": "20_52912689613-1735546530077-122627",
    "c_first_ref": "www.baidu.com",
    "c_first_page": "https%3A//www.csdn.net/",
    "c_dsid": "11_1735546530078.924843",
    "c_segment": "11",
    "Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac": "1735546531",
    "HMACCOUNT": "C82A6BA9C5E78AFB",
    "hide_login": "1",
    "dc_sid": "feb7eb6ec5c7a3c026bebfa7b45aa21e",
    "SESSION": "b7ec1f34-3bfc-45c9-8f4a-518afb974882",
    "creative_btn_mp": "3",
    "fe_request_id": "1735546575971_6072_5209761",
    "c_utm_medium": "distribute.pc_search_result.none-task-user-null-1-166900334-null-null.nonecase",
    "c_utm_term": "Serendipity_Carl",
    "_clck": "1oft0z1%7C2%7Cfs5%7C0%7C1825",
    "firstDie": "1",
    "__gads": "ID=edbcb9d9dcb54bf1:T=1735546630:RT=1735547412:S=ALNI_MYEdt9OIXDYZ9LtGLrDg4UBfzKj6w",
    "__gpi": "UID=00000fc30571b315:T=1735546630:RT=1735547412:S=ALNI_MYlptoafriG2nIVg-ePq6iFG672Ow",
    "__eoi": "ID=37087d2f10f16528:T=1735546630:RT=1735547412:S=AA-AfjbovuivGwSQ1ixf2YbBXb2F",
    "log_Id_click": "18",
    "c_pref": "https%3A//blog.csdn.net/2302_80243887%3Fops_request_misc%3D%257B%2522request%255Fid%2522%253A%25226a3923f61e8278e7f16a708b39bcd450%2522%252C%2522scm%2522%253A%252220140713.130064515..%2522%257D%26request_id%3D6a3923f61e8278e7f16a708b39bcd450%26biz_id%3D206%26utm_medium%3Ddistribute.pc_search_result.none-task-user-null-1-166900334-null-null.nonecase%26utm_term%3DSerendipity_Carl%26spm%3D1018.2226.3001.4351",
    "c_ref": "https%3A//blog.csdn.net/2302_80243887/article/details/144757254%3Fspm%3D1001.2014.3001.5501",
    "loginbox_strategy": "%7B%22taskId%22%3A349%2C%22abCheckTime%22%3A1735546531419%2C%22version%22%3A%22exp11%22%2C%22blog-threeH-dialog-exp11tipShowTimes%22%3A4%2C%22blog-threeH-dialog-exp11%22%3A1735546585257%7D",
    "popPageViewTimes": "4",
    "Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac": "1735547903",
    "log_Id_view": "363",
    "_clsk": "4bgt4c%7C1735547904447%7C4%7C0%7Cn.clarity.ms%2Fcollect",
    "https_waf_cookie": "90b9e0fd-6f68-44fa0d2f0c8cd236eccce7d70724811b609b",
    "waf_captcha_marker": "fe6e6833e05d3e98385f953dd0e51a6ee1f7c81642941f37346b896be7d5c560",
    "c_page_id": "default",
    "dc_tos": "spatd8",
    "log_Id_pv": "8"
}
url = "https://blog.csdn.net/community/home-api/v1/get-business-list"
params = {
    "page": "1",
    "size": "20",
    "businessType": "blog",
    "orderby": "",
    "noMore": "false",
    "year": "",
    "month": "",
    "username": "2302_80243887"
}
response = requests.get(url, headers=headers, cookies=cookies, params=params).json()
all_info= response['data']['list']
html_str = '''
<!DOCTYPE html>
    <html lang ="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title >
</ head>
<body>
{article}
</body>
</html>
'''
for i in all_info:
    all_title = i['title']
    all_url = i['url']
    resp = requests.get(url=all_url,headers=headers, cookies=cookies, params=params).text
    selector = parsel.Selector(resp)
    # 获取文章内容 包括标签  因为是保存为html
    all_text = selector.css('.baidu_pl').get()
    # 将前端html 基本的模板 用fomat填充内容
    html = html_str.format(article=all_text)
    # 新建我们的目录 需要额外在当前的代码目录新建HTML PDF 或者使用os模块自动新建
    html_path = 'HTML\\' + all_title + '.html'
    pdf_path = 'PDF\\'+all_title+'.pdf'

    with open(html_path, 'w',encoding='utf-8') as f:
        f.write(html)
        print(f'{all_title}保存成功')
    # 路径为wkhtmltopdf.exe 下载的目录
    config = pdfkit.configuration(wkhtmltopdf=r'E:\wkhtmltopdf\bin\wkhtmltopdf.exe')
    # 生成pdf 需要传入 html文件路径和pdf文件路径
    pdfkit.from_file(html_path, pdf_path, configuration=config)












         本次的案列分析就到此结束啦 感谢大家的观看 您的点赞和关注是我更新的动力 谢谢!


 

标签:cookies,title,url,wkhtmltopdf,爬虫,html,params,博主,PDF
From: https://blog.csdn.net/2302_80243887/article/details/144829165

相关文章