专栏地址 ʅ(‾◡◝)ʃ


前言

要写一个下载器,首先要实现一个接口函数,而这个函数可以对请求的数据进行处理也就是爬虫,其次才是写图形化界面

接口的实现

其实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 中有两个有用的参数(可变化的),articleIdbloggerUserName
也就是文章id 还有用户名
所以只要知道这两个参数,那么所有的文章就可以下载了,而你访问一个博客文章的 url 是就已经包含这两个参数了
比如

https://blog.csdn.net/chouzhou9701/article/details/89339625

可以看到 chouzhou9701 就是用户名,而 后面的 89339625 就是文章的 id
所以我们写一个函数,这个函数的作用有以下几点功能:
1.将从url 获取到用户名文章的id
2.通过获提取到的这两个参数,重新构造接口
3.下载文章
代码实现
api

import requestsdef 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 downloadclass 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 函数中的内容, 注意有一个参数为 selfself.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.dataprint(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博客文章)相关推荐

  1. 【C++鼠标键盘操作】自动下载CSDN博客文章到PDF

    思路 这个方法的通用性比较差,用到了一个火狐的插件,这个插件可以将单篇csdn博客保存成pdf,如下图: 整体步骤就是,首先用java爬取我个人博客的所有链接,然后把这些链接复制到txt文档中,如下图 ...

  2. Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片

    Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片, ...

  3. C/C++ | Qt 实现爬虫功能,爬取CSDN博客文章

    话不多说,先看程序运行截图: 注意: 本人没有看过爬虫相关的书籍,第一次写这种程序,这个程序是半屌子的,原理很简单,没有学习过爬虫的朋友,也可以写. 程序思路如下: 1.下载要爬网站的页面. 2.用正 ...

  4. 如何快速转载别人的CSDN博客文章并附带格式与图片

    1.问题背景 最近在学习Git过程中想了解git reflog命令的高级用法与命令详解,于是找到了这几篇特别优秀的文章: [1]使用git reflog 命令来查看历史提交记录并使用提交记录恢复已经被 ...

  5. python+shell 备份 CSDN 博客文章,CSDN博客备份工具

    python+shell 备份 CSDN 博客文章,CSDN博客备份工具 在 csdn 写了几年的博客了.多少也积累了两三百篇博文,近日,想把自己的这些文章全部备份下来,于是开始寻找解决方案. 我找到 ...

  6. CSDN博客文章写作技巧

    CSDN博客文章写作技巧 1. CSDN博客文章段落缩进问题的解决办法 1.1 解决办法   由于在写文档的时候,段落首习惯了缩进两个字符,发现使用 Tab 键无法解决这个问题,同时使用多个空格代替的 ...

  7. 解决CSDN博客文章 保存网页到本地后,页面显示不全的问题

    更新:2018.3.29 问题 CSDN博客文章设置为新版皮肤("大白"),保存网页到本地后.打开离线保存的网页,会出现页面显示不全的问题.(或者,点击"展开阅读全文&q ...

  8. 我的第一篇CSDN博客文章

    我的第一篇CSDN博客文章 今天是2016-08-30,作为一个临近毕业的在校大学生,马上就要开始九月份的找工作了,这两年在学校里面凭借兴趣以及专业方面的点点滴滴,决定了基本就从事IT编程这方面的工作 ...

  9. 真正CSDN博客文章一键转载插件(含源码)

    插件地址:https://greasyfork.org/zh-CN/scripts/381053-csdn%E5%8D%9A%E5%AE%A2%E6%96%87%E7%AB%A0%E8%BD%AC%E ...

最新文章

  1. NLP实践:对话系统技术原理和应用
  2. 【转】How Many Boyfriends
  3. 记一次discuz修改首页图片路径问题
  4. java技术难点_Java核心技术第四章----对象与类重难点总结
  5. 自动化环境部署工具的编写
  6. 大数据技术是“地球的神经系统”
  7. 无废话Git——概念与本地服务器提交
  8. Ambari集群里操作时典型权限问题put: `/home/bigdata/1.txt': No such file or directory的解决方案(图文详解)...
  9. Race Condition是什么
  10. Atitit 项目分析与统计目录1. 静态分析+动态分析 。其中, 12. 模块分析,与模块位置idx 13. 编程语言类型与版本 13.1. 类库统记表 类型与版本 23.2. 中间
  11. C程序设计--查找(二分法查找/折半查找)
  12. 天然气压缩因子计算软件_天然气压缩机组安全阀的设置
  13. Python绘制用于学术论文投稿的黑白图片
  14. IE,谷歌访问跨域问题
  15. cos(a+b)=cosa*cosb-sina*sinb的推导过程
  16. S2SH药膳馆会员管理系统计算机专业毕业论文java毕业设计开题报告
  17. 家庭和办公路由器被劫持以发动 DDoS 攻击
  18. 城市供水管网漏损控制与实践
  19. 历经千辛万苦 阅尽科苑春色——浅议读研七件事(二)
  20. odoo定义view表自定义sql来创建表及反写操作

热门文章

  1. 秃头福音!医疗联手AI,大势所趋,破解秃头难题
  2. 用纯css3绘制的能自适应屏幕宽度的哆啦a梦动画
  3. 三相异步电机检测技术的应用研究
  4. java th标签_Thymeleaf中th:each及th:if使用方法解析
  5. 基于MFC的简易登录器
  6. spring注解事务及事务回滚失败的原因
  7. 中国移动明年推出首批5G手机,用户不应急着购买
  8. 中煤层采煤机截割部设计(论文+CAD图纸+任务书……)
  9. ubuntu 找不到mysql.h_ubuntu安装了mysql 但是编译报错 mysql.h: No such file or directory
  10. [GWCTF 2019]pyre1