-
Python入门到实战星选课
2020-08-10 13:48:27Python入门到实战星选课 -
《Qt 实战一二三》
2015-12-12 18:58:04Qt 基础与实战,主要包含:环境搭建、信号槽、事件机制、数据类型、常用部件/布局、对话框、QPainter 绘图等内容。“我们来自 Qt 技术交流,我们来自 QML 技术交流”,不管你是笑了,还是笑了,反正我们是认真的。我们就是要找寻一种 Hold 不住的状态,来开始每一天的点滴分享,我们是一个有激情,有态度的部队。
但是我们还是我们,我们只是多了一份责任。古语有云:“不积跬步无以至千里,不积小流无以成江海”,所以每一个伟大事务的产生都不是一蹴而就的。现在我们要立足眼下,把第一站放在地球,“《Qt 实战一二三》”应运而生。
这里,我们不扯淡,只谈技术、只交流、只分享。大胆的把你的问题、建议与意见说出来!不说,憋坏了怎么办?
| 版权声明:一去、二三里,未经博主允许不得转载。
关于命名
关于 Qt 系列命名,之前想了很久,想给它一个属于它自己的名字,但妄图用几个字来概括一个系列的难度,几乎不亚于重写几篇文章。
早上,把我的想法说出来的时候,foruok 大神的一句“《Qt 实战一二三》”让我灵光一闪,那一刹那,说是醍醐灌顶也不为过,我和小伙伴们几乎同时兴奋的说,不如就用这个。
多美妙的一句话,和我的名字一样 - 一去丶二三里,这几乎可以用来概括所有对于 Qt 实战方面的大大小小的困惑和不解。
《Qt 实战一二三》
以下是《Qt 实战一二三》系列的目录结构,所有的代码都经过严格自测,并通过。我会尽可能的把所有的源码都放出来,供大家方便学习、交流。。。
项目实战部分 - 主要是讲解平时在项目中遇到的大大小小的技术点。
你关心的,才是我要分享的!!!
资料大全
环境与工具
- 关于 Qt
- Qt 环境搭建(Visual Studio)
- Qt 环境搭建(Qt Creator)
- Qt5.7 + VS2015 环境搭建
- Linux 下搭建 Qt 环境
- Qt Creator 快捷键
- Qt 之命令行编译(nmake)
- Qt Creator 介绍
- Qt Assistant 介绍
- Qt Linguist 介绍
- Qt 之 pro 配置多个子工程/子模块
- Qt 之输出控制
- 查看和调试 Qt 源码
- Qt Creator 添加自定义注释
qmake
对象 & 属性 & 事件
基本部件
- QWidget、QDialog、QMainWindow 的异同点
- Qt 之模式、非模式、半模式对话框
- Qt 之 QLabel
- Qt 之 QLCDNumber
- Qt 之 QAbstractButton
- Qt 之 QPushButton
- Qt 之 QToolButton
- Qt 之 QCheckBox
- Qt 之 QRadioButton
- Qt 之 QLineEdit
- Qt 之 QSpinBox 和 QDoubleSpinBox
- Qt 之 QSlider
- Qt 之 QProgressBar
- Qt 之 QDateTimeEdit
- Qt 之 QDateEdit和QTimeEdit
- Qt 之 QScrollArea
- Qt 之 QToolBox
- Qt 之 QSystemTrayIcon
布局管理器
- Qt 之布局管理器
- Qt 之自定义布局管理器(QCardLayout)
- Qt 之自定义布局管理器(QFlowLayout)
- Qt 之自定义布局管理器(QBorderLayout)
- Qt 之手动布局
- Qt 之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)
- Qt 之格栅布局(QGridLayout)
- Qt 之表单布局(QFormLayout)
- Qt 之 QStackedLayout
- Qt 之 QStackedWidget
- Qt 之 QSpacerItem
- Qt 之 QSizePolicy
高级控件
对话框
国际化和翻译
数据类型与数据操作类
- Qt 之 QFileSystemWatcher
- Qt 之 QDesktopServices
- Qt 之 QTimer
- Qt 之 QFileIconProvider
- Qt 之 QTemporaryFile
- Qt 之 QCryptographicHash
- Qt 之 qInstallMessageHandler(输出详细日志)
- Qt 之 qInstallMessageHandler(重定向至文件)
- Qt 之 qSetMessagePattern
数据存储与获取
事件
QPainter 2D 图形
- Qt 之坐标系统
- Qt 之图形(QPainter 的基本绘图)
- Qt 之图形(渐变填充)
- Qt 之图形(转换)
- Qt 之图形(绘制文本)
- Qt 之图形(QPainterPath)
- Qt 之描绘轮廓
- Qt 之图形(组合)
- Qt 之图形(绘制漂亮的圆弧)
- Qt 之图形(简笔画-绘制漂亮的西瓜)
- Qt 之图形(简笔画-绘制卡通蚂蚁)
- Qt 之绘制时钟
- Qt 之绘制闪烁文本
Images
进程间通信
自定义界面
- Qt 之自定义界面(实现无边框、可移动)
- Qt 之自定义界面(添加自定义标题栏)
- Qt 之自定义界面(窗体缩放)
- Qt 之自定义界面(窗体缩放-跨平台终极版)
- Qt 之窗体拖拽、自适应分辨率、自适应大小
- Qt 之自定义界面(QMessageBox)
- Qt 之自定义界面(右下角冒泡)
- Qt 之自定义控件(开关按钮)
- Qt 之透明提示框
- Qt 之自定义搜索框
Third-Party
- Qt 使用第三方库
- 基于 Qt 的图表库
- Qt 之 QuaZIP(zip压缩/解压缩)
- Qt 之 OpenSSL
- Qt 之 QtSoap(访问WebService)
- Qt 之二维码扫描
- Qt 之 QCustomPlot(图形库)
- Qt 之 QRoundProgressBar(圆形进度条)
- Qt 之 QProgressIndicator(等待提示框)
- Qt 之 QScintilla(源代码编辑器)
项目实战
- Qt 之 Tab 键切换焦点顺序
- Qt 之密码框不可选中、复制、粘贴、无右键菜单等
- QDialog 之屏蔽 Esc 键
- Qt 之命令行参数
- Qt 之重启应用程序
- Qt 之 QFileIconProvider(根据扩展名获取文件图标、类型)
- Qt 之根据扩展名获取文件图标、类型
- Qt 之启动外部程序
- Qt 之提取 exe/dll/icon 文件图标
- Qt 之运行一个实例进程
- Qt 之 QTableView添加复选框(QAbstractTableModel)
- Qt 之 QTableView 添加复选框(QAbstractItemDelegate)
- Qt 之 QHeaderView 添加复选框
- Qt 之 QHeaderView 排序
- Qt 之 QHeaderView自定义排序(QSortFilterProxyModel)
- Qt 之 QHeaderView 自定义排序(终极版)
- Qt 之 QHeaderView 自定义排序(获取正确的 QModelIndex)
- Qt 之 QTableView 显示富文本
- Qt 之模型/视图(自定义进度条)
- Qt 之模型/视图(自定义按钮)
- Qt 之显示网络图片
- Qt 之滚动字幕
- Qt 之保持 GUI 响应
- Qt 之设置应用程序图标
- Qt 之保存/恢复窗口的几何形状
- Qt 之等待提示框(QPropertyAnimation)
- Qt 之等待提示框(QTimer)
- Qt 之等待提示框(QMovie)
- Qt 之字典划词
- Qt 之镜像旋转
- Qt 之窗体透明
Qt 新版本
共同进步
进步始于交流,收获源于分享。希望一起走过的日子里,我们能够更多地交流心得,共同进步 - You are not alone。
亲们,记住呦,后期分享的所有内容都可以随时交流。欢迎大家留言,不要吝啬你们的建议与意见,收到后我会第一时间进行回复。
青春不老,奋斗不止!纯正开源之美,有趣、好玩、靠谱。。。
持续更新中…
-
Python数据分析与机器学习实战
2017-01-24 10:18:45Python数据分析与机器学习实战教程,该课程精心挑选真实的数据集为案例,通过python数据科学库numpy,pandas,matplot结合机器学习库scikit-learn完成一些列的机器学习案例。课程以实战为基础,所有课时都结合代码演示... -
Python3网络爬虫快速入门实战解析
2017-09-28 14:48:41本文以实战为主,阅读过程如稍有不适,还望多加练习。 本文的实战内容有:网络小说下载(静态网站)、优美壁纸下载(动态网站)、爱奇艺VIP视频下载 PS:本文为Gitchat线上分享文章,该文章发布时间为2017年09月19日。转载请注明作者和出处: http://blog.csdn.net/c406495762
Github代码获取:https://github.com/Jack-Cherish/python-spider
Python版本: Python3.x
运行平台: Windows
IDE: Sublime text3更多教程,请查看:https://cuijiahua.com/blog/spider/
一 前言
**强烈建议:**请在电脑的陪同下,阅读本文。本文以实战为主,阅读过程如稍有不适,还望多加练习。
本文的实战内容有:- 网络小说下载(静态网站)
- 优美壁纸下载(动态网站)
- 视频下载
2020年,更多精彩内容,尽在微信公众号,欢迎您的关注:
二 网络爬虫简介
网络爬虫,也叫网络蜘蛛(Web Spider)。它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网站链接。比如:https://www.baidu.com/,它就是一个URL。
在讲解爬虫内容之前,我们需要先学习一项写爬虫的必备技能:审查元素(如果已掌握,可跳过此部分内容)。
1 审查元素
在浏览器的地址栏输入URL地址,在网页处右键单击,找到检查。(不同浏览器的叫法不同,Chrome浏览器叫做检查,Firefox浏览器叫做查看元素,但是功能都是相同的)
我们可以看到,右侧出现了一大推代码,这些代码就叫做HTML。什么是HTML?举个容易理解的例子:我们的基因决定了我们的原始容貌,服务器返回的HTML决定了网站的原始容貌。
为啥说是原始容貌呢?因为人可以整容啊!扎心了,有木有?那网站也可以"整容"吗?可以!请看下图:
我能有这么多钱吗?显然不可能。我是怎么给网站"整容"的呢?就是通过修改服务器返回的HTML信息。我们每个人都是"整容大师",可以修改页面信息。我们在页面的哪个位置点击审查元素,浏览器就会为我们定位到相应的HTML位置,进而就可以在本地更改HTML信息。
**再举个小例子:**我们都知道,使用浏览器"记住密码"的功能,密码会变成一堆小黑点,是不可见的。可以让密码显示出来吗?可以,只需给页面"动个小手术"!以淘宝为例,在输入密码框处右键,点击检查。
可以看到,浏览器为我们自动定位到了相应的HTML位置。将下图中的password属性值改为text属性值(直接在右侧代码处修改):
我们让浏览器记住的密码就这样显现出来了:
说这么多,什么意思呢?**浏览器就是作为客户端从服务器端获取信息,然后将信息解析,并展示给我们的。**我们可以在本地修改HTML信息,为网页"整容",但是我们修改的信息不会回传到服务器,服务器存储的HTML信息不会改变。刷新一下界面,页面还会回到原本的样子。这就跟人整容一样,我们能改变一些表面的东西,但是不能改变我们的基因。
2 简单实例
网络爬虫的第一步就是根据URL,获取网页的HTML信息。在Python3中,可以使用urllib.request和requests进行网页爬取。
- urllib库是python内置的,无需我们额外安装,只要安装了Python就可以使用这个库。
- requests库是第三方库,需要我们自己安装。
requests库强大好用,所以本文使用requests库获取网页的HTML信息。requests库的github地址:https://github.com/requests/requests
(1) requests安装
在cmd中,使用如下指令安装requests:
pip install requests
或者:
easy_install requests
(2) 简单实例
requests库的基础方法如下:
官方中文教程地址:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
requests库的开发者为我们提供了详细的中文教程,查询起来很方便。本文不会对其所有内容进行讲解,摘取其部分使用到的内容,进行实战说明。
首先,让我们看下requests.get()方法,它用于向服务器发起GET请求,不了解GET请求没有关系。我们可以这样理解:get的中文意思是得到、抓住,那这个requests.get()方法就是从服务器得到、抓住数据,也就是获取数据。让我们看一个例子(以 www.gitbook.cn为例)来加深理解:
# -*- coding:UTF-8 -*- import requests if __name__ == '__main__': target = 'http://gitbook.cn/' req = requests.get(url=target) print(req.text)
requests.get()方法必须设置的一个参数就是url,因为我们得告诉GET请求,我们的目标是谁,我们要获取谁的信息。运行程序看下结果:
左侧是我们程序获得的结果,右侧是我们在www.gitbook.cn网站审查元素获得的信息。我们可以看到,我们已经顺利获得了该网页的HTML信息。这就是一个最简单的爬虫实例,可能你会问,我只是爬取了这个网页的HTML信息,有什么用呢?客官稍安勿躁,接下来进入我们的实战正文。
三 爬虫实战
1 小说下载
(1) 实战背景
小说网站-笔趣看:URL:http://www.biqukan.com/
本次实战就是从该网站爬取并保存一本名为《一念永恒》的小说。
(2) 小试牛刀
我们先看下《一念永恒》小说的第一章内容,URL:http://www.biqukan.com/1_1094/5403177.html
我们先用已经学到的知识获取HTML信息试一试,编写代码如下:
# -*- coding:UTF-8 -*- import requests if __name__ == '__main__': target = 'http://www.biqukan.com/1_1094/5403177.html' req = requests.get(url=target) print(req.text)
运行代码,可以看到如下结果:
可以看到,我们很轻松地获取了HTML信息。但是,很显然,很多信息是我们不想看到的,我们只想获得如右侧所示的正文内容,我们不关心div、br这些html标签。如何把正文内容从这些众多的html标签中提取出来呢?这就是本次实战的主要内容。
###(3)Beautiful Soup
**爬虫的第一步,获取整个网页的HTML信息,我们已经完成。接下来就是爬虫的第二步,解析HTML信息,提取我们感兴趣的内容。**对于本小节的实战,我们感兴趣的内容就是文章的正文。提取的方法有很多,例如使用正则表达式、Xpath、Beautiful Soup等。对于初学者而言,最容易理解,并且使用简单的方法就是使用Beautiful Soup提取感兴趣内容。
Beautiful Soup的安装方法和requests一样,使用如下指令安装(也是二选一):
- pip install beautifulsoup4
- easy_install beautifulsoup4
一个强大的第三方库,都会有一个详细的官方文档。我们很幸运,Beautiful Soup也是有中文的官方文档。
URL:http://beautifulsoup.readthedocs.io/zh_CN/latest/
同理,我会根据实战需求,讲解Beautiful Soup库的部分使用方法,更详细的内容,请查看官方文档。
现在,我们使用已经掌握的审查元素方法,查看一下我们的目标页面,你会看到如下内容:
不难发现,文章的所有内容都放在了一个名为div的“东西下面”,这个"东西"就是html标签。HTML标签是HTML语言中最基本的单位,HTML标签是HTML最重要的组成部分。不理解,没关系,我们再举个简单的例子:
一个女人的包包里,会有很多东西,她们会根据自己的习惯将自己的东西进行分类放好。镜子和口红这些会经常用到的东西,会归放到容易拿到的外侧口袋里。那些不经常用到,需要注意安全存放的证件会放到不容易拿到的里侧口袋里。
html标签就像一个个“口袋”,每个“口袋”都有自己的特定功能,负责存放不同的内容。显然,上述例子中的div标签下存放了我们关心的正文内容。这个div标签是这样的:
<div id="content", class="showtxt">
细心的朋友可能已经发现,除了div字样外,还有id和class。id和class就是div标签的属性,content和showtxt是属性值,一个属性对应一个属性值。这东西有什么用?它是用来区分不同的div标签的,因为div标签可以有很多,我们怎么加以区分不同的div标签呢?就是通过不同的属性值。
仔细观察目标网站一番,我们会发现这样一个事实:class属性为showtxt的div标签,独一份!这个标签里面存放的内容,是我们关心的正文部分。
知道这个信息,我们就可以使用Beautiful Soup提取我们想要的内容了,编写代码如下:
# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests if __name__ == "__main__": target = 'http://www.biqukan.com/1_1094/5403177.html' req = requests.get(url = target) html = req.text bf = BeautifulSoup(html) texts = bf.find_all('div', class_ = 'showtxt') print(texts)
在解析html之前,我们需要创建一个Beautiful Soup对象。BeautifulSoup函数里的参数就是我们已经获得的html信息。然后我们使用find_all方法,获得html信息中所有class属性为showtxt的div标签。find_all方法的第一个参数是获取的标签名,第二个参数class_是标签的属性,为什么不是class,而带了一个下划线呢?因为python中class是关键字,为了防止冲突,这里使用class_表示标签的class属性,class_后面跟着的showtxt就是属性值了。看下我们要匹配的标签格式:
<div id="content", class="showtxt">
这样对应的看一下,是不是就懂了?可能有人会问了,为什么不是find_all(‘div’, id = ‘content’, class_ = ‘showtxt’)?这样其实也是可以的,属性是作为查询时候的约束条件,添加一个class_='showtxt’条件,我们就已经能够准确匹配到我们想要的标签了,所以我们就不必再添加id这个属性了。运行代码查看我们匹配的结果:
我们可以看到,我们已经顺利匹配到我们关心的正文内容,但是还有一些我们不想要的东西。比如div标签名,br标签,以及各种空格。怎么去除这些东西呢?我们继续编写代码:
# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests if __name__ == "__main__": target = 'http://www.biqukan.com/1_1094/5403177.html' req = requests.get(url = target) html = req.text bf = BeautifulSoup(html) texts = bf.find_all('div', class_ = 'showtxt') print(texts[0].text.replace('\xa0'*8,'\n\n'))
find_all匹配的返回的结果是一个列表。提取匹配结果后,使用text属性,提取文本内容,滤除br标签。随后使用replace方法,剔除空格,替换为回车进行分段。 在html中是用来表示空格的。replace(’\xa0’*8,’\n\n’)就是去掉下图的八个空格符号,并用回车代替:
程序运行结果如下:
可以看到,我们很自然的匹配到了所有正文内容,并进行了分段。我们已经顺利获得了一个章节的内容,要想下载正本小说,我们就要获取每个章节的链接。我们先分析下小说目录:
URL:http://www.biqukan.com/1_1094/
通过审查元素,我们发现可以发现,这些章节都存放在了class属性为listmain的div标签下,选取部分html代码如下:
<div class="listmain"> <dl> <dt>《一念永恒》最新章节列表</dt> <dd><a href="/1_1094/15932394.html">第1027章 第十道门</a></dd> <dd><a href="/1_1094/15923072.html">第1026章 绝伦道法!</a></dd> <dd><a href="/1_1094/15921862.html">第1025章 长生灯!</a></dd> <dd><a href="/1_1094/15918591.html">第1024章 一目晶渊</a></dd> <dd><a href="/1_1094/15906236.html">第1023章 通天道门</a></dd> <dd><a href="/1_1094/15903775.html">第1022章 四大凶兽!</a></dd> <dd><a href="/1_1094/15890427.html">第1021章 鳄首!</a></dd> <dd><a href="/1_1094/15886627.html">第1020章 一触即发!</a></dd> <dd><a href="/1_1094/15875306.html">第1019章 魁祖的气息!</a></dd> <dd><a href="/1_1094/15871572.html">第1018章 绝望的魁皇城</a></dd> <dd><a href="/1_1094/15859514.html">第1017章 我还是恨你!</a></dd> <dd><a href="/1_1094/15856137.html">第1016章 从来没有世界之门!</a></dd> <dt>《一念永恒》正文卷</dt> <dd><a href="/1_1094/5386269.html">外传1 柯父。</a></dd> <dd><a href="/1_1094/5386270.html">外传2 楚玉嫣。</a></dd> <dd><a href="/1_1094/5386271.html">外传3 鹦鹉与皮冻。</a></dd> <dd><a href="/1_1094/5403177.html">第一章 他叫白小纯</a></dd> <dd><a href="/1_1094/5428081.html">第二章 火灶房</a></dd> <dd><a href="/1_1094/5433843.html">第三章 六句真言</a></dd> <dd><a href="/1_1094/5447905.html">第四章 炼灵</a></dd> </dl> </div>
在分析之前,让我们先介绍一个概念:父节点、子节点、孙节点。
<div>
和</div>
限定了<div>
标签的开始和结束的位置,他们是成对出现的,有开始位置,就有结束位置。我们可以看到,在<div>
标签包含<dl>
标签,那这个<dl>
标签就是<div>
标签的子节点,<dl>
标签又包含<dt>
标签和<dd>
标签,那么<dt>
标签和<dd>
标签就是<div>
标签的孙节点。有点绕?那你记住这句话:谁包含谁,谁就是谁儿子!**他们之间的关系都是相对的。**比如对于
<dd>
标签,它的子节点是<a>
标签,它的父节点是<dl>
标签。这跟我们人是一样的,上有老下有小。看到这里可能有人会问,这有好多
<dd>
标签和<a>
标签啊!不同的<dd>
标签,它们是什么关系啊?显然,兄弟姐妹喽!我们称它们为兄弟结点。
好了,概念明确清楚,接下来,让我们分析一下问题。我们看到每个章节的名字存放在了<a>
标签里面。<a>
标签还有一个href属性。这里就不得不提一下<a>
标签的定义了,<a>
标签定义了一个超链接,用于从一张页面链接到另一张页面。<a>
标签最重要的属性是 href 属性,它指示链接的目标。我们将之前获得的第一章节的URL和
<a>
标签对比看一下:http://www.biqukan.com/1_1094/5403177.html <a href="/1_1094/5403177.html">第一章 他叫白小纯</a>
不难发现,
<a>
标签中href属性存放的属性值/1_1094/5403177.html是章节URLhttp://www.biqukan.com/1_1094/5403177.html的后半部分。其他章节也是如此!那这样,我们就可以根据<a>
标签的href属性值获得每个章节的链接和名称了。总结一下:小说每章的链接放在了class属性为listmain的
<div>
标签下的<a>
标签中。链接具体位置放在html->body->div->dl->dd->a的href属性中。先匹配class属性为listmain的<div>
标签,再匹配<a>
标签。编写代码如下:# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests if __name__ == "__main__": target = 'http://www.biqukan.com/1_1094/' req = requests.get(url = target) html = req.text div_bf = BeautifulSoup(html) div = div_bf.find_all('div', class_ = 'listmain') print(div[0])
还是使用find_all方法,运行结果如下:
很顺利,接下来再匹配每一个
<a>
标签,并提取章节名和章节文章。如果我们使用Beautiful Soup匹配到了下面这个<a>
标签,如何提取它的href属性和<a>
标签里存放的章节名呢?<a href="/1_1094/5403177.html">第一章 他叫白小纯</a>
方法很简单,对Beautiful Soup返回的匹配结果a,使用a.get(‘href’)方法就能获取href的属性值,使用a.string就能获取章节名,编写代码如下:
# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests if __name__ == "__main__": server = 'http://www.biqukan.com/' target = 'http://www.biqukan.com/1_1094/' req = requests.get(url = target) html = req.text div_bf = BeautifulSoup(html) div = div_bf.find_all('div', class_ = 'listmain') a_bf = BeautifulSoup(str(div[0])) a = a_bf.find_all('a') for each in a: print(each.string, server + each.get('href'))
因为find_all返回的是一个列表,里边存放了很多的
<a>
标签,所以使用for循环遍历每个<a>
标签并打印出来,运行结果如下。最上面匹配的一千多章的内容是最新更新的12章节的链接。这12章内容会和下面的重复,所以我们要滤除,除此之外,还有那3个外传,我们也不想要。这些都简单地剔除就好。
###(3)整合代码
每个章节的链接、章节名、章节内容都有了。接下来就是整合代码,将获得内容写入文本文件存储就好了。编写代码如下:
# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests, sys """ 类说明:下载《笔趣看》网小说《一念永恒》 Parameters: 无 Returns: 无 Modify: 2017-09-13 """ class downloader(object): def __init__(self): self.server = 'http://www.biqukan.com/' self.target = 'http://www.biqukan.com/1_1094/' self.names = [] #存放章节名 self.urls = [] #存放章节链接 self.nums = 0 #章节数 """ 函数说明:获取下载链接 Parameters: 无 Returns: 无 Modify: 2017-09-13 """ def get_download_url(self): req = requests.get(url = self.target) html = req.text div_bf = BeautifulSoup(html) div = div_bf.find_all('div', class_ = 'listmain') a_bf = BeautifulSoup(str(div[0])) a = a_bf.find_all('a') self.nums = len(a[15:]) #剔除不必要的章节,并统计章节数 for each in a[15:]: self.names.append(each.string) self.urls.append(self.server + each.get('href')) """ 函数说明:获取章节内容 Parameters: target - 下载连接(string) Returns: texts - 章节内容(string) Modify: 2017-09-13 """ def get_contents(self, target): req = requests.get(url = target) html = req.text bf = BeautifulSoup(html) texts = bf.find_all('div', class_ = 'showtxt') texts = texts[0].text.replace('\xa0'*8,'\n\n') return texts """ 函数说明:将爬取的文章内容写入文件 Parameters: name - 章节名称(string) path - 当前路径下,小说保存名称(string) text - 章节内容(string) Returns: 无 Modify: 2017-09-13 """ def writer(self, name, path, text): write_flag = True with open(path, 'a', encoding='utf-8') as f: f.write(name + '\n') f.writelines(text) f.write('\n\n') if __name__ == "__main__": dl = downloader() dl.get_download_url() print('《一年永恒》开始下载:') for i in range(dl.nums): dl.writer(dl.names[i], '一念永恒.txt', dl.get_contents(dl.urls[i])) sys.stdout.write(" 已下载:%.3f%%" % float(i/dl.nums) + '\r') sys.stdout.flush() print('《一年永恒》下载完成')
很简单的程序,单进程跑,没有开进程池。下载速度略慢,喝杯茶休息休息吧。代码运行效果如下图所示:
2 优美壁纸下载
###(1)实战背景
已经会爬取文字了,是不是感觉爬虫还是蛮好玩的呢?接下来,让我们进行一个进阶实战,了解一下反爬虫。
URL:https://unsplash.com/
看一看这些优美的壁纸,这个网站的名字叫做Unsplash,免费高清壁纸分享网是一个坚持每天分享高清的摄影图片的站点,每天更新一张高质量的图片素材,全是生活中的景象作品,清新的生活气息图片可以作为桌面壁纸也可以应用于各种需要的环境。
看到这么优美的图片,我的第一反应就是想收藏一些,作为知乎文章的题图再好不过了。每张图片我都很喜欢,批量下载吧,不多爬,就下载50张好了。
###(2)实战进阶
我们已经知道了每个html标签都有各自的功能。
<a>
标签存放一下超链接,图片存放在哪个标签里呢?html规定,图片统统给我放到<img>
标签中!既然这样,我们截取就Unsplash网站中的一个<img>
标签,分析一下:<img alt="Snow-capped mountain slopes under blue sky" src="https://images.unsplash.com/photo-1428509774491-cfac96e12253?dpr=1&auto=compress,format&fit=crop&w=360&h=240&q=80&cs=tinysrgb&crop=" class="cV68d" style="width: 220px; height: 147px;">
可以看到,
<img>
标签有很多属性,有alt、src、class、style属性,其中src属性存放的就是我们需要的图片保存地址,我们根据这个地址就可以进行图片的下载。那么,让我们先捋一捋这个过程:
- 使用requeusts获取整个网页的HTML信息;
- 使用Beautiful Soup解析HTML信息,找到所有
<img>
标签,提取src属性,获取图片存放地址; - 根据图片存放地址,下载图片。
我们信心满满地按照这个思路爬取Unsplash试一试,编写代码如下:
# -*- coding:UTF-8 -*- import requests if __name__ == '__main__': target = 'https://unsplash.com/' req = requests.get(url=target) print(req.text)
按照我们的设想,我们应该能找到很多
<img>
标签。但是我们发现,除了一些<script>
标签和一些看不懂的代码之外,我们一无所获,一个<img>
标签都没有!跟我们在网站审查元素的结果完全不一样,这是为什么?**答案就是,这个网站的所有图片都是动态加载的!**网站有静态网站和动态网站之分,上一个实战爬取的网站是静态网站,而这个网站是动态网站,动态加载有一部分的目的就是为了反爬虫。
对于什么是动态加载,你可以这样理解:我们知道化妆术学的好,贼厉害,可以改变一个人的容貌。相应的,动态加载用的好,也贼厉害,可以改变一个网站的容貌。
动态网站使用动态加载常用的手段就是通过调用JavaScript来实现的。怎么实现JavaScript动态加载,我们不必深究,我们只要知道,动态加载的JavaScript脚本,就像化妆术需要用的化妆品,五花八门。有粉底、口红、睫毛膏等等,它们都有各自的用途。动态加载的JavaScript脚本也一样,一个动态加载的网站可能使用很多JavaScript脚本,我们只要找到负责动态加载图片的JavaScript脚本,不就找到我们需要的链接了吗?
对于初学者,我们不必看懂JavaScript执行的内容是什么,做了哪些事情,因为我们有强大的抓包工具,它自然会帮我们分析。这个强大的抓包工具就是Fiddler:
URL:http://www.telerik.com/fiddler
PS:也可以使用浏览器自带的Networks,但是我更推荐这个软件,因为它操作起来更高效。
安装方法很简单,傻瓜式安装,一直下一步即可,对于经常使用电脑的人来说,应该没有任何难度。
这个软件的使用方法也很简单,打开软件,然后用浏览器打开我们的目标网站,以Unsplash为例,抓包结果如下:
我们可以看到,上图左侧红框处是我们的GET请求的地址,就是网站的URL,右下角是服务器返回的信息,我们可以看到,这些信息也是我们上一个程序获得的信息。这个不是我们需要的链接,我们继续往下看。
我们发现上图所示的就是一个JavaScript请求,看右下侧服务器返回的信息是一个json格式的数据。这里面,就有我们需要的内容。我们局部放大看一下:
这是Fiddler右侧的信息,上面是请求的Headers信息,包括这个Javascript的请求地 址:http://unsplash.com/napi/feeds/home,其他信息我们先不管,我们看看下面的内容。里面有很多图片的信息,包括图片的id,图片的大小,图片的链接,还有下一页的地址。这个脚本以json格式存储传输的数据,json格式是一种轻量级的数据交换格式,起到封装数据的作用,易于人阅读和编写,同时也易于机器解析和生成。这么多链接,可以看到图片的链接有很多,根据哪个链接下载图片呢?先别急,让我们继续分析:
在这个网站,我们可以按这个按钮进行图片下载。我们抓包分下下这个动作,看看发送了哪些请求。
https://unsplash.com/photos/1PrQ2mHW-Fo/download?force=true https://unsplash.com/photos/JX7nDtafBcU/download?force=true https://unsplash.com/photos/HCVbP3zqX4k/download?force=true
通过Fiddler抓包,我们发现,点击不同图片的下载按钮,GET请求的地址都是不同的。但是它们很有规律,就是中间有一段代码是不一样的,其他地方都一样。中间那段代码是不是很熟悉?没错,它就是我们之前抓包分析得到json数据中的照片的id。我们只要解析出每个照片的id,就可以获得图片下载的请求地址,然后根据这个请求地址,我们就可以下载图片了。那么,现在的首要任务就是解析json数据了。
json格式的数据也是分层的。可以看到next_page里存放的是下一页的请求地址,很显然Unsplash下一页的内容,也是动态加载的。在photos下面的id里,存放着图片的id,这个就是我们需要获得的图片id号。
怎么编程提取这些json数据呢?我们也是分步完成:
- 获取整个json数据
- 解析json数据
编写代码,尝试获取json数据:
# -*- coding:UTF-8 -*- import requests if __name__ == '__main__': target = 'http://unsplash.com/napi/feeds/home' req = requests.get(url=target) print(req.text)
很遗憾,程序报错了,问题出在哪里?通过错误信息,我们可以看到SSL认证错误,SSL认证是指客户端到服务器端的认证。一个非常简单的解决这个认证错误的方法就是设置requests.get()方法的verify参数。这个参数默认设置为True,也就是执行认证。我们将其设置为False,绕过认证不就可以了?
有想法就要尝试,编写代码如下:
# -*- coding:UTF-8 -*- import requests if __name__ == '__main__': target = 'http://unsplash.com/napi/feeds/home' req = requests.get(url=target, verify=False) print(req.text)
认证问题解决了,又有新问题了:
可以看到,我们GET请求又失败了,这是为什么?这个网站反爬虫的手段除了动态加载,还有一个反爬虫手段,那就是验证Request Headers。接下来,让我们分析下这个Requests Headers:
我截取了Fiddler的抓包信息,可以看到Requests Headers里又很多参数,有Accept、Accept-Encoding、Accept-Language、DPR、User-Agent、Viewport-Width、accept-version、Referer、x-unsplash-client、authorization、Connection、Host。它们都是什么意思呢?
专业的解释能说的太多,我挑重点:
-
User-Agent:这里面存放浏览器的信息。可以看到上图的参数值,它表示我是通过Windows的Chrome浏览器,访问的这个服务器。如果我们不设置这个参数,用Python程序直接发送GET请求,服务器接受到的User-Agent信息就会是一个包含python字样的User-Agent。如果后台设计者验证这个User-Agent参数是否合法,不让带Python字样的User-Agent访问,这样就起到了反爬虫的作用。这是一个最简单的,最常用的反爬虫手段。
-
Referer:这个参数也可以用于反爬虫,它表示这个请求是从哪发出的。可以看到我们通过浏览器访问网站,这个请求是从https://unsplash.com/,这个地址发出的。如果后台设计者,验证这个参数,对于不是从这个地址跳转过来的请求一律禁止访问,这样就也起到了反爬虫的作用。
-
authorization:这个参数是基于AAA模型中的身份验证信息允许访问一种资源的行为。在我们用浏览器访问的时候,服务器会为访问者分配这个用户ID。如果后台设计者,验证这个参数,对于没有用户ID的请求一律禁止访问,这样就又起到了反爬虫的作用。
Unsplash是根据哪个参数反爬虫的呢?根据我的测试,是authorization。我们只要通过程序手动添加这个参数,然后再发送GET请求,就可以顺利访问了。怎么什么设置呢?还是requests.get()方法,我们只需要添加headers参数即可。编写代码如下:
# -*- coding:UTF-8 -*- import requests if __name__ == '__main__': target = 'http://unsplash.com/napi/feeds/home' headers = {'authorization':'your Client-ID'} req = requests.get(url=target, headers=headers, verify=False) print(req.text)
headers参数值是通过字典传入的。记得将上述代码中your Client-ID换成诸位自己抓包获得的信息。代码运行结果如下:
皇天不负有心人,可以看到我们已经顺利获得json数据了,里面有next_page和照片的id。接下来就是解析json数据。根据我们之前分析可知,next_page放在了json数据的最外侧,照片的id放在了photos->id里。我们使用json.load()方法解析数据,编写代码如下:
# -*- coding:UTF-8 -*- import requests, json if __name__ == '__main__': target = 'http://unsplash.com/napi/feeds/home' headers = {'authorization':'your Client-ID'} req = requests.get(url=target, headers=headers, verify=False) html = json.loads(req.text) next_page = html['next_page'] print('下一页地址:',next_page) for each in html['photos']: print('图片ID:',each['id'])
解析json数据很简单,跟字典操作一样,就是字典套字典。json.load()里面的参数是原始的json格式的数据。程序运行结果如下:
图片的ID已经获得了,再通过字符串处理一下,就生成了我们需要的图片下载请求地址。根据这个地址,我们就可以下载图片了。下载方式,使用直接写入文件的方法。
###(3)整合代码
每次获取链接加一个1s延时,因为人在浏览页面的时候,翻页的动作不可能太快。我们要让我们的爬虫尽量友好一些。
# -*- coding:UTF-8 -*- import requests, json, time, sys from contextlib import closing class get_photos(object): def __init__(self): self.photos_id = [] self.download_server = 'https://unsplash.com/photos/xxx/download?force=trues' self.target = 'http://unsplash.com/napi/feeds/home' self.headers = {'authorization':'Client-ID c94869b36aa272dd62dfaeefed769d4115fb3189a9d1ec88ed457207747be626'} """ 函数说明:获取图片ID Parameters: 无 Returns: 无 Modify: 2017-09-13 """ def get_ids(self): req = requests.get(url=self.target, headers=self.headers, verify=False) html = json.loads(req.text) next_page = html['next_page'] for each in html['photos']: self.photos_id.append(each['id']) time.sleep(1) for i in range(5): req = requests.get(url=next_page, headers=self.headers, verify=False) html = json.loads(req.text) next_page = html['next_page'] for each in html['photos']: self.photos_id.append(each['id']) time.sleep(1) """ 函数说明:图片下载 Parameters: 无 Returns: 无 Modify: 2017-09-13 """ def download(self, photo_id, filename): headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'} target = self.download_server.replace('xxx', photo_id) with closing(requests.get(url=target, stream=True, verify = False, headers = self.headers)) as r: with open('%d.jpg' % filename, 'ab+') as f: for chunk in r.iter_content(chunk_size = 1024): if chunk: f.write(chunk) f.flush() if __name__ == '__main__': gp = get_photos() print('获取图片连接中:') gp.get_ids() print('图片下载中:') for i in range(len(gp.photos_id)): print(' 正在下载第%d张图片' % (i+1)) gp.download(gp.photos_id[i], (i+1))
下载速度还行,有的图片下载慢是因为图片太大。可以看到右侧也打印了一些警报信息,这是因为我们没有进行SSL验证。
学会了爬取图片,简单的动态加载的网站也难不倒你了。赶快试试国内的一些图片网站吧!
3 视频下载
视频下载教程,请到这里查看:
https://cuijiahua.com/blog/2017/10/spider_tutorial_1.html
四 总结
- 本次Chat讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途!
- 爬虫时效性低,同样的思路过了一个月,甚至一周可能无法使用,但是爬取思路都是如此,完全可以自行分析。
- 本次实战代码,均已上传我的Github,欢迎Follow、Star:https://github.com/Jack-Cherish/python-spider
- 如有问题,请留言。如有错误,还望指正,谢谢!
-
FFmpeg音视频开发实战5 iOS/Android/windows/Linux
2016-05-05 00:07:11实战案例可用于 音视频处理,无人机,安防,直播等所有音视频领域。课程从Linux音视频采集,到TCP/IP UDP Socket服务器,客户端编程, 如何去定义网络通讯私有协议,x264,FFmpeg编解码,OpenGL&... -
JFinal极速开发企业实战视频教程
2016-01-22 09:18:16手把手从零开始带大家开发一个整站,通过本课程的学习可以深入理解WEB开发核心流程,深入理解JFinal核心架构设计原理,熟练使用JFinal开发项目,掌握企业实战技巧 -
零基础掌握 Python 入门到实战
2019-11-08 15:16:01【为什么学Python】 ...此外,很多学习Python的同学,未来要么从事数据科学、要么从事Web开发,不论哪个方向,都离不开对数据库的操作,本部分还会从实战的角度,介绍如何用Python语言操作常用数据库。 -
Vue + Spring Boot 项目实战(一):项目简介
2019-03-31 11:19:37Vue + Spring Boot 项目实战(四):数据库的引入 Vue + Spring Boot 项目实战(五):使用 Element 辅助前端开发 Vue + Spring Boot 项目实战(六):前端路由与登录拦截器 Vue + Spring Boot 项目实战(七):导航...
GitHub 地址:https://github.com/Antabot/White-Jotter
教程目录
第一部分
Vue + Spring Boot 项目实战(一):项目简介
Vue + Spring Boot 项目实战(二):搭建 Vue.js 项目
Vue + Spring Boot 项目实战(三):前后端结合测试(登录页面开发)
Vue + Spring Boot 项目实战(四):数据库的引入
Vue + Spring Boot 项目实战(五):使用 Element 辅助前端开发
Vue + Spring Boot 项目实战(六):前端路由与登录拦截器
Vue + Spring Boot 项目实战(七):导航栏与图书页面设计
Vue + Spring Boot 项目实战(八):数据库设计与增删改查
Vue + Spring Boot 项目实战(九):核心功能的前端实现
Vue + Spring Boot 项目实战(十):图片上传与项目的打包部署第二部分
Vue + Spring Boot 项目实战(十一):用户角色权限管理模块设计
Vue + Spring Boot 项目实战(十二):访问控制及其实现思路
Vue + Spring Boot 项目实战(十三):使用 Shiro 实现用户信息加密与登录认证
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
Vue + Spring Boot 项目实战(十五):动态加载后台菜单
Vue + Spring Boot 项目实战(十六):功能级访问控制的实现
Vue + Spring Boot 项目实战(十七):后台角色、权限与菜单分配
Vue + Spring Boot 项目实战(十八):博客功能开发第三部分
Vue + Spring Boot 项目实战(十九):Web 项目优化解决方案
Vue + Spring Boot 项目实战(二十):前端优化实战
Vue + Spring Boot 项目实战(二十一):缓存的应用开源精选
Erupt Framework:开源神器,助你无需前端代码搞定企业级后台管理系统
AntdFront: React 纯 Hook 多标签微前端管理系统解决方案前言
之前写了一些关于 Java EE 的文章,主要是理论性质的,目的是帮助大家快速了解 Java EE 的核心内容,早日爬出这个陈旧又绕不开的坑,进入 Java Web 开发的新天地。当然只有理论是不够的,有很多细节需要在实践中理解,所以我决定做一个实践教程。
这个项目十分简单,是一个纯粹为教程而生的原型,可以视为一个简陋的带后台的门户网站。所以学习时不用有什么压力,估计你们学的比我写的快很多。
我的目标是根据这个教程,可以帮助 新入行的或是刚开始学习相关技术 的小伙伴们把一个完整的项目还原出来,建立起对前后端分离式 Web 开发的整体认知。
一开始,我会尽量详细地描述开发的过程,帮助大家快速上手。随着项目进展,曾经讲到过的、比较容易搜索到的内容会适当省略。
当然,每个人的理解方式不同,可能有些重要的细节没讲到位,欢迎大家在评论区提问。受限于个人水平,一定有很多说的不对的地方,大家理解一下,友善白嫖哈。
一、项目概述
这个项目我把它命名为 “白卷”,估摸着很多同学会拿它做课程设计之类,建议你们尽量加点自己的东西在里面,直接交白卷,你的良心不会痛吗?(狗头保命)
开个玩笑,叫白卷是因为它随着教程进展逐渐完善,象征着知识的从无到有,从有到多。
另外我还给它起了一个英文名字,叫 White Jotter(白色笔记本),纯粹是为了谐音。
项目遵循敏捷开发原则,会根据大家反馈的意见整理出新的需求,动态扩展、调整、优化。初始阶段按照简单的分层架构设计,具体见下图:
-
应用架构
-
技术架构
项目需要在前后端之间不断穿梭,但在做教程的时候,我会尽量模块化地去讲解。
此外,我把教程分为了几个阶段,是为了循序渐进、由易到难地讲解知识点。
各个阶段的主要内容如下(随教程进展更新):
(一)第一部分
这个项目的第一部分以图书信息管理为示例,主要帮助大家理解以下内容:
- 如何从 0 开始搭建 Web 项目?
- 什么是前后端分离?如何实现前后端分离?
- 单页面应用有哪些特点?
- 如何在 Web 项目中使用数据库并利用网页实现增删改查?
- 在开发中如何利用各种辅助手段?
- Vue.js 的基本概念与用法
- 简单的前端页面设计
- 如何部署 Web 应用?
各个页面的效果大致如下:
登录页面:
首页:
图书馆页面:
(二)第二部分
项目的第二部分是后台管理模块的开发,主要包括以下内容:
- 后台管理模块的常见功能与布局(内容管理、用户\权限管理、运维监控)
- 用户身份验证、授权、会话管理与信息加密存储
- Shiro 框架的使用
- 实现不同粒度的访问控制(动态菜单、功能控制、数据控制)
- 结合内容管理,实现文章的编写与展示
后台基本结构如下:
后台页面效果:Dashboard(from PanJiaChen / vue-element-admin):
图书管理:
用户管理:
笔记本页面效果:文章列表:
文章详情:
(三)第三部分
第三部分是在前面的基础上,分析项目存在的不足,并对其进行由点及面的优化。
当简单的优化无法达到我们想要的目的时,就需要从架构层面进行整体的升级改造,那就是下一套教程的事情了。
(四)开源精选
在做这个项目的过程中结识了一些小伙伴,他们凭借一腔热枕坚持为开源社区做贡献,开发出了许多优秀的项目。我打算在编写教程的同时穿插对这些项目的介绍,以便让更多朋友们了解这个群体,甚至加入到新兴项目的发展壮大过程中去。这样,也算是自己尽了一份绵薄之力吧!
此外,这个教程还有姐妹篇,也就是我正在更新的信息安全方面的教程。在攻防实践阶段,会把我们这个项目当作一号靶机,对黑客技术有兴趣的同学可以走一波关注:
二、技术栈
参考技术架构图,项目使用的主要技术如下:
1.前端技术栈
1.Vue.js
2.ElementUI
3.axios2.后端技术栈
1.Spring Boot
2.Apache Shiro
3.Apache Log4j2
4.Spring Data JPA
5.Spring Data Redis3.数据库
1.MySQL
2.Redis在开发过程中还会不断用到一些新的技术,有必要的我会增添上去。
三、主要参考内容
下一篇:Vue + Spring Boot 项目实战(二):搭建 Vue.js 项目
有兴趣听我扯技术之外的故事的同学可以关注我的公众号。不定期更新,权当和大家聊聊天,图个乐子。
-
-
neo4j Docker安装详解+实战
2019-10-19 10:47:38本文介绍 Neo4j的Docker安装,增删改查及索引操作实战操作可查看另一篇文章: https://blog.csdn.net/GodDavide/article/details/102636364 一、简介 Neo4j是一个世界领先的开源图形数据库。 它是由Neo技术使用...本文介绍 Neo4j的Docker安装,增删改查及索引操作实战操作可查看另一篇文章:
https://blog.csdn.net/GodDavide/article/details/102636364
一、简介
Neo4j是一个世界领先的开源图形数据库。 它是由Neo技术使用Java语言完全开发的。
1.Neo4j的特点
- SQL就像简单的查询语言Neo4j CQL
- 它遵循属性图数据模型
- 它通过使用Apache Lucence支持索引
- 它支持UNIQUE约束
- 它包含一个用于执行CQL命令的UI:Neo4j数据浏览器
- 它支持完整的ACID(原子性,一致性,隔离性和持久性)规则
- 它采用原生图形库与本地GPE(图形处理引擎)
- 它支持查询的数据导出到JSON和XLS格式
- 它提供了REST API,可以被任何编程语言(如Java,Spring,Scala等)访问
- 它提供了可以通过任何UI MVC框架(如Node JS)访问的Java脚本
- 它支持两种Java API:Cypher API和Native Java API来开发Java应用程序
2.Ne04j的缺点
- AS的Neo4j 2.1.3最新版本,它具有支持节点数,关系和属性的限制。
- 它不支持Sharding,对超大规模数据不能适应。
- 最大的缺陷在于并非是真正的分布式,当数据量超过单机的承载能力以后很难处理。
二、安装(Docker 安装)
1、查看版本:
docker search neo4j
或者前往github或docker hub地址查看:
github:https://github.com/neo4j/docker-neo4j-publish/tree/eb6334f976453d0d8530a67b086ff96875a0742f
docker hub:https://hub.docker.com/_/neo4j?tab=tags
2、获取Docker镜像:
# 默认下载最新版本 docker pull neo4j # 或指定版本下载(我指定了版本,所以本文将以3.4版本演示) docker pull neo4j:3.4
三、运行neo4j容器,启动服务
1、直接启动
7474端口用于管理界面,7687端口用于登录连接neo4j服务端。
docker run -it -d -p 7474:7474 -p 7687:7687 neo4j:3.4
2、映射数据卷启动,方便更改数据库或者csv数据文件导入等操作
mkdir Your_neo4j_dir # 创建你的数据卷映射目录 cd Your_neo4j_dir mkdir data & mkdir import # 创建数据库映射目录及数据文件导入目录 # 启动容器 docker run -it -d -p 7474:7474 -p 7687:7687 -v Your_neo4j_dir/data:/data -v Your_neo4j_dir/import:/import neo4j:3.4
3、启动成功,打开neo4j的浏览器管理界面
http://localhost:7474
默认用户名和密码一致:neo4j
登录成功后会提示重置密码
-
-
Jmeter性能测试从入门到精通-全程实战
2018-05-07 10:20:44Jmeter性能测试从入门到精通-全程实战 全程实战,每个知识点通过实际项目演练讲解 理论实践结合,既会做,又知道为什么这样做 讲解时同其他工具做对比,加深理解,了解区别 分享技巧,用起来事半功倍 从基础讲... -
Java项目实战
2017-12-27 13:36:57为大家分享一些Java项目实战,希望大家能够从里面中学习到自己想学的东西。 -
机器学习&深度学习系统实战!
2017-06-07 13:18:11数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程... -
-
第三章 C语言 PTA循环控制——作业-答案.html
-
在VMware中安装Linux虚拟机并设置联网
-
opencv3.3.1要的文件.rar
-
PowerBI重要外部工具详解
-
用 PyQt5 制作动态钟表
-
MySQL 性能优化(思路拓展及实操)
-
青蛙跳台阶问题-2
-
吊打面试官-hashMap
-
二维码实例.zip下载
-
jn82901336.github.io-源码
-
光伏并网matlab仿真模型.zip
-
21-02-28冒泡,快排,选择,
-
echarts画图
-
linux环境下的mount命令到底有什么玄机
-
架构的稳定性
-
日本三菱公司FX系列PLC通信调试工具(含源代码)
-
质量保证书-源码
-
139网站可用性测试报告.pdf
-
网络营销知识仓库.txt
-
MySQL 事务和锁