前言
嗨喽,大家好呀~这里是爱看美女的茜茜呐
又到了学Python时刻~
环境使用:
-
Python 3.8
-
Pycharm
-
wkhtmltopdf 软件 --> 文章下方名片信领取
模块使用:
-
requests >>> pip install requests 数据请求
-
parsel >>> pip install parsel 数据解析
-
re >>> 内置模块 不需要安装 正则表达式
-
pdfkit >>> pip install pdfkit
( 更多资料、教程、文档点击此处跳转跳转文末名片加入君羊,找管理员小姐姐领取呀~ )
代码展示
模块导入
# 导入数据请求模块 --> 第三方模块, 需要安装 pip install requests
import requests
# 导入数据解析模块 --> 第三方模块, 需要安装 pip install parsel
import parsel
# 导入正则表达式模块 --> 内置模块, 不需要安装
import re
# 导入pdf模块 --> 第三方模块, 需要安装 pip install pdfkit
import pdfkit
( 完整源码点击此处跳转跳转文末名片加入君羊,找管理员小姐姐领取呀~ )
“”"
1. 发送请求, 模拟浏览器对于url地址发送请求
-
模拟浏览器: 把python代码伪装成浏览器去发送请求
目的:
为了防止被反爬 一种简单反反爬手段反爬:
得不到数据或者得到的数据不是你想要的headers请求头伪装:
可以直接复制字典数据类型, 要构建完成键值对
状态码:
404
链接不对
200
请求成功
-
<Response [200]>:
响应对象Response
--> 中文: 响应的意思<>
--> 表示对象对于url地址发送请求, 请求成功了
多个文章采集: 分析请求链接变化规律
主要改变的是: 文章ID 怎么找 通过抓包
爬虫采集数据 --> requests 请求获取服务器返回响应数据, 而不是元素面板
“”"
PS:完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取
请求链接
link = 'https://www.*****.com/api/v4/columns/c_1557808437160980480/items?limit=10&offset=20'
模拟伪装
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
发送请求
json_data = requests.get(url=link, headers=headers).json()
for index in json_data['data']:
# 请求链接
url = f'https://zhuanlan.****.com/p/{index["id"]}'
# 模拟伪装
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 发送请求 --> 为什么是用get请求
response = requests.get(url=url, headers=headers)
“”"
2. 获取数据, 获取服务器返回响应数据
开发者工具:
response <网页源代码>
response.text
--> 获取响应文本数据 <html字符串数据>
“”"
# 把获取下来html字符串数据<response.text>, 转成可解析对象
selector = parsel.Selector(response.text)
“”"
3. 解析数据, 提取我们想要的数据内容
解析方法: 选择哪一种解析方法, 根据返回的数据来决定
css选择器
—> 根据标签属性提取内容
xpath节点
—> 根据标签节点提取内容
re
—> 对于字符串数据进行提取
json字典取值
—> 返回json字典数据
本次使用css选择器 --> 找到相应数据标签, 然后复制语法即可
“”"
提取标题
title = selector.css('.Post-Main .Post-Title::text').get()
提取文章内容 <html格式>
content = selector.css('.css-376mun .css-1g0fqss').get()
“”"
需要提取图片链接, 然后把后面内容 src="data:image/svg+xml;utf8,<svg%20....'></svg>"
替换成图片链接
正则表达式的简单使用:
re模块findall方法
--> 找到所有我们想要的数据内容
re.findall('什么数据', '什么地方')
—> 从什么地方, 去找什么样的数据内容
“”"
提取图片链接
img_url_list = re.findall('<noscript><img src="(.*?)" data-caption=""', content)
提取需要替换的内容
img_list = re.findall('</noscript><img src="(.*?)" data-caption=""', content)
for循环遍历, 把元素一个一个提取出来
for img_url, img in zip(img_url_list, img_list):
content = content.replace(img, img_url)
前端代码模版
html_str ='''
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
{article}
</body>
</html>
'''
字符串格式化方法 —> 把content
内容, 传入到html_str
把这部分{article}
内容替换掉
html = html_str.format(article=content)
“”"
4. 保存数据
“”"
‘html\’<文件夹> + title<文件名> + ‘.html’<文件格式>
html_path = 'html\\' + title + '.html'
pdf路径
pdf_path = 'pdf\\' + title + '.pdf'
with open(html_path, mode='w', encoding='utf-8') as f:
f.write(html)
print(title)
把html文件, 转成pdf文件, 配置软件
config = pdfkit.configuration(wkhtmltopdf=r'D:\demo\wkhtmltopdf\bin\wkhtmltopdf.exe')
pdfkit.from_file(html_path, pdf_path, configuration=config)
尾语
感谢你观看我的文章呐~本次航班到这里就结束啦 🛬
希望本篇文章有对你带来帮助 🎉,有学习到一点知识~
躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。