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 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博客文章)相关推荐
- 【C++鼠标键盘操作】自动下载CSDN博客文章到PDF
思路 这个方法的通用性比较差,用到了一个火狐的插件,这个插件可以将单篇csdn博客保存成pdf,如下图: 整体步骤就是,首先用java爬取我个人博客的所有链接,然后把这些链接复制到txt文档中,如下图 ...
- Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片
Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片, ...
- C/C++ | Qt 实现爬虫功能,爬取CSDN博客文章
话不多说,先看程序运行截图: 注意: 本人没有看过爬虫相关的书籍,第一次写这种程序,这个程序是半屌子的,原理很简单,没有学习过爬虫的朋友,也可以写. 程序思路如下: 1.下载要爬网站的页面. 2.用正 ...
- 如何快速转载别人的CSDN博客文章并附带格式与图片
1.问题背景 最近在学习Git过程中想了解git reflog命令的高级用法与命令详解,于是找到了这几篇特别优秀的文章: [1]使用git reflog 命令来查看历史提交记录并使用提交记录恢复已经被 ...
- python+shell 备份 CSDN 博客文章,CSDN博客备份工具
python+shell 备份 CSDN 博客文章,CSDN博客备份工具 在 csdn 写了几年的博客了.多少也积累了两三百篇博文,近日,想把自己的这些文章全部备份下来,于是开始寻找解决方案. 我找到 ...
- CSDN博客文章写作技巧
CSDN博客文章写作技巧 1. CSDN博客文章段落缩进问题的解决办法 1.1 解决办法 由于在写文档的时候,段落首习惯了缩进两个字符,发现使用 Tab 键无法解决这个问题,同时使用多个空格代替的 ...
- 解决CSDN博客文章 保存网页到本地后,页面显示不全的问题
更新:2018.3.29 问题 CSDN博客文章设置为新版皮肤("大白"),保存网页到本地后.打开离线保存的网页,会出现页面显示不全的问题.(或者,点击"展开阅读全文&q ...
- 我的第一篇CSDN博客文章
我的第一篇CSDN博客文章 今天是2016-08-30,作为一个临近毕业的在校大学生,马上就要开始九月份的找工作了,这两年在学校里面凭借兴趣以及专业方面的点点滴滴,决定了基本就从事IT编程这方面的工作 ...
- 真正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 ...
最新文章
- NLP实践:对话系统技术原理和应用
- 【转】How Many Boyfriends
- 记一次discuz修改首页图片路径问题
- java技术难点_Java核心技术第四章----对象与类重难点总结
- 自动化环境部署工具的编写
- 大数据技术是“地球的神经系统”
- 无废话Git——概念与本地服务器提交
- Ambari集群里操作时典型权限问题put: `/home/bigdata/1.txt': No such file or directory的解决方案(图文详解)...
- Race Condition是什么
- Atitit 项目分析与统计目录1. 静态分析+动态分析 。其中, 12. 模块分析,与模块位置idx 13. 编程语言类型与版本 13.1. 类库统记表 类型与版本 23.2. 中间
- C程序设计--查找(二分法查找/折半查找)
- 天然气压缩因子计算软件_天然气压缩机组安全阀的设置
- Python绘制用于学术论文投稿的黑白图片
- IE,谷歌访问跨域问题
- cos(a+b)=cosa*cosb-sina*sinb的推导过程
- S2SH药膳馆会员管理系统计算机专业毕业论文java毕业设计开题报告
- 家庭和办公路由器被劫持以发动 DDoS 攻击
- 城市供水管网漏损控制与实践
- 历经千辛万苦 阅尽科苑春色——浅议读研七件事(二)
- odoo定义view表自定义sql来创建表及反写操作
热门文章
- 秃头福音!医疗联手AI,大势所趋,破解秃头难题
- 用纯css3绘制的能自适应屏幕宽度的哆啦a梦动画
- 三相异步电机检测技术的应用研究
- java th标签_Thymeleaf中th:each及th:if使用方法解析
- 基于MFC的简易登录器
- spring注解事务及事务回滚失败的原因
- 中国移动明年推出首批5G手机,用户不应急着购买
- 中煤层采煤机截割部设计(论文+CAD图纸+任务书……)
- ubuntu 找不到mysql.h_ubuntu安装了mysql 但是编译报错 mysql.h: No such file or directory
- [GWCTF 2019]pyre1