8.一个项目实战(下载CSDN博客文章)
专栏地址 ʅ(‾◡◝)ʃ
前言
要写一个下载器,首先要实现一个接口函数,而这个函数可以对请求的数据进行处理也就是爬虫,其次才是写图形化界面
接口的实现
其实CSDN的浏览器页面的接口很复杂,是直接通过后台渲染成的 html, 但是手机端的app 就有单独的接口了
https://gw.csdn.net/cms-app/v1/blog_details/may_login/get_article_details_info_html?articleId=89147758&bloggerUserName=chouzhou9701&skin=night
这个 url 接口是我通过 charles 抓包获得的
下面是一个简单的下载的代码实现:
import requests
url = 'https://gw.csdn.net/cms-app/v1/blog_details/may_login/get_article_details_info_html?articleId=89147758&bloggerUserName=chouzhou9701&skin=night'
response = requests.get(url)
text = response.json()['data']['TextBody']
with open('blog.html','w') as f:
f.write(text)
这个没什么技术含量,就是通过接口简单的获取到返回的数据并把它写到 .html 一个文件里面
如果你细心的话,你就会发现这个 url 中有两个有用的参数(可变化的),articleId 和 bloggerUserName
也就是文章id 还有用户名
所以只要知道这两个参数,那么所有的文章就可以下载了,而你访问一个博客文章的 url 是就已经包含这两个参数了
比如
https://blog.csdn.net/chouzhou9701/article/details/89339625
可以看到 chouzhou9701 就是用户名,而 后面的 89339625 就是文章的 id
所以我们写一个函数,这个函数的作用有以下几点功能:
1.将从url 获取到用户名和文章的id
2.通过获提取到的这两个参数,重新构造接口
3.下载文章
代码实现
api
import requests
def download(url):
username,articleId = url.split('/')[-4],url.split('/')[-1]
url = 'https://gw.csdn.net/cms-app/v1/blog_details/may_login/get_article_details_info_html?articleId=%s&bloggerUserName=%s&skin=night' %(articleId,username)
response = requests.get(url)
text = response.json()['data']['TextBody']
with open('blog.html','w') as f:
f.write(text)
if __name__ == '__main__':
download('https://blog.csdn.net/chouzhou9701/article/details/89339625')
这个接口就写好了,试着运行这个文件,会在同级目录下生成一个blog.html文件,打开这个文件

