持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
今天把我从b站上学到的爬虫分享给大家 爬的是中国文库网 b站学习链接在这里:2.代码实现过程_哔哩哔哩_bilibili
导入模块
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