目录
1、什么是Ajax
1.1 实例的引入
1.2 基本原理
2、Ajax分析方法
1、查看请求
2、过滤请求
3、Ajax结果提取
1、分析请求
2、分析响应
3、例子
我们在用 requests 抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用 requests 得到的结果并没有, 这是因为 requests 获取的 都是原始的 HTML 文档,而浏览器中的页面则是经过 JavaScript 处理数据后生成的结果,这些数据的来源有多种,可能是通过Ajax 加载的, 可能是包含在HTML 文档中的,也可能是经过 JavaScript 和特定算法计算后生成的。
对于第一种情况,数据加载是一个中异步加载方式,原始的页面最初不会包含某些数据,原始页面加载完后,会再向服务器请求某个接口获取数据,然后数据才被处理从而呈现到网页上,这其实就是发送了一个Ajax请求,这种形式的页面原来越多,网页的原始HTML文档不会包含任何数据,数据都是通过Ajax统一加载后在呈现出来的,这样在Web开发上可以做到前后端分离,而且降低服务器直接渲染页面带来的压力
所以如果遇到这样的页面,直接 requests 等库来抓取原始页面,是无法获取到有效数据的, 这时需要分析网页后台 接口发送的 jax 请求,如果可以用 requests 来模拟 Ajax 请求,那么就可以 成功抓取了。
Ajax ,全称为 Asynchronous JavaScript and XML ,即异步的 JavaScript 和XML 它不是一门编程 语言,而是利用 JavaScript 在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。
对于传统的网页,如果想更新其内容,那么必须要刷新整个页面,但有了 Ajax ,便可以在页面不 被全部刷新的情况下更新其内容 在这个过程中,页面实际上是在后台与服务器进行了数据交互,获取到数据之后,再利用 JavaScript 该变网页,这样网页内容就会更新了
浏览网页的时候,我们会发现很多网页都有下滑查看更多的选项: 比如我个人CSDN的主页, 再向下就没有了,转而会出现一个加载的动间,不一会儿下方就继续出现了新的CSDN内容,这个过程 真实就是 Ajax 加载的过程
我们注意到页面其实并没有整个刷新,也就意味着页面的链接没有变化,但是网页中却多了新内 容,也就是后面刷出来的CSDN 这就是通过 Ajax 获取新数据’并呈现的过程
发送Ajax请求到网页更新的这个过程可以简单分为以下3步
1、发送请求
JavaScript 可以实现页面的各种交互功能, Ajax也不例外,它也是由 JavaScript 实现的, 实际上执行了如下代码:
var xmlhttp;
if (window.XMLHttpRequest) {
// code for IE7+ , Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IES
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.ready5tate==4 && xmlhttp.status==200) {
document.getElementById ("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("POST","/ajax/", true);
xmlhttp.send();
这是 JavaScript 对Ajax 最底层的实现,实际上就是新建了 XMLHttpRequest 对象,然后调用 onreadystatechange 属性设置了监昕,然后调用 open() 和 send() 方法向某个链接(也就是服务器送了请求。 前面用 Python 实现请求发送之后,可以得到响应结果,但这里请求的发送变成 JavaScript 来完成, 由于设置了监听,所以当服务器返回响应时, onreadystatechange 对应的方法便会被触发, 然后在这个方法里面解析响应内容即可
2、解析内容
得到响应之后,onreadystatechange 属性对应的方法便会被触发,此时利用 xmlhttp的response Text 属性便可取到响应内容,这类似于 Python 中利用 requests向服务器发起请求,然后得到响应的过程,那么返回内容可能是 HTML ,可能是 JSON ,接下来只需要在方法中用 JavaScript 处理即可比如,如果是 JSON 的话,可以进行解析和转化
3、渲染网页
JavaScript有改变网页内容的能力,解析完响应内容之后,就可以调用 JavaScript来针对解析完的 内容对网页进行下一步处理了, 比如,通过 document.getElementByid().innerHTML这样的操作,便可以对某个元素内的源代码进行更改,这样网页显示的内容就改变了,这样的操作也被称作 DOM 操作, 即对 Document 网页文档进行操作,如更改、删除等;
上例中, document.getElementByid("myDiv ").innerHTML=xmlhttp.responseText便将ID为 myDiv 的节点内部的HTML代码更改为服务器返回的内容,这样myDiv元素内部便会呈现出服务器返回的 数据,网页的部分内容看上去就更新了
这3个步骤其实都是由JavaScript完成的,它完成了整个请求,解析,和渲染的过程
真是的数据其实都是一次次的Ajax请求得到的,如果想要抓取这些数据,需要直到这些请求到底怎么发送的,发往哪里,发了哪些参数,如果我们直到了这些,就可以用Python模拟这个发送操作,获取到其中的结果了?
拖动刷新的内容由Ajax加载,而且页面的URL没有变化,那么我们到哪里去查看这些Ajax请求?
这里我们就需要Chrome浏览器开发者工具来,切换到Network选项卡,我们知道页面加载过程中浏览器与服务器之间发送请求和接受响应的记录
Ajax其实有其特殊的请求类型,叫做xhr,我们可以看到这个get-tab-total请求就是Ajax请求
有的请求中,Request Headers、URL和Response Headers等信息,其中Request Headers中有一个信息为X-Requested-With:XMLHttpReqest,这就标记了此请求时Ajax请求,
点击Preview,我们可以看到响应的响应的内容,它是JSON格式的,这里chrome为我们做了自动解析,我们可以发现返回的时文章的信息,这也是用来渲染个人主页所使用的数据,JavaScript接受到这些数据之后,再执行相应的渲染方法,整个页面就渲染出来了
我们看下第一个请求,返回的其代码不是很多,结构也简单,只是执行了一些JavaScript,真是数据并不是最原始的页面返回的,而是后来执行JavaScript后,再次向后台发送了Ajax请求,浏览器拿到数据后进一步渲染出来的
使用Chrome开发工具筛选共嗯那个选出所有的Ajax请求,在请求的商法选栏,直接点击XHR,此时在下方显示所有请求便是Ajax请求了
我们点开一个请求就可以看到其:RequestURL,ReqestHeaders,ResponseHeader,Response Body等内容,此时我们模拟请求和提取就非常简单了
以自己的CSDN为例子
打开Ajax的XHR过滤器,选中其中一个请求,查看它参数信息;这是一个get请求,请求参数5个
通过发现,请求的参数中始终为这5个,只是该表了page,这个参数只是用来控制分页的
查看返回的响应,这个内容时JSON格式的,浏览器开发这工具自动做了解析所以方便我们查看,
这些我们请求一个接口,就可以得到20天数据,而且请求只需要该表page参数既可
获取自己CSDN的Ajax数据
from urllib.parse import urlencode
import requests
from pyquery import PyQuery as pq
base_url = "https://blog.csdn.net/community/home-api/v1/get-business-list?"
headers = {
"cookie": "uuid_tt_dd=10_37481457760-1614696081762-771893; UN=Smart_look; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=6525*1*10_37481457760-1614696081762-771893!5744*1*Smart_look; Hm_lvt_e5ef47b9f471504959267fd614d579cd=1620037344; __gads=ID=b2b2ba9fbd5f97fa-228d5d7c93cb004f:T=1631355448:RT=1631355448:S=ALNI_MaN-YuGZ0ZKrwQlnce2q2uTVYcQrQ; ssxmod_itna=Yq0h0K4Axx7tGH3iQ0gxQqAITqyDUEhTq874Y5dD/I3xnqD=GFDK40oAOIKuIx==YD8aiQFnADcfhq81RgxWd5n7cjxqGCe0aDbqGk7nzx4GGUxBYDQxAYDGDDPDoxKD1D3qDkD7g1ZlndtDm4GWzqGfDDoDYS6nDitD4qDB+2dDKqGgzwrXGeNQ6qqKv7+yD0t=xBd=F6hyAmaHk0NKocWjDxDHf8yo8Ah1rg443CpnDB6mxBQZ0MN00CHgDCX4=rhaKixYSEG69z4rKDPqeb4T5hD=KBDi9S4W/DqudE+zR5DADU44QOD4D===; ssxmod_itna2=Yq0h0K4Axx7tGH3iQ0gxQqAITqyDUEhTq874Y5G9Wv7DBTkAx7p+x8=QnhyoS8GlrMviCP5KQo=wDO/4w=85G3piamrVr=3th8s9p7XsBA/TE4+NN/l5R9W2Ee=Mc4LNE2L8YLdjNkUS=+U3i=IGXcIB3D8EUTWl5WzEr4Ar=480rZRov3v7d8CePQv4n8+bA5TZoFEraWhcaiULRdZfbcifrcWfr0AfHvFaq+LCtHVqnwsnoQbjKvvA5vLOD=WDO88nQPx9aCSFOUucO0H=3nOzCDgIH2=Hl67yls8vgsvVoEdkX/2eKWncBDu/xx7m9Dvlm+00hZIaSQpM+a=tDVIBifPzQcOI+kle5wcNWwM3E+Ww5=IhSBitgc07P6PQ15b4W=62VIg8I2b0oKtG3D07UYb1bxh0K8AN30AmQE7M8qGQcGqcSqHbxsGQV0f08T97DWSA+PFT07Sok/GmpP8KkfqfK=Z+YZ+YG8LPTqGUNYjADDLxD2/yWMgPBq4l2xnFqAKzDhKBqYKmKAnI0TAS2Y0QzkDPFdnBuzgTIZ2DDWTZhKQexe7IPD==; UserName=Smart_look; UserInfo=d43e50a1aa0c4f2caa52662c49ea3f55; UserToken=d43e50a1aa0c4f2caa52662c49ea3f55; UserNick=Amae; AU=779; BT=1635603087677; p_uid=U010000; Hm_up_6bcd52f51e9b3dce32bec4a3997715ac=%7B%22islogin%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22isonline%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22isvip%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%2C%22uid_%22%3A%7B%22value%22%3A%22Smart_look%22%2C%22scope%22%3A1%7D%7D; c_segment=5; dc_sid=8af578122c748c6f8f79293ff5d9c725; c_first_ref=www.baidu.com; c_first_page=https%3A//blog.csdn.net/quanqxj/article/details/89226160; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1640932419,1640958689,1641047085,1641108277; c_pref=https%3A//www.baidu.com/link; c_ref=https%3A//blog.csdn.net/Smart_look%3Fspm%3D1000.2115.3001.5343; firstDie=1; log_Id_click=32; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1641188306; log_Id_view=97; dc_session_id=10_1641198463093.943635; c_page_id=default; dc_tos=r54ku6; log_Id_pv=73",
"referer": "https://blog.csdn.net/Smart_look?spm=1000.2115.3001.5343",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
def get_page(page):
params = {
"page":page,
'size':20,
'businessType':'lately',
'noMore':'false',
'username':"Smart_look"
}
url = base_url + urlencode(params)
try:
respnose = requests.get(url,headers=headers)
if respnose.status_code==200:
return respnose.json()
except requests.ConnectionError as e:
print("Error",e.args)
if __name__ == '__main__':
for page in range(1,5):
json = get_page(page)
print(json)
结果
{'code': 200, 'message': 'success', 'data': {'list': [{'type': 'blog', 'formatTime': '21 小时前', 'title': '爬虫:CSV文件存储', 'description': 'CSV,全称为 Comma-Separated Values ,中文可以叫作逗号分隔值或字符分隔值,其文件以纯文 本形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分隔,每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符, 不过所有记录都有完全相同的字段序列 ,相当于一个结构化表的纯文本形式, 它比 Excel 文件更加简介, XLS 文本是电子表格,它包含了文本、数值、公式和格式等内容,而 CSV 中不包含这些 容,就是特定字符分割的纯文本,结', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1641122118000, 'createTime': 1641119691000, 'url': 'https://blog.csdn.net/Smart_look/article/details/122279049', 'articleType': 1, 'viewCount': 47, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '昨天', 'title': '爬虫:JSON文件存储', 'description': 'JSON ,全称为 JavaScript Object Notation 也就 JavaScript 对象标记,它通过对象和数组的组合 来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式目录对象和数组读取Json输出JSON对象和数组JavaScript 语言中,一切都是对象, 因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、 对象 、数组等,但是对象和数组都是比较特殊且常用的两种类型,下面简要介绍一下 它们对象:他在JavaScript', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1641109809000, 'createTime': 1641106807000, 'url': 'https://blog.csdn.net/Smart_look/article/details/122276562', 'articleType': 1, 'viewCount': 84, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '昨天', 'title': '爬虫:文件存储:Text', 'description': '文件保存的形式是多种多样的,最简单的形式是直接保存文本文件,如:TEXT,JSON,CSV等,另外还可以保存到数据中,如关系型数据库Mysql,非关系型数据库等:MongoDB,Redis等TXT文本保存保存知乎上"发现"页面的"热门话题"部分,将其问题和答案统一保存成txt形式import requestsfrom pyquery import PyQuery as pqurl = "https://www.zhihu.com/explore"headers = {"user-ag', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1641106679000, 'createTime': 1641078780000, 'url': 'https://blog.csdn.net/Smart_look/article/details/122273368', 'articleType': 1, 'viewCount': 29, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '昨天', 'title': '爬虫:pyquery 解析库', 'description': '如果你比较喜欢CSS选择器,对jQuery有所了解,那么这个库更加适合——pyquery初始化向Beautiful Soup一样,初始化pyquery的时候,也需要传入HTML文本来初始化一个PyQuery对象,它的初始化方式有很多种,比如直接传入字符串,传入URL,传入文件名1、字符串初始化...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1641048913000, 'createTime': 1640611500000, 'url': 'https://blog.csdn.net/Smart_look/article/details/122180996', 'articleType': 1, 'viewCount': 127, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '7 天前', 'title': '爬虫:Beautiful Soup', 'description': '目录Beautiful Soup 简介解释器基本用法节点选择器选择元素提起信息1、提取名称2、获取属性3、获取内容嵌套选择关联选择1、子节点和子孙节点2、父节点和祖先节点3、兄弟节点4、提取信息方法选择器1、find_all()2、find() :返回单个元素CSS选择器1、嵌套选择2、获取属性3、获取文本对于一个网页来说,都有一定的特殊结构和层级关系,而且很多节点都有 id,class 来作区分,所以借助它们.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1640511634000, 'createTime': 1640413116000, 'url': 'https://blog.csdn.net/Smart_look/article/details/122143056', 'articleType': 1, 'viewCount': 348, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '9 天前', 'title': '爬虫:Xpath定位', 'description': '对于网页的节点来说,定义id,class或其他属性。而且节点之间还有层级关系,在网页中通过XPath或CSS选择器来定位一个或多个节点,对于这种解析库非常多,其中比较强大的库有lmxl,Beautiful Soup、pyquery等,XPath概览...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1640412962000, 'createTime': 1638800022000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121757654', 'articleType': 1, 'viewCount': 486, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '29 天前', 'title': '爬虫:Requests高级用法', 'description': '了解了 requests 基本用法 ,如基本的 GET, POST 请求以及 Response 对象 本节巾,我们再来了解下 requests 些高级用法,如文件上传、 Cookies 设置 代理设置等1、文件上传requests 可以模拟提交一些数据, 假如有的网站需要上传文件,我们也可以用它来实现, 这非常简单import requestsfiles = { "files": open("favicon.ico","rb")}response = requests.pos', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1638665089000, 'createTime': 1638364518000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121664994', 'articleType': 1, 'viewCount': 150, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '1 月前', 'title': '爬虫:使用Requests模块基本使用', 'description': '目录安装Requests示例引入GET请求抓取网页抓取二进制数据POST请求常用的响应我们了解urllib的基本用法,但是其中确实有不方便的地方,比如处理网页验证和 ookies时,需要写 Opener 和Handler来处理.。为了更加方便地实现这些操作,就有了更为强大的库request ,有了它,Cookies 、登录验证、代理设置等操作都不是事儿。安装Requestspin install requests示例引入import requ...', 'hasOriginal': True, 'diggCount': 1, 'commentCount': 0, 'postTime': 1638282866000, 'createTime': 1638278321000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121643058', 'articleType': 1, 'viewCount': 793, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '1 月前', 'title': '爬虫:Robots协议', 'description': 'Robots 协议也称作爬虫协议、机器人协议,它的全名叫作网络爬虫排除标准( Robots Exclusion Protocol ),用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取 它通常是一个叫作 robots.txt的文本文件,一般放在网站的根目录下当搜索爬虫访问一个站点时,它首先会检查这个站点根目录下是否存在 robots.txt 文件,如果存在, 搜索爬虫会根据其中定义的爬取范围来爬取, 如果没有找到这个文件,搜索爬虫便会访问所有可直接访问的页面:看个robots.txt的样例:.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1638196841000, 'createTime': 1638108992000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121599170', 'articleType': 1, 'viewCount': 511, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '1 月前', 'title': '爬虫:URL解析链接', 'description': '目录urlparse() :实现URL的识别和分段urlparse() 方法其他API用法urlunparse() :实现URL拼接urlsplit():解析URL把params和并到path中urlunsplit() :完成链接拼接urljoin():完成链接的合并urlencode() :序列化为GET请求参数parse_qs():反序列:字典parse_qsl() 反序列化:列表quote() :将内容转化为URL编码的格式unquote():将UR...', 'hasOriginal': True, 'diggCount': 1, 'commentCount': 0, 'postTime': 1638108181000, 'createTime': 1638086249000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121592819', 'articleType': 1, 'viewCount': 394, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '1 月前', 'title': 'Kubernets:安装过程中问题解决', 'description': '1、Kuerenets:启动失败:[kubelet-check] It seems like the kubelet isn\'t running or healthy.[kubelet-check] The HTTP call equal to \'curl -sSL http://localhost:10248/healthz\' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: c', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1638081418000, 'createTime': 1637415587000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121446170', 'articleType': 1, 'viewCount': 186, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '1 月前', 'title': '爬虫:基本解析库的介绍urllib', 'description': 'Python2中,有urllib和urllib两个库来实现请求的发送,而在Python3中,已经不存在urllib2这个库了,统一为urllib库,他是Python内置的HTTP的请求库主要有4个模块Request:它是最基本的 HTTP 请求模块,可以用来模拟发送请求 就像在浏览器里输入网挝 然后回车 样,只需要给库方法传入 RL 及额外的 数,就可以模拟实现这个过程了Error:异常处理模块,如果出现请求错误 可以捕获这些异常,然后进行重试或 作以保证程序不会意外终止Parse:一个工具模', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1638081387000, 'createTime': 1615727138000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114803721', 'articleType': 1, 'viewCount': 91, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '1 月前', 'title': 'Docker:kubernetes安装部署之二', 'description': 'kubernetes集群在安装的时候要求有三种网络Pod(Pod网络):每个Pod运行在同一个网段中,可以Ping通Service(集群网络):和Pod不在同一个网段,Service地址是虚拟的假的,存在IP tables或IPVS中Node(节点网络):节点的网段又是独立的一个,Node节点的IP地址,即物理机(宿主机)的网卡地址这种网络Kubernetes不提供,需要于第三方依赖插件来解决,都可以托管在Kubermetes上,单Pod,或者守护进程来启动提供网络服务: 提..', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1637461871000, 'createTime': 1636242205000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121187590', 'articleType': 1, 'viewCount': 663, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '1 月前', 'title': 'Docker:kubernetes简介之一', 'description': 'Kubernetes是什么?Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。主要特性:1、自动装箱 【基于资源依赖,最大约束能够自动完成容器的部署,而且不影响其可用性】2、自我修复 【容器崩了,可以在短时间内启动(容器kill掉,用重启来代修复)】', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1636215123000, 'createTime': 1635931232000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121126116', 'articleType': 1, 'viewCount': 25, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '2 月前', 'title': 'Devops:Gitlab安装', 'description': '目录GitLab 是什么GitLab的优势GitLab的构成和主要架构工作流程图GitLab工作流GitLab和兴概念:Merge Request 和ForkGitLab CI/Pipeline 流水线图搭建GitLab配置GitLab 是什么GitLab是一个开源分布式版本控制系统,利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目GitLab的优势开源免费,适合中小型..', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1635756283000, 'createTime': 1635729930000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121074095', 'articleType': 1, 'viewCount': 58, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '2 月前', 'title': 'Devops:Jenkins 使用简介,增加节点', 'description': '目录Jenkins 系统架构图Jenkins分布式建构图Jenkins 核心概念常见的Job类型Freestyle project 项目构建一个项目Jenkins中增加节点Jenkins 系统架构图Jenkins分布式建构图Jenkins 核心概念概念\t\t\t含义\t\tCore [核心 ]\t\t\t主要的jenkins应用程序(jenkins.war),它提供了基本的web ui、配置和插件构建的基础。\t\tPlugin [插件]\t\t\t\t\t\t与J', 'hasOriginal': True, 'diggCount': 1, 'commentCount': 0, 'postTime': 1635672759000, 'createTime': 1635651344000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121061828', 'articleType': 1, 'viewCount': 355, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '2 月前', 'title': 'Devops:Jenkins安装用Docker', 'description': 'Jnekins 下载简介官方支持LTS(Long-term Support)和Weekly版本;LTS每12周发布一次支持多平台下载:下载地址:https://www.jenkins.io/download/ ;这里使用的Docker安装方式LTS版本发布周期示意图1、拉取docker新的镜像[root@localhost jenkins]# docker pull jenkins/jenkins:latest[root@localhost jenkins]# mkdir -p.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1635650282000, 'createTime': 1635635728000, 'url': 'https://blog.csdn.net/Smart_look/article/details/121059759', 'articleType': 1, 'viewCount': 67, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '2 月前', 'title': 'Docker:资源限制', 'description': '前面我们提到过,容器能够得以实现,主要依赖于内核的种的NameSpace,CCgroupsNameSpace(命名空间)CCgroups(控制组)控制NameSpace(命名空间)来进行资源的分配1、默认情况下一个Docker中的一个Container是没有资源限制的,调度器能够Container调度多少资源,它都能 吃掉2、Docker provides 提供了控制Memory,CPU,block IO,从这三个维度来进行控制的,其实它正真能控制前两个Memory,CPU,【我们知...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1634990620000, 'createTime': 1634854884000, 'url': 'https://blog.csdn.net/Smart_look/article/details/120898339', 'articleType': 1, 'viewCount': 108, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '2 月前', 'title': 'Docker:Docker Registry 搭建私有仓库,Harbor', 'description': 'Resistry 【退管镜像】用于保存docker镜像,包括镜像的层次结构和元数据;用户可自建Registry , 也可以使用官方的Docker HubSponsor Registry:第三方的registry,供客户和Docker社区使用\tMirror Registry :第三方的registry,只让客户使用\tVendor Registry:由发布Docker镜像的供应商提供的registry\tPrivate Registry:通过设有防火墙和额外的安全层的私有实体提供的registry安.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1634743293000, 'createTime': 1634652032000, 'url': 'https://blog.csdn.net/Smart_look/article/details/120855897', 'articleType': 1, 'viewCount': 52, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '2 月前', 'title': 'Docker:Dockfile制作容器详细介绍', 'description': '有些镜像不能满足我们的生产环境的需要就需要自己来制作镜像;制作镜像有两种方式:1、基于镜像【修改容器: 自定义容器】缺点所有的配置都是写死的不能灵活配置【假设我们需要三个镜像:测试,开发,线上配置都是不相同,实现起来配置是很麻烦的,都需要重新制作】;事实上docker在配置文件山解决方案是:nginx这个镜像启动为容器后只做一件事情,配置一个虚拟主机,提供一个虚拟Server,它所服务主机名、家目录、监听的端口,文档根目录,在什么时候?由于配置的环境影响可能可不一样,当时它的配置文件格式是.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1634651844000, 'createTime': 1634447299000, 'url': 'https://blog.csdn.net/Smart_look/article/details/120809871', 'articleType': 1, 'viewCount': 265, 'rtype': 'article'}], 'total': None}}
{'code': 200, 'message': 'success', 'data': {'list': [{'type': 'blog', 'formatTime': '2 月前', 'title': 'Docker:逻辑卷详细解释', 'description': '目录什么是数据卷?扩展为什么要使用逻辑卷?卷卷的种类创建逻辑卷Docker-managed volume创建Bind mount volume 创建使用go模板过滤insepct中的信息2个容器共享容器卷创建共享存储卷并加入基础镜像的网络Docke 作为容器运行底层引擎,在组织和运行时候每个程序只运行一个程序及子程序,对于启动这个容器它底层可能不止一层的镜像联合挂载的启动而成最上层时可写层【读写层】,对于容器的所有的操作包括数据,对内容的修改...', 'hasOriginal': True, 'diggCount': 1, 'commentCount': 0, 'postTime': 1634441856000, 'createTime': 1634393508000, 'url': 'https://blog.csdn.net/Smart_look/article/details/120805021', 'articleType': 1, 'viewCount': 85, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '2 月前', 'title': 'Docker网络模型:Nat,bridge,叠加网络;Docker中的bridge,host,none网络', 'description': '目录Docker:网络模型Network:隔离设备,网络栈,端口等Bridge:桥网络一、S1、S2交换机之间用软件模拟虚拟网卡,进行通信二、S1、S2交换机通过路由转发,实现不同的网段的通信Nat:网络地址转换协议Overlay Network:叠加网络Docker 中网络Docker 中 Bridge 网络IPtables 规则Docker 中 host 网络引入Container A要被外部主机B访问,还有什么方法(除了桥接)?...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1634353787000, 'createTime': 1633837317000, 'url': 'https://blog.csdn.net/Smart_look/article/details/120684425', 'articleType': 1, 'viewCount': 103, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '3 月前', 'title': 'Linux:Tomcat 安装配置详解', 'description': '目录一、Tomcat 简介二、Tomcat核心组件三、Tomcat组件组成部分四、Tomcat的运行模式五、安装Tomcat六、Java WebAPP组织架构七、部署(deployment)webapp相关的操作一、Tomcat 简介Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选二、Tomcat核心组件catalina: servlet container:...', 'hasOriginal': True, 'diggCount': 2, 'commentCount': 0, 'postTime': 1632220759000, 'createTime': 1632124180000, 'url': 'https://blog.csdn.net/Smart_look/article/details/120392035', 'articleType': 1, 'viewCount': 350, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '3 月前', 'title': 'LInux:LInux找回密码', 'description': '1、开机后按上下键,防止启动成功,然后在按:e2、修改如下图配置3、按Crtl + x进入救援模式4、输入以下命令5、重新启动,输入新改的密码,就可以登录成功', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1630836619000, 'createTime': 1630835563000, 'url': 'https://blog.csdn.net/Smart_look/article/details/120118461', 'articleType': 1, 'viewCount': 7, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '4 月前', 'title': 'Linux:网络配置、IP、route、lftp、配置文件', 'description': '网络配置方式一般分为两种静态指定\tifcig系列:ifconfig,route\t\tip系列:object(link,addr,route),ss,tc\t\t配置文件 [system-config-network-tui](setup)\t\t使用图形化界面:nmcli,nmtui\t\t动态分配\tDHCP :Dynamic Host Configguration Protocol\t命令形式配置网络...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1630202534000, 'createTime': 1627207933000, 'url': 'https://blog.csdn.net/Smart_look/article/details/119085414', 'articleType': 1, 'viewCount': 80, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '4 月前', 'title': 'Linux:Ansible Playbooks,yuam语法,roles模块的详细解释', 'description': '对于Playbook来讲是由:Inventory、Modules、Ad Hoc Commands、Playbooks【Tasks、Variables、Templates、Handlers、Roles】组成的,想要了解Playbooks,我们需要先了解下YAML语法一、YAML语法简介YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ing', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1629011869000, 'createTime': 1628725257000, 'url': 'https://blog.csdn.net/Smart_look/article/details/119630345', 'articleType': 1, 'viewCount': 110, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '4 月前', 'title': 'Linux:Ansible简介、常见模块:server、copy、shell……等17个常用模块', 'description': '一、Ansible简介ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架二、Ansible的架构Ansible core(核心程序):用来调度执行任务,所需要的模块Host inventory.', 'hasOriginal': True, 'diggCount': 1, 'commentCount': 0, 'postTime': 1628724473000, 'createTime': 1628399496000, 'url': 'https://blog.csdn.net/Smart_look/article/details/119513535', 'articleType': 1, 'viewCount': 64, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '5 月前', 'title': 'Python:python中IO多路复用使用', 'description': 'IO多路复用大多数操作系统都是支持select和poll\tLinux2.5+ 支持epoll\tBSD、Mac支持kequeue\tWindows的IOCPPython的select库实现了select、poll系统调用,这个基本上操作系统都是支持。部分实现了epoll。底层的IO多路复用模块开发中的选择1、完全跨平台、使用select、poll。但是性能较差2、针对不同操作系统自行选择支持的技术,这样做会提高IO的处理能力 ...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1627173385000, 'createTime': 1626570677000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118873220', 'articleType': 1, 'viewCount': 38, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '5 月前', 'title': 'Python:异步编程,同步、异步、IO模型概念', 'description': '目录异步编程同步、异步概念阻塞、非阻塞同步、异步、阻塞、非阻塞的区别与联系同步IO、异步IO、IO多路复用IO两个阶段IO模型异步编程同步、异步概念同步是指:当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续执行下去,异步是指:当程序1调用程序2时,程序1径自继续自己的下一个动作,不受程序2的的影响。但是程序1会一直盯着程序2,直到程序2响应了,程序1会直接调用程序2,异步不保证多长时间程序2最中响应同步调用是指:发送方发出数据后', 'hasOriginal': True, 'diggCount': 8, 'commentCount': 18, 'postTime': 1626536850000, 'createTime': 1626513367000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118859666', 'articleType': 1, 'viewCount': 580, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '5 月前', 'title': 'Python:网络编程:SocketServer', 'description': 'SocketServersocket编程过于底层,编程虽然有套路,但是想要写出健壮的代码还是比较困难的,所以很多语言都对socket底层 API进行了封装,Python的封装就是------socketserver模块,它是网络服务编程模块,便于企业级快速开发类的继承关系SocketServer简化了网络服务器的编写它有4个同步类:TCPServer、UDPServer、UnixStramServer、UnixDatagramServer2个Mixin类:ForkingMixi', 'hasOriginal': False, 'diggCount': 0, 'commentCount': 0, 'postTime': 1626491398000, 'createTime': 1625917893000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118639721', 'articleType': 4, 'viewCount': 35, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '5 月前', 'title': 'Python:UDP编程、心跳机制、UDP的应用场景', 'description': 'UDP服务端编程流程1、创建服务端流程创建socket的对象。socket.SOCK_DGRAM\t绑定IP和Port,bind方法\t传输数据\t接受数据,socket.recvform(bufsize,[,flags]),获得一个二元组(string,address)\t\t发送数据,socket.sendto(string,address)发给某地址信息\t\t释放资源import socketsercice_udp = socket.socket(type=socket.SOCK_', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 6, 'postTime': 1625917693000, 'createTime': 1625697157000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118565150', 'articleType': 1, 'viewCount': 64, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Python:网络编程、TCP客户端编程', 'description': 'TCP客户端编程步骤客户端编程步骤创建Socket对象\t连接到远端服务器的IP和Port,connect()方法\t传输数据\t使用send,recv发送、接受数据\t\t关闭连接、释放资源简单步骤', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1625374023000, 'createTime': 1625357013000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118455665', 'articleType': 1, 'viewCount': 21, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Python:网络编程TCP、MackfFile、聊天编写', 'description': 'Socket介绍socket套接字:Python中提供socket.py标准库,非常底层的接口库Socket是一种通用的网络编程接口,和网络层次没有一一对应的关系Socket文件本身就是传输用, 传输的话就要有一个东西来缓冲,说到地就是BUffer,BUffer其实就是个队列协议族:AF表示Address Family,用于socket() 第一个参数名称\t\t\t含义\t\tAF_INET\t\t\tIPV4\t\tAF_INET6\t\t\tIPV6\t\tAF_UNIX\t\t\tUnix Domain', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 6, 'postTime': 1625356875000, 'createTime': 1624804533000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118281433', 'articleType': 1, 'viewCount': 39, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Python:concurrent异步并行任务编程模块、 线程池、进程池、上下文管理', 'description': '目录concurrent包ThreadPoolExecutor对象ProcessPoolExecutor对象支持上线文管理总结concurrent包3.2版本引入的模块。异步并行任务编程模块,提供一个高级的异步可执行的便利接口。提供2个池执行器:ThreadPoolExcentor 异步调用线程池的ExecutorProcessPoolExecutor 异步调用的进程池的ExecutorThreadPoolExecutor对象首先需要定义一个池的执行器对..', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1624782779000, 'createTime': 1624759560000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118267671', 'articleType': 1, 'viewCount': 24, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Python:多进程multiprocessing,多进程和多线程的应用', 'description': '多进程由于Python的GIL,多线程未必是CPU密集型程序的好的选择多进程可以完全独立的进程环境中运行程序,可以充分地利用多处理器但是进程本身的隔离代理的数据不共享也是一个问题,而且线程比进程轻量级multiprocessingProcess类Process类遵循了Thread类的API,减少了学习难度;先看一个例子,前面介绍的单线程、多线程比较的例子的多进程版本import multiprocessingimport datetimedef cacl(i): ', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1624759229000, 'createTime': 1624680997000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118246260', 'articleType': 1, 'viewCount': 34, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Python:信号量semaphore', 'description': 'semaphone信号量和Lock很像,信号量对象内部维护一个倒数计数器,每一次acquire都会减1,当acquire方法发现计数为0就阻塞请求的线程,直到其他的线程对信号量release后,计数大于0,恢复阻塞的线程名称\t\t\t含义\t\tSemaphore(value=1)\t\t\t构造方法。value小于0,抛ValueError异常\t\tacquire(blocking=True,timeout=None)\t\t\t获取信号量,计数器减1,获取成功返回True\t\treleas...', 'hasOriginal': True, 'diggCount': 1, 'commentCount': 0, 'postTime': 1624680652000, 'createTime': 1624463670000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118165086', 'articleType': 1, 'viewCount': 46, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Python:线程同步,Barrier屏障', 'description': 'Barrier屏障有人翻译成栅栏,建议还是使用屏障,可以想象成路障,道闸,Python3.2引入的新功能', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1624199893000, 'createTime': 1624178846000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118071754', 'articleType': 1, 'viewCount': 58, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Git:Git分支概念、Pycharm中使用使用分支', 'description': '分支branch注:以下操作都在Pycharm中完成,其他IDE都可以实现类似的功能,Git命令较为麻烦', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1624164520000, 'createTime': 1624154026000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118066515', 'articleType': 1, 'viewCount': 49, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'gogs的坑:fatal: Could not read from remote repository.', 'description': '首页\t博客\t专栏课程\t下载\t问答\t社区\t更多\t代码直播代码\t会员中心收藏动态消息创作中心gogs同一个坑进去两次...weixin_342504342018-05-28 00:51:14948收藏文章标签:git运维runtime版权工程师小C的小店更多我也想开通小店Python编程三剑客:Python编程从入门到实践第2版+快速上手第2版+极客编程(套装共3册)作者:[美] 埃里克·马瑟斯(Eric M...', 'hasOriginal': False, 'diggCount': 0, 'commentCount': 0, 'postTime': 1624118700000, 'createTime': 1624118532000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118061090', 'articleType': 2, 'viewCount': 100, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Linux:Pycharm中使用Git', 'description': 'Git私服中创建项目版本库', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1624153788000, 'createTime': 1624116725000, 'url': 'https://blog.csdn.net/Smart_look/article/details/118060834', 'articleType': 1, 'viewCount': 94, 'rtype': 'article'}], 'total': None}}
{'code': 200, 'message': 'success', 'data': {'list': [{'type': 'blog', 'formatTime': '6 月前', 'title': 'Linux:搭建GIT服务,Linux中使用git,git基础命令,和原理', 'description': 'GIT由来:Linux内核代码需要版本管理工具维护代码,2002年开始,使用的是BitMover公司的BitKeeper这个商用软件。但是Linux社区崇尚的是自由软件相勃,2005年,Andrew Tridell对BitKeeper的协议进行逆向工程,BitKeeper作者决定收回无偿使用授权。磋商无果,Linus又找不到合适的版本管理工具,决定自行开放分布式版本管理工具,一个月后,Linux内核代码被GitHub上线。2008年,基于WEB使用Git进行版本控制的软件托管服务的网站GitH', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1624102627000, 'createTime': 1623682066000, 'url': 'https://blog.csdn.net/Smart_look/article/details/117914172', 'articleType': 1, 'viewCount': 51, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Gogs:使用过程中遇到的坑', 'description': '1、访问页面报500;日志:[Macaron] PANIC: session(start): mkdir data: permission denied页面:日志:原因:gogs想要创建 data目录,它没有权限导致的解c[root@bogon gogs]# mkidr data #创建data目录\t[root@bogon gogs]# chow -R git:git /home/git/gogs/d...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1623675091000, 'createTime': 1623674125000, 'url': 'https://blog.csdn.net/Smart_look/article/details/117912439', 'articleType': 1, 'viewCount': 175, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Python:线程同步,Event事件、Lock锁,RLock锁、Condition消费者模型', 'description': '线程同步概念:线程同步,线程间协同,通过某种技术,让一个线程访问某些数据时,其他线程不能访问这些数据,直到该线程完成对数据的操作\t不同的操作系统实现的技术有所不同,有临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、时间Even等EventEvent时间,是线程间通信机制中最简单的实现,使用一个内部的标记Flag,通过Flag的True或False的变化来进行操作名称\t\t\t含义\t\tset()\t\t\t标记设置为True\t\tcle.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1623588843000, 'createTime': 1622896447000, 'url': 'https://blog.csdn.net/Smart_look/article/details/117605216', 'articleType': 1, 'viewCount': 137, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '6 月前', 'title': 'Linux:搭建Gogs服务,页面报错Failed to test ‘git‘ command: exec: “git“: executable file not found in $PATH', 'description': '1、安装Mysql【这里安装的时Percona Mysql >5.7】官网下载安装包:https://www.percona.com/downloads/Percona-Server-5.7/LATEST/2、上传到LInux下解压安装[root@localhost percona_mysql]# tar -xvfPercona-Server-5.7.34-37-r7c516e9-el7-x86_64-bundle.tar3、安装安装包[root@localhost pe..', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1623665708000, 'createTime': 1622267938000, 'url': 'https://blog.csdn.net/Smart_look/article/details/117384687', 'articleType': 1, 'viewCount': 216, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '7 月前', 'title': '性能之巅:常用性能分析方法', 'description': '目录为了便于总结,这些方法已经被归类成了不同的类型1、街灯讹方法2、随机变动讹方法3、责怪他人讹方法4、AdHoc核对清单法5、问题陈述法6、科学法7、诊断循环8、工具法9、USE方法10、工作负载特征归纳11、向下挖掘分析12、延时分析13、R方法14、事件跟踪15、基础线统计16、静态性能调整17、缓存调优18、微基准测试为了便于总结,这些方法已经被归类成了不同的类型方法\t\t\t类型\t\t街灯讹方法\t\t\t观测分析\t.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 4, 'postTime': 1622390160000, 'createTime': 1621782063000, 'url': 'https://blog.csdn.net/Smart_look/article/details/117202352', 'articleType': 1, 'viewCount': 289, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '7 月前', 'title': 'Python:线程与并发、Threading、线程安全、daemon线程', 'description': '并发:基本概念并发和并行区别并行(parallel):同时做某些事,可以互不干扰的同一个时刻做几件事\t并发(concurrency):也是同时做某些事,但是强调,一个时间段内有事情处理举例:乡村公路一条车道,半幅路面出现了坑,交警指挥交通。众多车辆在这一时段通过路面的事件,这就是并发。交警指挥,车辆排队通过另外半幅路面,一个方向放行3分钟,停止该方向通行,换另一个方向放行高速公路的车道,双向4车道,所有车辆(数据)可以互不干扰的在自己的车道上奔跑(传输)。在同一个时刻,每条车道上可能同时.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1622896294000, 'createTime': 1621379099000, 'url': 'https://blog.csdn.net/Smart_look/article/details/117012157', 'articleType': 1, 'viewCount': 71, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '7 月前', 'title': 'Python:类的魔术方法、Hash、可视化、运算符重载、容器相关', 'description': '类的特殊方法属性\t\t\t含义\t\t__name__\t\t\t类、函数、方法等的名字\t\t__module__\t\t\t类定义所在的模块明\t\t__class__\t\t\t对象或类所属的类\t\t__bases__\t\t\t类的基类元组,顺序为他们在基类列表中出现的顺序\t\t__doc__\t\t\t类、函数的文档字符串,如果没有定义则为None\t\t__mro__\t\t\t类的mro,class.mro()返回结果保存在__mro__中\t\t__dict__\t\t\t类或实例的属性,可写字典\t\t__subclasse', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1621813664000, 'createTime': 1621158785000, 'url': 'https://blog.csdn.net/Smart_look/article/details/116898412', 'articleType': 1, 'viewCount': 65, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '7 月前', 'title': 'Python:类魔术方法、反射、描述器', 'description': '类的特殊方法属性\t\t\t含义\t\t__name__\t\t\t类、函数、方法等的名字\t\t__module__\t\t\t类定义所在的模块明\t\t__class__\t\t\t对象或类所属的类\t\t__bases__\t\t\t类的基类元组,顺序为他们在基类列表中出现的顺序\t\t__doc__\t\t\t类、函数的文档字符串,如果没有定义则为None\t\t__mro__\t\t\t类的mro,class.mro()返回结果保存在__mro__中\t\t__dict__\t\t\t类或实例的属性,可写字典\t\t__subclasse', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1621158896000, 'createTime': 1620601220000, 'url': 'https://blog.csdn.net/Smart_look/article/details/116582336', 'articleType': 1, 'viewCount': 51, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '7 月前', 'title': 'Python:生成手机号码数', 'description': '题目:编写一个函数,该函数接受10个整数(0到9之间)的数组,该函数以电话号码的形式返回这些数字的字符串。create_phone_number([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) # => returns "(123) 456-7890"解答:方案一def create_phone_number(list): #your code here return f"({list[0]}{list[1]}{list[2]})"+" " + f.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1620575140000, 'createTime': 1620574550000, 'url': 'https://blog.csdn.net/Smart_look/article/details/116573174', 'articleType': 1, 'viewCount': 50, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '7 月前', 'title': 'Python:类的多继承', 'description': '目录Python不同版本的类多继承多继承弊端 Python多继承实现多继承的缺点MixinMixin类Python不同版本的类Python2.2之前是没有共同的祖先的,之后引入Object类,它是所有类的共同祖先类Object\tPython2中为了兼容,分为古典类(旧式类)和新式类\tPython3中全部都是新式类\t新式类都是继承自Object的,新式类可以使用super#古典类在python2.x中运行class A: passprint...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 4, 'postTime': 1620556683000, 'createTime': 1620531937000, 'url': 'https://blog.csdn.net/Smart_look/article/details/116562797', 'articleType': 1, 'viewCount': 84, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '7 月前', 'title': 'Python:类的单继承', 'description': '类的继承面向对象三要素之一,继承Inheritance人类和猫类都继承自动物类。个体继承自父母,继承了父母的一部分特征,但也可以有自己的个性。在面向对象的世界中,从父类继承,就可以直接拥有父类的属性和方法,这样就可以减少代码、多服用。子类可以定义自己的属性和方法class Animal: def __init__(self,name): self._name = name def shout(self): print("{} sh', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1620529315000, 'createTime': 1620340252000, 'url': 'https://blog.csdn.net/Smart_look/article/details/116475263', 'articleType': 1, 'viewCount': 90, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '8 月前', 'title': 'Python练习题 :随机生成一批数', 'description': '1、题目:指定生成一批数的个数,并可以指定数的范围"""1、随机整数生成器可以指定一批生成的个数、可以指定数值的范围、可以调整每批数字的个数"""import randomclass Random_integer: def __init__(self,count,integer_start= 1,integer_stop= 100): self.count = count self.integer_start = integer_start', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1619650522000, 'createTime': 1619649308000, 'url': 'https://blog.csdn.net/Smart_look/article/details/116254616', 'articleType': 1, 'viewCount': 64, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '8 月前', 'title': 'Python:面向对象', 'description': 'Python中一切皆对象面向对象的三要素封装\t组装:将数据和操作组装到一起\t\t隐藏数据:对外暴露一些接口,通过接口访问对象。比如驾驶员使用汽车,不需要了解汽车的构造细节,只需要知道怎么使用部件,怎么驾驶就行,踩了油门就能跑,可以不了解后面的激动原理\t...', 'hasOriginal': True, 'diggCount': 6, 'commentCount': 14, 'postTime': 1620225350000, 'createTime': 1619276972000, 'url': 'https://blog.csdn.net/Smart_look/article/details/116110162', 'articleType': 1, 'viewCount': 328, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '8 月前', 'title': 'Python:类型注解、inspect', 'description': '函数定义的弊端Python是动态语言,变量随时可以被赋值,且能赋值为不同的类型Python不是静态编译型语言,变量类型是在运行器决定的动态语言很灵活,但是这种特性也是弊端def add(x,y): return x + yprint(add(1,2))print(add("Hello","Word"))print(add(1,"Word")) #Python是强类型这里会报错难发现:由于不做任何类型检查,直到运行期问题才显现出来,或者线上运行时才能暴露出问 题', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1619274568000, 'createTime': 1618639835000, 'url': 'https://blog.csdn.net/Smart_look/article/details/115794474', 'articleType': 1, 'viewCount': 62, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '8 月前', 'title': 'Python:funtools模块、覆盖被装饰的函数模块名、名称、限定名、文档、参数注解', 'description': "update_wrapperdef update_wrapper(wrapper, wrapped,assigned = WRAPPER_ASSIGNMENTS,updated = WRAPPER_UPDATES):类似copy_properties功能\twrapper 包装函数、被更新者,wrapped 被包装函数、数据源\t元组WRAPPER_ASSIGNMENTS中是要被覆盖的属性【'__module__', '__name__', '__qualname__', '__doc__', ", 'hasOriginal': True, 'diggCount': 0, 'commentCount': 1, 'postTime': 1618626697000, 'createTime': 1618064673000, 'url': 'https://blog.csdn.net/Smart_look/article/details/115585532', 'articleType': 1, 'viewCount': 61, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '8 月前', 'title': 'Python:函数 ----》装饰器函数', 'description': '目录引入装饰器【无参】文档字符串带参装饰器引入一个加法函数,想增强它的功能,能够输出被调用过以及调用的参数信息def add(x, y): return x + y用嵌套函数、柯里化来解决def add(x,y): return x + ydef logger(fn): def _loger(*args,**kwargs): print("函数开始运行") ret = fn(*args,**kw...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1618064000000, 'createTime': 1618040074000, 'url': 'https://blog.csdn.net/Smart_look/article/details/115578004', 'articleType': 1, 'viewCount': 31, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '8 月前', 'title': 'Python:高阶函数,柯里化Currying', 'description': '高阶函数First Class Object函数在Python中是一等公民\t函数也是对象,可调用的对象\t函数也是对象,可调用的对象高阶函数数学概念 y=g(f(x))\t在数学和计算机学科中,高阶函数应当是至少满足下面一个条件的函数\t接受一个或多个函数作为参数\t\t输出一个函数\t栈里面存放的是,函数的变量,压栈过程是有序的,堆里面存放的是调用函数的对象的变量,是无序的内键高阶函数【常用的】排序:sorted(iterable[, key][, reverse])返.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1618039859000, 'createTime': 1618017927000, 'url': 'https://blog.csdn.net/Smart_look/article/details/115563679', 'articleType': 1, 'viewCount': 36, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '9 月前', 'title': 'Mysql:插入中文失败,校对集问题(数据比较的方式)、Web乱码问题', 'description': '目录插入中文失败校对集问题(数据比较的方式)Web乱码插入中文失败中文数据问题本质就是字符集问题计算机识别二进制:人类更多是识别符号:需要由两个二进制与字符的对应关系(字符集)原因是:客户端与服务端编不统一问题;服务器没有识别对应的四个字节:服务器认为数据是UTF8,一个汉字有三个字节:读取三个字节转化成汉字(失败),剩余的读在读取三个字节(不够):最终失败GBK:2个字节数是一个汉字UTF-8:3个字节数是一个汉字分析:1、查看服务器支持哪些字符集..', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1617628940000, 'createTime': 1617625715000, 'url': 'https://blog.csdn.net/Smart_look/article/details/115447579', 'articleType': 1, 'viewCount': 21, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '9 月前', 'title': 'Python:bytes、bytearray', 'description': "bytes、bytearrayPython3引入两个新类型bytes:不可变字节序列\tbytearray:字节数组、可变字符串与bytes字符串是字符组成的有序序列,字符可以使用编码来理解bytes是字节组成的有序的不可变序列bytearray是字节组成的有序的可变序列编码与解码字符串按照不同的字符集编码encode返回字节序列bytesencode(encoding='utf-8', errors='strict') -> bytes字节序列...", 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1617539215000, 'createTime': 1617535131000, 'url': 'https://blog.csdn.net/Smart_look/article/details/115432113', 'articleType': 1, 'viewCount': 25, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '9 月前', 'title': 'Python:小数据池,深浅复制', 'description': '我们来看一个小知识点复制list1 = list(range(5))list2 = list(range(5))print(list1 == list2) #返回的是Trueprint(list1 is list2) #返回的是False【==】只是对值得比较 ;【is】是对内存地址的判断赋值 【只是把内存的指针的发生了改变】这个过程有没有发生复制?list1 = list(range(5))list2 = list(range(5))list...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 1, 'postTime': 1617525869000, 'createTime': 1617449568000, 'url': 'https://blog.csdn.net/Smart_look/article/details/115419566', 'articleType': 1, 'viewCount': 36, 'rtype': 'article'}], 'total': None}}
{'code': 200, 'message': 'success', 'data': {'list': [{'type': 'blog', 'formatTime': '9 月前', 'title': 'Python:递归函数', 'description': '递归函数的定义:函数直接或间接调用自身就是递归\t递归函数需要有边界、递归前进段、递归返回段\t递归一定要有边界条件\t当边界不满足的时候,递归前进\t当边界条件满足的时候,递归返回斐波那契数列【用递归来实现】用for循环来看是怎么写的:...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1616512305000, 'createTime': 1615987744000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114950917', 'articleType': 1, 'viewCount': 25, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'Docker:Docker安装、基本命令', 'description': 'Docker体系Docker分为Docker-CE、Docker-EE,Docker-CE是社区版本免费\tDocker-EE是企业级版本是收费的这里我们安装的是Docke-CEyum源准备构建docker的yum源[root@localhost yum.repos.d]# curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1615206854000, 'createTime': 1615035730000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114456982', 'articleType': 1, 'viewCount': 50, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'Docker:简介', 'description': '什么是容器容器是指容纳其他物品的工具,物体可以被放置在容器内,容器可以保护其中内容物;Linux容器发展之路容器技术的概念最初出现在 2000 年,当时称为FreeBSD jail,这种技术可将FreeBSD系统分区为多个子系统(也称为 Jail)。Jail 是作为安全环境而开发的,系统管理员可与企业内部或外部的多个用户共享这些 Jail通过Jail技术在Linux中的实现这个项目被叫做VServer,在完成了这项针对 Linux 中多个受控制用户空间的基础性工作后,Linux ...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1615034891000, 'createTime': 1615030093000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114453172', 'articleType': 1, 'viewCount': 105, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'Python:生成器函数,yield from', 'description': '引入生成器generator:生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象生成器函数:函数体中包含yeild语句的函数,返回生成器对象\t生成器对象,是一个可迭代对象,是一个迭代器\t生成器对象,是延迟求值,惰性求值的yield与return的比较遇到yield,函数就会让出此次操作,去执行函数体别的语句\treturn,直接打断函数的执行,返回结果普通函数,生成器函数的比较例子一: 单个yiel', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1615020266000, 'createTime': 1614994340000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114433902', 'articleType': 1, 'viewCount': 46, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'Python:匿名函数 lambda', 'description': '匿名函数顾名思义:即没有名字没有名字那输入调用这个函数?\t没有名字如何调用?\t最关键的是如何使用这个函数?Python中是借助lambda表达式构建匿名函数的尼?格式:【lambda 参数列表 : 表达式】lambda x : x * 2调用:(lambda x : x * 2 ) (4) 匿名函数:使用lambda 关键子来定义函数\t参数列表不需要小括号\t冒号是用来分割参数列表和表达式的\t不需要使用return,表达式的值就是匿名函数的表达值\tlambda表...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 4, 'postTime': 1614870730000, 'createTime': 1614866305000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114379049', 'articleType': 1, 'viewCount': 37, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': '爬虫:Chrome、Firefox 、IE、Selenium浏览器驱动下载安装', 'description': 'Chrome webdriver下载下载地址:https://chromedriver.storage.googleapis.com/index.html查看自己的chrome浏览器的版本,于webdriver的驱动相同下载适合自己chrome浏览器的webdrvier', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1614699458000, 'createTime': 1614522728000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114241485', 'articleType': 1, 'viewCount': 129, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'Python:函数的销毁', 'description': "全局函数销毁方法一:重新定义同名函数def foo(a): return aprint(foo(1),id(foo),foo.__defaults__)def foo(a): return aprint(foo(1),id(foo),foo.__defaults__)结果:1 26875848 None 1 27317784 None函数的ID,不同,说明这是两个不同的函数方法二:使用del 【报错:NameError: name 'foo' .", 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1614518196000, 'createTime': 1614517493000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114239956', 'articleType': 1, 'viewCount': 69, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'Python:函数默认值的作用域【__defaults__】【__kwdefaults__】', 'description': '例子:引入def foo(abc=[]): abc.append(200) print(abc)foo()foo()结果:[200] [200, 200]第二次调用为什么问什么打印的是[ 200,200],而不是[ 200 ]?因为函数即对象,python把函数的默认值放在了属性中,这个属性就伴随着这个函数对象的 整个生命周期,和abc这个变量没有关系,abc调用玩就消失了\t可查看foo.__defaults__属性查看例子:函数值的默认值是可变类型', 'hasOriginal': True, 'diggCount': 3, 'commentCount': 4, 'postTime': 1614516839000, 'createTime': 1614510814000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114237347', 'articleType': 1, 'viewCount': 857, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'Python:闭包函数,nonlocal使用', 'description': '嵌套函数:什么是嵌套函数使用外部函数中变量def out(): x = 5 def inn(): print("inn函数中 x = {}".format(y)) print("out函数中 x = {}".format(x)) inn()out()结果:inn函数中 x = 5out函数中 x = 5内部函数是可以引用外部函数的变量【仅限于定义内部函数的外部函数】修改外部变量中函数def out(): x .', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1614482204000, 'createTime': 1614477811000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114209891', 'articleType': 1, 'viewCount': 68, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'Mysql:报错:error while loading shared libraries: libaio.so.1:', 'description': '初始化msyql报错:mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directorylibaio包的作用是为了支持同步I/O。对于数据库之类的系统特别重要,因此在linux上安装数据库软件,就需要安装libaio一、解决问题根据提示没有这个共享库:libaio安装libaio:[root@localhost yum.rep.', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 2, 'postTime': 1614395075000, 'createTime': 1614386992000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114159717', 'articleType': 1, 'viewCount': 68, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'Python:函数的变量作用域,global,变量使用原则', 'description': '作用域:一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域全局作用域:在整个程序运行环境中都可见x = 90def out(): print(x)out()结果:90局部作用域:在函数、类等内部可见,局部变量使用范围不能超过其所在的局部作用域...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 4, 'postTime': 1614476125000, 'createTime': 1614084497000, 'url': 'https://blog.csdn.net/Smart_look/article/details/114002733', 'articleType': 1, 'viewCount': 83, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'OpenSSL:SSL会话、OpenSSL简介、OpenSSL命令', 'description': '目录话题引入:通信双方通信时依赖与公钥的,公钥如何获取?【证书颁发机构:颁发CA证书】\u200b公钥的组成OpenSSL:开放源代码的软件库包 ,包括三个组件OpenSSL命令对称加密命令单项加密算法公钥加密:话题引入:通信双方通信时依赖与公钥的,公钥如何获取?【证书颁发机构:颁发CA证书】其实这个CA证书有很多复杂信息在里面,小黑要验证这个证书是可靠的,小黑必须要有一种可靠的手段拿到CA证书,用CA的证书去验证CA的签名公钥的组成PKI(Public Key In..', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1613919496000, 'createTime': 1613823629000, 'url': 'https://blog.csdn.net/Smart_look/article/details/113894506', 'articleType': 1, 'viewCount': 74, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'OpenSSL:引入简介', 'description': '美国NIST(美国国家标准与技术研究院)定义的网络安全标准:保密性(数据保密性、隐私性)、完整性(数据完整性、系统完整性)、可用性(对与授权的第三方,要能还原到元数据)数据在传输中会收到安全攻击,安全攻击分为:被动攻击(窃听)、主动攻击(伪装、重放、消息篡改、拒绝服务)为了极高数据的安全防护:提到了一些列的安全机制:加密:数据加密,明文转换为密文\t数字签名:数字签名的主要目的就是为了做身份认证的,收到消息后,确认对方的确是自己请求的服务器\t访问控制:服务器未经允许拒绝任何人访问,...', 'hasOriginal': True, 'diggCount': 3, 'commentCount': 14, 'postTime': 1613752152000, 'createTime': 1613743300000, 'url': 'https://blog.csdn.net/Smart_look/article/details/113872787', 'articleType': 1, 'viewCount': 1000, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'DNS:Bind安全配置、视图', 'description': 'Bind中的安全配置Bind支持ACL(访问控制列表)功能:主要实现把一个或多个地址归并为一个集合,并通过一个统一的名称调用格式:acl acl_name { ip; ip; net/prelen; };acl mynet { 192.168/43.0/16; }Bind中有四个内置的ACL:none...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 4, 'postTime': 1613652192000, 'createTime': 1613623736000, 'url': 'https://blog.csdn.net/Smart_look/article/details/113844866', 'articleType': 1, 'viewCount': 233, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'DNS:BIND高级应用、子域授权、区域转发、全局转发', 'description': 'BIND:子域授权子域授权是完成分布式数据库的主要手段,DNS对全球解析的量太大了不能使用集中一台服务器进行解析,最后使用把整个区域库分成N部分,授权给不同服务器,自顶到下分成N级结构【最多有128级,每一级的字符到255个字符】正向解析区域子域方法: ops.node3.com. IN NS ns1.ops.node3.com. ops.ndoe3.com. IN NS n...', 'hasOriginal': True, 'diggCount': 1, 'commentCount': 0, 'postTime': 1613623397000, 'createTime': 1613398997000, 'url': 'https://blog.csdn.net/Smart_look/article/details/113820212', 'articleType': 1, 'viewCount': 164, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'DNS:DNS与BIND 安装配置,缓存服务器配置、正向配置、反向配置、主从复制', 'description': 'BIND:Bekerley Internat Name Domain, ISC (www.isc.org)BIND的安装配置:dns服务,程序包名bind,程序名named程序包:bind:主程序\tbind-libs:通用库文件\tbing-utils:客户端工具【测试工具,】\tbind-chroot:把程序圈禁在一个小范围中,访问空间有限\tbind-devel:开发组件\tbind-dyndb:把文件放在非文件中,如:数据库\tbind-sdb:把文件放在非文件中,如:数据库需要安', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1613398446000, 'createTime': 1613266639000, 'url': 'https://blog.csdn.net/Smart_look/article/details/113805864', 'articleType': 1, 'viewCount': 173, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'DNS:解析域资源记录(A, AAAA, PTR, SOA, NS, CNAME, MX)', 'description': 'DNS简介DNS:Domain Name Service,是一种协议,基于C/S架构,监听与udp/53,tcp/53,在网络七层中的应用层协议。网络中通信时通过IP地址进行通信的,域名只是IP地址的标记,小范围通信中,使用host文件解析配置可以的由于网络中的站点众多,每天新增的也很多,就出现的IANA,做域名解析本地名称解析配置文件:hostsLinux:/etc/hosts\tWindows:C:\\Windows\\System32\\drivers\\etc\\hosts\t域名填写格式', 'hasOriginal': True, 'diggCount': 1, 'commentCount': 0, 'postTime': 1613222690000, 'createTime': 1613180036000, 'url': 'https://blog.csdn.net/Smart_look/article/details/113799190', 'articleType': 1, 'viewCount': 753, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '10 月前', 'title': 'Linux:vim编辑器', 'description': '目录vim编辑器简介vim文件打开与关闭vim编辑器光标跳转\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200bvim的编辑命令【删除、替换】\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b其它编辑操作\u200b\u200b\u200b\u200b\u200b\u200b\u200bvim中的末行模式【地址定界】\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b多文件模式【多窗口】\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b定制vim的工作特性【配置文件】\u200b\u200b\u200b\u200b\u200b\u200b\u200bvim编辑器简介vi: Visual Interface,文本编辑器\tVIM - Vi IMproved\t文本格式:ASCII', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1612972462000, 'createTime': 1612880025000, 'url': 'https://blog.csdn.net/Smart_look/article/details/113776464', 'articleType': 1, 'viewCount': 43, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '11 月前', 'title': 'Python:函数参数传参方式', 'description': '目录函数定义、调用函数参数传参函数参数可变参数传参\u200b\u200b\u200b\u200b\u200b\u200b\u200b例子参数解构函数定义、调用def语句定义函数\tdef 函数名(参数列表):\t 函数体(代码块)\t [return 返回值]\t函数名就是标识符,命名要求一样\t\tPython的函数没有return语句,隐式会返回一个None值\t\t定义中的参数列表成为形式参数,只是一种符号表达,简称形参\t\t调用\t调用的方式,就是函数名加上小括号,括号内写上参数\t\t调用时写的参数是实际参数,是实实在在传...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1612616867000, 'createTime': 1612575247000, 'url': 'https://blog.csdn.net/Smart_look/article/details/113710741', 'articleType': 1, 'viewCount': 408, 'rtype': 'article'}, {'type': 'blog', 'formatTime': '11 月前', 'title': 'Python:内置数据机构--> 元组', 'description': '元组一个有序的元素组成的集合,不可变对象\t支持索引(下标)\t\t正索引:从左至右,从0开始,\t\t负索引:从右至左\t\tt = ("woshi",1,3,"wobushi")print(t[0])print(t[-1])结果:woshiwobushi\t\t\t\t\t\t\t使用小括号 ( ) 表示\t元组定义t_tuple = tuple()\tt_tuple = ()\tt_tuple = (1,) #必须加逗号,才表示是元组元组的方法:index(value,[s...', 'hasOriginal': True, 'diggCount': 0, 'commentCount': 0, 'postTime': 1612271613000, 'createTime': 1612270847000, 'url': 'https://blog.csdn.net/Smart_look/article/details/113574111', 'articleType': 1, 'viewCount': 22, 'rtype': 'article'}], 'total': None}}
这样我们就顺利的通过分析Ajax来获取数据了