会发现文章已经爬去完毕了,如果你不喜欢黑色主题你可以把接口的url中的skin=night 去掉
图像化界面实现
由于界面较为简单所以这里我不用qtdesigner了,直接写一个简单的界面
8
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QThread, pyqtSignal
import sys
from api import download
class MyWin(QWidget):
"""docstring for Mywine"""
def __init__(self):
super(MyWin, self).__init__()
self.mythread = MyThread() # 实例化自己建立的任务线程类
self.mythread.signal.connect(self.callback) #设置任务线程发射信号触发的函数
self.pushButton = QPushButton('下载')
self.input_url = QLineEdit()
layout = QVBoxLayout(self) #实例化一个水平布局
layout.addWidget(self.input_url)
layout.addWidget(self.pushButton)
self.setLayout(layout)
self.pushButton.clicked.connect(self.download_blog)
def download_blog(self): # 这里test就是槽函数, 当点击按钮时执行 test 函数中的内容, 注意有一个参数为 self
self.mythread.data = self.input_url.text() # 这句就是给线程的实例化一个属性给其赋值,在线程里面就可以调用了
self.mythread.start() # 启动任务线程
def callback(self,i): # 这里的 i 就是任务线程传回的数据
QMessageBox.information(self,'提示信息',i)
class MyThread(QThread): # 建立一个任务线程类
signal = pyqtSignal(str) #设置触发信号传递的参数数据类型,这里是字符串
def __init__(self):
super(MyThread, self).__init__()
def run(self): # 在启动线程后任务从这个函数里面开始执行
url = self.data
print(self.data)
download(url)
self.signal.emit('下载完成')
if __name__ == '__main__':
app = QApplication(sys.argv)
mywin = MyWin() # 实例化一个窗口小部件
mywin.setWindowTitle('下载csdn博客') # 设置窗口标题
mywin.show() #显示窗口
sys.exit(app.exec())
这个是一个简单的图形化界面,你可以再次进行优化,比如判断输入的内容是否为空,或者把存储路径也加入个输入框可以当参数传递过去,不过这个现在已经能用了,虽然功能很少
8.一个项目实战(下载CSDN博客文章)的更多相关文章
- Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片
Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片, ...
- 利用爬虫爬取指定用户的CSDN博客文章转为md格式,目的是完成博客迁移博文到Hexo等静态博客
文章目录 功能 爬取的方式: 设置生成的md文件命名规则: 设置md文件的头部信息 是否显示csdn中的锚点"文章目录"字样,以及下面具体的锚点 默认false(因为csdn中是集 ...
- Python爬虫简单实现CSDN博客文章标题列表
Python爬虫简单实现CSDN博客文章标题列表 操作步骤: 分析接口,怎么获取数据? 模拟接口,尝试提取数据 封装接口函数,实现函数调用. 1.分析接口 打开Chrome浏览器,开启开发者工具(F1 ...
- Python爬取CSDN博客文章
0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...
- JAVA爬虫挖取CSDN博客文章
开门见山,看看这个教程的主要任务,就去csdn博客,挖取技术文章,我以<第一行代码–安卓>的作者为例,将他在csdn发表的额博客信息都挖取出来.因为郭神是我在大学期间比较崇拜的对象之一.他 ...
- CSDN博客文章的备份及导出电子书CHM
需要用到的工具集合下载:http://download.csdn.net/source/2881423 在CSDN.百度等写博客文章的应该很多,很多时候担心服务器有一天突然挂了,或者担心自己的号被封了 ...
- Hello Python!用 Python 写一个抓取 CSDN 博客文章的简单爬虫
网络上一提到 Python,总会有一些不知道是黑还是粉的人大喊着:Python 是世界上最好的语言.最近利用业余时间体验了下 Python 语言,并写了个爬虫爬取我 csdn 上关注的几个大神的博客, ...
- 使用word写CSDN博客文章
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- 从CSDN博客下载的图片如何无损去水印
如果你想下载别人CSDN博客文章中很好看的图片,但却有水印 想要下载去水印的图片,可以先鼠标右击该图片,选择复制图片地址 https://img-blog.csdnimg.cn/20200916140 ...
- spider csdn博客和quantstart文章
spider csdn博客和quantstart文章 功能 提取csdn博客文章 提取quantstart.com 博客文章, Micheal Hall-Moore 创办的网站 特色功能就是: 想把原 ...
随机推荐
- 【WPF】实现动态切换语言(国际化)以及动态换肤功能
前言:以下内容,手把手从搭建到最终实现,完成多语言切换以及换装功能. 本地系统环境:win 10 编译器环境:VS2022 社区版 .NET 环境: .NET 6 1.新建一个WPF项目 2.新建完毕 ...
- 上K8s生产环境的准备有哪些?
文章转载自:https://mp.weixin.qq.com/s/7FhiI09xKdJXJfrf89Q-8w 在生产中运行应用程序可能很棘手.这篇文章提出了一个自以为是的清单,用于在 Kuberne ...
- MinIO 快速入门指南
官方文档地址:http://docs.minio.org.cn/docs/ MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储. 它是与 Amazon S3 云存 ...
- k8s集群中安装rook-ceph
容器的持久化存储 容器的持久化存储是保存容器存储状态的重要手段,存储插件会在容器里挂载一个基于网络或者其他机制的远程数据卷,使得在容器里创建的文件,实际上是保存在远程存储服务器上,或者以分布式的方式保 ...
- 17. Fluentd输出插件:out_copy用法详解
copy即复制,out_copy的作用就是将日志事件复制到多个输出,这样就可以对同一份日志做不同类型的分析处理. out_copy内置于Fluentd,无需单独安装. 示例配置 <match p ...
- a += 20 和 a = a+20前者不报错,后者报错的原因
我们在使用a += 20 和 a = a+20两种不同方式的赋值运算是发现尽然前者不报错,后者报错 代码示例: shot s = 5; s += 5; s = s+5; 很明显我们可以看出s = s+ ...
- PTA2022 520钻石争霸赛题解
7-1 520表白 不用说 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int max ...
- python-D3-语法入门1
Python语法注释 什么是注释 注释其实就是对一段代码的解释说明(注释是代码之母) 如何编写注释 方式1:解释说明文字前加警号 (pycharm中有快捷键ctrl+?) # 注释(单行注释) 方式2 ...
- Flink WordCount入门
下面通过一个单词统计的案例,快速上手应用 Flink,进行流处理(Streaming)和批处理(Batch) 单词统计(批处理) 引入依赖 <!--flink核心包--> <depe ...
- misc办公室爱情
隐藏文字password2 编辑 word改后缀zip解开后document.xml找到password1 编辑 True_lOve_i2_supReMe 用wbs43open+密码解密pdf ...