爬虫中国文库网,(五花马千金裘)

191 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

今天把我从b站上学到的爬虫分享给大家 爬的是中国文库网 b站学习链接在这里:2.代码实现过程_哔哩哔哩_bilibili

image.png

导入模块

import requests

数据请求模块

import re

正则表达式模块

可以直接提取字符串数据 response.text 就是html字符串数据

import parsel

数据解析模块

首先要把html字符串数据转成可解析的数据 selector

文章列表url地址

import os

文件操作模块

转成pdf

import pdfkit

html_str = """

<!doctype html>

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

htmltopdf 的软件

html_filename = 'html' # 定义文件夹名字

判断 如果没有这个文件夹的话

if not os.path.exists(html_filename): os.mkdir(html_filename)

# 创建这个文件夹

pdf_filename = 'pdf'

# 定义文件夹名字

判断 如果没有这个文件夹的话

if not os.path.exists(pdf_filename):
    os.mkdir(pdf_filename)  # 创建这个文件夹
url = 'https://www.chinawenwang.com/zlist-66-1.html'

请求头[字典形式] User-Agent:表示的浏览器基本信息(确认请求)

headers = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
}

发送请求

response = requests.get(url=url, headers=headers)
# print(response.text)

解析数据 用re正则表达式提取文章url地址。*?可以匹配任意字符 除了(\n)如果需要匹配\n则需要加上面re.s

.?*各大代表的是什么意思?属于正则表达里面的元子符,可以匹配任意字符出来(\n)*匹配前一个字符0个或者无限个?非贪婪匹配模式

href = re.findall('<h2><a href="(.*?)" class="juhe-page-left-div-link">',response.text)

正则匹配出来的数据 返回的是列表,里面每个元素都表示的是文章的url地址

所以我们要提取列表中的每个元素 就是需要用到for循环/、遍历

for link in href:
    response_1 = requests.get(url=link, headers=headers)
    selector = parsel.Selector(response_1.text)
    title = selector.css('.content-page-header-div h1::text').get()

我要获取包含html标签

   content = selector.css('.content-page-main-content-div').get()
   article = html_str.format(article=content)
   html_path = html_filename + title + '.html'  

html文件的路径、文件名、后缀

    pdf_path = pdf_filename + title + '.pdf'  
    # html文件的路径、文件名、后缀
    with open(html_path, mode='w', encoding='utf-8') as f:
        f.write(article)
    config = pdfkit.configuration(wkhtmltopdf=r'D:\wkhtmltopdf\bin\wkhtmltopdf.exe')
    pdfkit.from_file(html_path,pdf_path,configuration=config)
    print("保存成功",title)

最后会以pdf的类型保存到你的电脑里,我用的是pc

image.png