python 抓取开源中国上阅读数大于 1000 的优质文章

python基础

浏览数:232

2020-5-31

Python 现在越来越火,连小学生都在学习 Python了 ^ ^,为了跟上时代,赶个时髦,秉承活到老学到老的精神,慢慢也开始学习 Python;理论是实践的基础,把 Python 相关语法看了,就迫不及待,大笔一挥来个 Hello world 压压惊,理论终归是理论,实践还是要要的嘛,动手了之后,才能更好的掌(chui)握(niu)基(bi)础;发车了……….

首先浏览器输入 https://www.oschina.net/ 进入开源中国官网,点击顶部导航栏的 “博客” 选项进入博客列表页面,之后点击左侧 “服务端开发与管理” 选项,我们要爬取的是服务端相关的文章,如下图所示:

 

接下来分析文章列表的布局方式,按 F12 打开调试页面,如下所示:

可以看到,一篇文章的相关信息就是一个 div, class 属性为 item blog-item,打开该 div,如下:

我们要抓取的是文章的标题,描述,URL,和阅读数,标题和URL可以通过 a 标签来获取,描述通过 <dev class=description> 来获取,而阅读数则要麻烦些,是第三个 <div class=item>,

通过以下代码就可以获取到以上到相关信息:

        # 获取每个文章相关的 DIV
        articles_div = beautiful_soup.find_all("div", class_="item blog-item")
        # 处理每个 DIV
        for article_div in articles_div:
            content_div = article_div.find("div", class_="content")
            header_div = content_div.find("a", class_="header")
            # 文章URL
            url = header_div["href"]
            # 文章标题
            title = header_div["title"]
            # 文章描述
            description_str = content_div.find("div", class_="description").find("p", class_="line-clamp")
            if description_str is None:
                continue
            description = description_str.text
            # 文章阅读数
            read_count_div = content_div.find("div", class_="extra").find("div", class_="ui horizontal list").find("div", class_="item")
            # find_next_sibling 获取兄弟节点
            read_count_i = read_count_div.find_next_sibling("div", class_="item").find_next_sibling("div", class_="item")
            read_count = read_count_i.getText()

上述代码就是主要的获取相关信息的逻辑,因为阅读数没有唯一id,或者 class ,所有可以通过 find_next_sibling 来获取兄弟节点;

接下来就对获取到到文章进行处理,如按照阅读数大于等于1000过滤文章,并按照阅读数从高到低低排序,并且写到文件中:

首先要定义一个文章类,用来表示文章的相关信息,如下:

"""
文章实体类
@authon:tsmyk0715
"""
class Article:

    def __init__(self, title, url, content="", read_cnt=0):
        """
        文章类构造方法
        :param title:文章标题
        :param url: 文章 URL
        :param content: 文章内容
        :param read_cnt: 文章阅读数
        """
        self.title = title
        self.url = url
        self.content = content
        self.read_cnt = read_cnt
    
    def __str__(self):
        return u"文章:标题《{0}》,阅读数:{1},链接:{2}".format(self.title, self.read_cnt, self.url)

之后,定义文章的处理类 OschinaArticle ,相关处理逻辑在该类中实现:

import requests
# 使用 BeautifulSoup 库来解析 HTML 页面
from bs4 import BeautifulSoup
import logging
import time
# 导入定义的文章实体类
from Article import Article

class OschinaArticle:

    def __init__(self):
        # 日志
        self.log = logging
        # 设置日志级别为 INFO
        self.log.basicConfig(level=logging.INFO)
        # 把文章写到文件的行号
        self.file_line_num = 1

接下来获取 BeautifulSoup 对象:

    def getSoup(self, url):
        """
        根据 url 获取 BeautifulSoup 对象
        """
        # 请求头
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36",
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            "Host": "www.oschina.net"}
        # 请求的时候,需要加上头部信息,表示是人在操作,而不是机器,不加头部信息会报错
        response = requests.get(url, headers=headers)
        return BeautifulSoup(response.text, "html.parser")

之后,通过 BeautifulSoup 来解析 HTML 页面,获取文章相关信息,之后,根据相关信息创建文章对象,放到集合中进行返回:

    def get_articles(self, url):
        # 存放文章的集合,进行返回
        article_list = []
        beautiful_soup = self.getSoup(url)
        self.log.info(u"开始解析 HTML 页面...")
        articles_div = beautiful_soup.find_all("div", class_="item blog-item")
        for article_div in articles_div:
            content_div = article_div.find("div", class_="content")
            header_div = content_div.find("a", class_="header")
            # 文章URL
            url = header_div["href"]
            # 文章标题
            title = header_div["title"]
            # 文章描述
            description_str = content_div.find("div", class_="description").find("p", class_="line-clamp")
            if description_str is None:
                continue
            description = description_str.text
            # 文章阅读数
            read_count_div = content_div.find("div", class_="extra").find("div", class_="ui horizontal list").find("div", class_="item")
            # find_next_sibling 获取兄弟节点
            read_count_i = read_count_div.find_next_sibling("div", class_="item").find_next_sibling("div", class_="item")
            read_count = read_count_i.getText()
            # 根据相关信息创建文章对象,放到集合中,进行返回
            __article = Article(title, url, description, read_count)
            article_list.append(__article)

            self.log.info(u"文章:标题《{0}》,阅读数:{1},链接:{2}".format(title, read_count, url))

        return article_list

关于 BeautifulSoup 的相关 API 可以参考: www.crummy.com/software/BeautifulSoup/bs4/doc.zh/,有中文版哟

因为文章的阅读数如果超过 1000 的话,就用 K 来表示,为了在后面筛选指定阅读数的文章,所以需要进行处理,把 K 转换为 1000,代码如下:

    def handler_read_count(self, article_list):
        """
        处理阅读数:把 K 转换为 1000
        :param article_list:文章列表
        """
        if article_list is None or len(article_list) == 0:
            self.log.info(u"文章列表为空...")
            return
        for article in article_list:
            read_count_str = article.read_cnt.strip()
            read_count = 0
            if isinstance(read_count_str, str):
                if read_count_str.endswith("K"):
                    read_count_str = read_count_str[:-1]  # 去掉K
                    read_count = int(float(read_count_str) * 1000)
                else:
                    read_count = int(read_count_str)
            article.read_cnt = read_count

接下来就是文章根据阅读数进行筛选和排序了,筛选出阅读数大于等于指定值并且按照阅读数从高到低排序,代码如下:

    def get_article_by_read_count_sort(self, article_list, min_read_cnt):
        """
        获取大于等于指定阅读数的文章信息, 并按照阅读数从高到低排序
        :param article_list: 文章列表
        :param minx_read_cnt: 最小阅读数
        :return:
        """
        if article_list is None or len(article_list) == 0:
            self.log.info(u"文章列表为空...")
            return
        article_list_return = []
        for article in article_list:
            if article.read_cnt >= min_read_cnt:
                article_list_return.append(article)
        # 使用 Lambda 对集合中的对象按照 read_cnt 属性进行排序
        article_list_return.sort(key=lambda Article: Article.read_cnt, reverse=True)
        return article_list_return

以上就可以获取到我们想要的文章信息了,此外,我们可以把信息写到文件文件中,代码如下:

    def write_file(self, article_list, file_path):
        # 创建 IO 对象
        file = open(file_path + "/articles.txt", "a")

        for article in article_list:
            _article_str = str(article)
            file.write("(" + str(self.file_line_num) + ")" + _article_str)
            file.write("\n")
            file.write("--------------------------------------------------------------------------------------------------------------------------------------------------------")
            file.write("\n")
            # 文件行号
            self.file_line_num += 1 
            time.sleep(0.2)  # 休眠 200 毫秒
        file.close()

之后,把上面的方法整合在一起,代码如下:

    def run(self, url, min_read_count):
        # 获取所有文章
        article_list = self.get_articles(url)
        # 对阅读数进行处理
        self.handler_read_count(article_list)
        # 筛选阅读数大于等于指定值,并按阅读数从高到低排序
        _list = self.get_article_by_read_count_sort(article_list, min_read_count)
        # 写文件
        self.write_file(_list, "G:/python")
        # 打印控制台
        for a in _list:
            self.log.info(a)

main 方法测试一下,地址输入:https://www.oschina.net/blog?classification=428640, 文章阅读数要大于等于1000

if __name__ == '__main__':
    article = OschinaArticle()
    main_url = "https://www.oschina.net/blog?classification=428640"
    min_read_count = 1000
    article.run(main_url, min_read_count)

控制台日志打印如下:

写入到文件中的内容如下:

你以为到这里就完了吗,no, no, no………….,通过上述方式只能获取到首页的文章,如果想获取更多的文章怎么办?开源中国的博客文章列表没有分页,是通过滑动鼠标滚轮来获取更多的页,可是人家的地址导航栏却没有丝毫没有变动,但是可以通过 F12 来看呀,按 F12 后,通过 NetWork 来查看相关的请求和响应情况:

 

通过滚动几下鼠标滚轮之后,可以发现请求的 URL 还是有规律的:

https://www.oschina.net/blog/widgets/_blog_index_recommend_list?classification=428640&p=2&type=ajax
https://www.oschina.net/blog/widgets/_blog_index_recommend_list?classification=428640&p=2&type=ajax
https://www.oschina.net/blog/widgets/_blog_index_recommend_list?classification=428640&p=3&type=ajax
https://www.oschina.net/blog/widgets/_blog_index_recommend_list?classification=428640&p=4&type=ajax
https://www.oschina.net/blog/widgets/_blog_index_recommend_list?classification=428640&p=5&type=ajax

可以看到除了 p 的参数值不同的话,其他的都相同,p 就是分页标识,p=2就表示第二页,p=3就等于第三页,以此类推,就可以获取到更多的文章啦:

    def main(self, min_read_count, page_size):
        # 首页 URL
        self.log.info("首页##########################")
        main_url = "https://www.oschina.net/blog?classification=428640"
        self.run(main_url, min_read_count)
        # 第2页到第page_size页
        for page in range(2, page_size):
            self.log.info("第 {0} 页##########################".format(str(page)))
            page_url = "https://www.oschina.net/blog/widgets/_blog_index_recommend_list?classification=428640&p=" + str(page) + "&type=ajax"
            self.run(page_url, min_read_count)
            time.sleep(2)

测试:

if __name__ == '__main__':
    article = OschinaArticle()
    # 获取到20页的相关文章,并且阅读数要大于等于1000
    article.main(1000, 21)

日志控制台打印如下:

写到文件中如下:

可以看到,在 1-20 页中,阅读数大于等 1000 的文章有 114 篇,之后就可以 copy URL 到地址栏进行阅读啦………………..

完整代码如下:

文章实体类:

"""
文章实体类
@authon:tsmyk0715
"""
class Article:

    def __init__(self, title, url, content="", read_cnt=0):
        """
        文章类构造方法
        :param title:文章标题
        :param url: 文章 URL
        :param content: 文章内容
        :param read_cnt: 文章阅读数
        """
        self.title = title
        self.url = url
        self.content = content
        self.read_cnt = read_cnt

    def __str__(self):
        return u"文章:标题《{0}》,阅读数:{1},链接:{2}".format(self.title, self.read_cnt, self.url)

OschinaArticle 处理逻辑类:

# -*- coding:utf-8 -*-

import requests
from bs4 import BeautifulSoup
import logging
import time
from Article import Article

"""
    爬取开源中国上的文章,且阅读数大于等于1000
"""


class OschinaArticle:

    def __init__(self):
        self.log = logging
        self.log.basicConfig(level=logging.INFO)
        self.file_line_num = 1

    def getSoup(self, url):
        """
        根据 url 获取 BeautifulSoup 对象
        """
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36",
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            "Host": "www.oschina.net"}
        response = requests.get(url, headers=headers)
        return BeautifulSoup(response.text, "html.parser")

    def get_articles(self, url):
        article_list = []
        beautiful_soup = self.getSoup(url)
        self.log.info(u"开始解析 HTML 页面...")
        articles_div = beautiful_soup.find_all("div", class_="item blog-item")
        for article_div in articles_div:
            content_div = article_div.find("div", class_="content")
            header_div = content_div.find("a", class_="header")
            # 文章URL
            url = header_div["href"]
            # 文章标题
            title = header_div["title"]
            # 文章描述
            description_str = content_div.find("div", class_="description").find("p", class_="line-clamp")
            if description_str is None:
                continue
            description = description_str.text
            # 文章阅读数
            read_count_div = content_div.find("div", class_="extra").find("div", class_="ui horizontal list").find("div", class_="item")
            # find_next_sibling 获取兄弟节点
            read_count_i = read_count_div.find_next_sibling("div", class_="item").find_next_sibling("div", class_="item")
            read_count = read_count_i.getText()
            __article = Article(title, url, description, read_count)
            article_list.append(__article)
            # self.log.info(u"文章:标题《{0}》,阅读数:{1},链接:{2}".format(title, read_count, url))
        return article_list

    def handler_read_count(self, article_list):
        """
        处理阅读数:把 K 转换为 1000
        :param article_list:文章列表
        """
        if article_list is None or len(article_list) == 0:
            self.log.info(u"文章列表为空...")
            return
        for article in article_list:
            read_count_str = article.read_cnt.strip()
            read_count = 0
            if isinstance(read_count_str, str):
                if read_count_str.endswith("K"):
                    read_count_str = read_count_str[:-1]  # 去掉K
                    read_count = int(float(read_count_str) * 1000)
                else:
                    read_count = int(read_count_str)
            article.read_cnt = read_count

    def get_article_by_read_count_sort(self, article_list, min_read_cnt):
        """
        获取大于等于指定阅读数的文章信息, 并按照阅读数从高到低排序
        :param article_list: 文章列表
        :param minx_read_cnt: 最小阅读数
        :return:
        """
        if article_list is None or len(article_list) == 0:
            self.log.info(u"文章列表为空...")
            return
        article_list_return = []
        for article in article_list:
            if article.read_cnt >= min_read_cnt:
                article_list_return.append(article)
        article_list_return.sort(key=lambda Article: Article.read_cnt, reverse=True)
        return article_list_return

    def write_file(self, article_list, file_path):
        file = open(file_path + "/articles.txt", "a")

        for article in article_list:
            _article_str = str(article)
            file.write("(" + str(self.file_line_num) + ")" + _article_str)
            file.write("\n")
            file.write("--------------------------------------------------------------------------------------------------------------------------------------------------------")
            file.write("\n")
            self.file_line_num += 1
            time.sleep(0.2)  # 休眠 200 毫秒
        file.close()

    def run(self, url, min_read_count):
        # 获取所有文章
        article_list = self.get_articles(url)
        # 对阅读数进行处理
        self.handler_read_count(article_list)
        # 筛选阅读数大于等于指定值,并按阅读数从高到低排序
        _list = self.get_article_by_read_count_sort(article_list, min_read_count)
        # 写文件
        self.write_file(_list, "G:/python")
        # 打印控制台
        for a in _list:
            self.log.info(a)

    def main(self, min_read_count, page_size):
        # 首页 URL
        self.log.info("首    页##########################")
        main_url = "https://www.oschina.net/blog?classification=428640"
        self.run(main_url, min_read_count)
        # 第2页到第page_size页
        for page in range(2, page_size):
            self.log.info("第 {0} 页##########################".format(str(page)))
            page_url = "https://www.oschina.net/blog/widgets/_blog_index_recommend_list?classification=428640&p=" + str(page) + "&type=ajax"
            self.run(page_url, min_read_count)
            time.sleep(2)


if __name__ == '__main__':
    article = OschinaArticle()
    # 获取到20页的相关文章,并且阅读数要大于等于1000
    article.main(1000, 21)

结果如下:

(1)文章:标题《权限设计的杂谈》,阅读数:6400,链接:https://my.oschina.net/cloudcross/blog/1920706
————————————————————————————————————————-
(2)文章:标题《Spring核心——纯Java运行与@Bean》,阅读数:5300,链接:https://my.oschina.net/chkui/blog/1861819
—————————————————————————————————————————————-
(3)文章:标题《网站HTTP升级HTTPS完全配置手册》,阅读数:5200,链接:https://my.oschina.net/powertoolsteam/blog/1862967
————————————————————————————————————————————————-
(4)文章:标题《前两天网站访问慢的问题定位过程以及最终解决办法》,阅读数:5100,链接:https://my.oschina.net/javayou/blog/1928719
————————————————————————————————————-
(5)文章:标题《如何优雅的使用和理解线程池》,阅读数:3800,链接:https://my.oschina.net/crossoverjie/blog/1919139
—————————————————————————————————————————————-
(6)文章:标题《从小程序的安全说起》,阅读数:3500,链接:https://my.oschina.net/qixiaobo025/blog/1924401
——————————————————————————————————————————————
(7)文章:标题《使用Python分析《我不是药神》豆瓣电影短评》,阅读数:3300,链接:https://my.oschina.net/zhanglikun/blog/1845888
——————————————————————————————————————————————
(8)文章:标题《J2Cache 和普通缓存框架有何不同,它解决了什么问题?》,阅读数:3200,链接:https://my.oschina.net/javayou/blog/1931381
——————————————————————————————————————————————–
(9)文章:标题《J2Cache 和普通缓存框架有何不同,它解决了什么问题?》,阅读数:3200,链接:https://my.oschina.net/javayou/blog/1931381
———————————————————————————————————————————————-
(10)文章:标题《spring boot应用测试框架介绍》,阅读数:2900,链接:https://my.oschina.net/yangjianzhou/blog/1859103
———————————————————————————————————————————————–
(11)文章:标题《Spring核心——资源数据管理》,阅读数:2700,链接:https://my.oschina.net/chkui/blog/1920637
————————————————————————————————————————————————-
(12)文章:标题《ELK三大日志中间组件之 kibana操作手册》,阅读数:2700,链接:https://my.oschina.net/suventop/blog/1857283
————————————————————————————————————————————————
(13)文章:标题《Dubbo服务发布之服务暴露&心跳机制&服务注册》,阅读数:2200,链接:https://my.oschina.net/LucasZhu/blog/1857584
———————————————————————————————————————————————–
(14)文章:标题《MySQL多版本并发控制机制(MVCC)-源码浅析》,阅读数:2100,链接:https://my.oschina.net/alchemystar/blog/1927425
———————————————————————————————————————————————-
(15)文章:标题《k8s Kubernetes v1.10.0 集群安装文档 &踩坑日记》,阅读数:1000,链接:https://my.oschina.net/suncf/blog/1932826
———————————————————————————————————————————————-
(16)文章:标题《k8s Kubernetes v1.10.0 集群安装文档 &踩坑日记》,阅读数:1000,链接:https://my.oschina.net/suncf/blog/1932826
———————————————————————————————————————————————-
(17)文章:标题《Docker for mac 安装 Istio》,阅读数:1000,链接:https://my.oschina.net/xbl/blog/1928983
———————————————————————————————————————————————–
(18)文章:标题《Redis 数据结构-字符串源码分析》,阅读数:1000,链接:https://my.oschina.net/mengyuankan/blog/1926320
————————————————————————————————————————————————-
(19)文章:标题《redis架构演变与redis-cluster群集读写方案》,阅读数:1000,链接:https://my.oschina.net/u/2600078/blog/1923696
————————————————————————————————————————————————
(20)文章:标题《Dubbo 整合 Pinpoint 做分布式服务请求跟踪》,阅读数:1000,链接:https://my.oschina.net/yanpenglei/blog/1863383
———————————————————————————————————————————————–
(21)文章:标题《MyBatis源码解读之延迟加载》,阅读数:1000,链接:https://my.oschina.net/wenjinglian/blog/1857581
———————————————————————————————————————————————–
(22)文章:标题《前两天网站访问慢的问题定位过程以及最终解决办法》,阅读数:5100,链接:https://my.oschina.net/javayou/blog/1928719
———————————————————————————————————————————————-
(23)文章:标题《MySQL多版本并发控制机制(MVCC)-源码浅析》,阅读数:2100,链接:https://my.oschina.net/alchemystar/blog/1927425
———————————————————————————————————————————————-
(24)文章:标题《Docker for mac 安装 Istio》,阅读数:1000,链接:https://my.oschina.net/xbl/blog/1928983
———————————————————————————————————————————————-
(25)文章:标题《Dubbo服务调用——流程分析》,阅读数:1000,链接:https://my.oschina.net/LucasZhu/blog/1928494
———————————————————————————————————————————————–
(26)文章:标题《从小程序的安全说起》,阅读数:3500,链接:https://my.oschina.net/qixiaobo025/blog/1924401
———————————————————————————————————————————————-
(27)文章:标题《Redis 数据结构-字符串源码分析》,阅读数:1000,链接:https://my.oschina.net/mengyuankan/blog/1926320
———————————————————————————————————————————————–
(28)文章:标题《权限设计的杂谈》,阅读数:6400,链接:https://my.oschina.net/cloudcross/blog/1920706
———————————————————————————————————————————————–
(29)文章:标题《(亿级流量)分布式防重复提交token设计【史诗级】》,阅读数:2500,链接:https://my.oschina.net/u/2371923/blog/1921153
———————————————————————————————————————————————
(30)文章:标题《redis架构演变与redis-cluster群集读写方案》,阅读数:1000,链接:https://my.oschina.net/u/2600078/blog/1923696
———————————————————————————————————————————————
(31)文章:标题《基于swagger2的离线pdf和html文档生成》,阅读数:1000,链接:https://my.oschina.net/qixiaobo025/blog/1921568
———————————————————————————————————————————————
(32)文章:标题《如何优雅的使用和理解线程池》,阅读数:3800,链接:https://my.oschina.net/crossoverjie/blog/1919139
———————————————————————————————————————————————
(33)文章:标题《Spring核心——资源数据管理》,阅读数:2700,链接:https://my.oschina.net/chkui/blog/1920637
———————————————————————————————————————————————-
(34)文章:标题《Redission分布式锁源码解析》,阅读数:1000,链接:https://my.oschina.net/u/2313177/blog/1919810
——————————————————————————————————————————————–
(35)文章:标题《How To Do It – HelloWorld 项目总结报告》,阅读数:1000,链接:https://my.oschina.net/greenlaw110/blog/1916863
—————————————————————————————————————————————-
(36)文章:标题《Java 框架新贵入驻 TechEmpower Framework Benchmark》,阅读数:1000,链接:https://my.oschina.net/greenlaw110/blog/1863937
—————————————————————————————————————————————–
(37)文章:标题《Dubbo 整合 Pinpoint 做分布式服务请求跟踪》,阅读数:1000,链接:https://my.oschina.net/yanpenglei/blog/1863383
——————————————————————————————————————————————–
(38)文章:标题《Spring核心——纯Java运行与@Bean》,阅读数:5300,链接:https://my.oschina.net/chkui/blog/1861819
———————————————————————————————————————————————
(39)文章:标题《网站HTTP升级HTTPS完全配置手册》,阅读数:5200,链接:https://my.oschina.net/powertoolsteam/blog/1862967
——————————————————————————————————————————————-
(40)文章:标题《使用Python分析《我不是药神》豆瓣电影短评》,阅读数:3300,链接:https://my.oschina.net/zhanglikun/blog/1845888
—————————————————————————————————————————————-
(41)文章:标题《spring boot应用测试框架介绍》,阅读数:2900,链接:https://my.oschina.net/yangjianzhou/blog/1859103
———————————————————————————————————————————————
(42)文章:标题《ELK三大日志中间组件之 kibana操作手册》,阅读数:2700,链接:https://my.oschina.net/suventop/blog/1857283
———————————————————————————————————————————————–
(43)文章:标题《Spring Boot 中如何使用拦截器(十五)》,阅读数:1000,链接:https://my.oschina.net/wangxincj/blog/1862880
———————————————————————————————————————————————–
(44)文章:标题《Spring Cloud Gateway 接口文档聚合实现》,阅读数:1000,链接:https://my.oschina.net/giegie/blog/1859800
————————————————————————————————————————————————
(45)文章:标题《Spring核心——JSR250与资源控制》,阅读数:1000,链接:https://my.oschina.net/chkui/blog/1858734
———————————————————————————————————————————————-
(46)文章:标题《使用VsCode搭建Java开发环境,创建springboot应用》,阅读数:1000,链接:https://my.oschina.net/qsyan/blog/1858378
———————————————————————————————————————————————-
(47)文章:标题《MyBatis源码解读之延迟加载》,阅读数:1000,链接:https://my.oschina.net/wenjinglian/blog/1857581
———————————————————————————————————————————————–
(48)文章:标题《关于Eureka 2.x,别再人云亦云了!》,阅读数:8900,链接:https://my.oschina.net/eacdy/blog/1844423
———————————————————————————————————————————————-
(49)文章:标题《花一天半写了个http暴力压测工具,每秒可轰出83万个http请求,支持pipeline》,阅读数:4700,链接:https://my.oschina.net/talenttan/blog/1843645
———————————————————————————————————————————————
(50)文章:标题《性能优化之永恒之道(1)(实时sql优化vs业务字段冗余vs离线计算)》,阅读数:3700,链接:https://my.oschina.net/u/2371923/blog/1841088
——————————————————————————————————————————————–
(51)文章:标题《惊艳,Dubbo域名已改,也不再局限于Java!》,阅读数:2800,链接:https://my.oschina.net/javaroad/blog/1843305
——————————————————————————————————————————————–
(52)文章:标题《Zookeeper入门看这篇就够了》,阅读数:2400,链接:https://my.oschina.net/u/3796575/blog/1845035
———————————————————————————————————————————————-
(53)文章:标题《[喵咪Liunx(7)]Ceph分布式文件共享解决方案》,阅读数:1000,链接:https://my.oschina.net/wenzhenxi/blog/1845710
———————————————————————————————————————————————
(54)文章:标题《Spring核心——FactoryBean》,阅读数:1000,链接:https://my.oschina.net/chkui/blog/1845123
———————————————————————————————————————————————
(55)文章:标题《Spring Boot搭建Web项目要点》,阅读数:1000,链接:https://my.oschina.net/woter/blog/1842970
——————————————————————————————————————————————-
(56)文章:标题《 3个面试中遇到的问题》,阅读数:1000,链接:https://my.oschina.net/floor/blog/1841962
——————————————————————————————————————————————–
(57)文章:标题《Spring核心——IOC处理器扩展》,阅读数:1000,链接:https://my.oschina.net/chkui/blog/1840824
——————————————————————————————————————————————–
(58)文章:标题《RabbitMQ使用分析和高可用集群搭建》,阅读数:4700,链接:https://my.oschina.net/genghz/blog/1840262
———————————————————————————————————————————————-
(59)文章:标题《Spring Cloud Gateway 原生的接口限流该怎么玩》,阅读数:3200,链接:https://my.oschina.net/giegie/blog/1838560
———————————————————————————————————————————————-
(60)文章:标题《浅谈设计模式之建造者模式》,阅读数:2700,链接:https://my.oschina.net/lihaoshan/blog/1839623
———————————————————————————————————————————————-
(61)文章:标题《Spring核心——Bean的定义与控制》,阅读数:2200,链接:https://my.oschina.net/chkui/blog/1837039
———————————————————————————————————————————————–
(62)文章:标题《Netty(二) 从线程模型的角度看 Netty 为什么是高性能的?》,阅读数:1000,链接:https://my.oschina.net/crossoverjie/blog/1840429
———————————————————————————————————————————————
(63)文章:标题《Spring Boot Admin 2 值得了解的新变化》,阅读数:1000,链接:https://my.oschina.net/giegie/blog/1839116
———————————————————————————————————————————————-
(64)文章:标题《【Jenkins】构建并部署SpringBoot》,阅读数:1000,链接:https://my.oschina.net/gmarshal/blog/1838776
———————————————————————————————————————————————-
(65)文章:标题《十分钟学会用docker部署微服务》,阅读数:1000,链接:https://my.oschina.net/u/3796575/blog/1838385
———————————————————————————————————————————————
(66)文章:标题《初体验Jenkins安装并进行Maven项目自动化部署》,阅读数:1000,链接:https://my.oschina.net/xshuai/blog/1837180
———————————————————————————————————————————————
(67)文章:标题《Tomcat启动慢问题,追根溯源,死磕到底》,阅读数:1000,链接:https://my.oschina.net/u/3896931/blog/1837148
——————————————————————————————————————————————–
(68)文章:标题《从一份配置清单详解Nginx服务器配置》,阅读数:4700,链接:https://my.oschina.net/hansonwang99/blog/1835408
——————————————————————————————————————————————–
(69)文章:标题《Elasticsearch 6.3 SQL功能使用案例分享》,阅读数:3500,链接:https://my.oschina.net/bboss/blog/1834375
———————————————————————————————————————————————-
(70)文章:标题《oAuth2 升级Spring Cloud Finchley.RELEASE踩坑分享 》,阅读数:2900,链接:https://my.oschina.net/giegie/blog/1834899
——————————————————————————————————————————————-
(71)文章:标题《Spring核心——设计模式与IoC》,阅读数:1000,链接:https://my.oschina.net/chkui/blog/1835837
——————————————————————————————————————————————–
(72)文章:标题《Spring Boot2.0 整合mybatis、分页插件、druid》,阅读数:1000,链接:https://my.oschina.net/bianxin/blog/1835680
—————————————————————————————————————————————–
(73)文章:标题《Spring boot整合ElasticSearch案例分享》,阅读数:1000,链接:https://my.oschina.net/bboss/blog/1835601
———————————————————————————————————————————————-
(74)文章:标题《MyBatis四大核心概念》,阅读数:1000,链接:https://my.oschina.net/waylau/blog/1833780
———————————————————————————————————————————————
(75)文章:标题《t-io 集群解决方案以及源码解析》,阅读数:3900,链接:https://my.oschina.net/zyw205/blog/1827495
———————————————————————————————————————————————
(76)文章:标题《为什么 PHP 程序员应该学习使用 Swoole》,阅读数:3700,链接:https://my.oschina.net/u/1244455/blog/1831238
——————————————————————————————————————————————-
(77)文章:标题《Springboot 应用部署建议》,阅读数:1000,链接:https://my.oschina.net/seal90/blog/1828876
——————————————————————————————————————————————-
(78)文章:标题《Intellij IDEA神器那些让人爱不释手的小技巧》,阅读数:7000,链接:https://my.oschina.net/samgege/blog/1823645
———————————————————————————————————————————————
(79)文章:标题《http2.0 –速度与激情》,阅读数:5200,链接:https://my.oschina.net/u/861562/blog/1823472
——————————————————————————————————————————————
(80)文章:标题《MySQL-性能优化-索引和查询优化》,阅读数:3800,链接:https://my.oschina.net/qrmc/blog/1822373
———————————————————————————————————————————————
(81)文章:标题《SpringBoot应用部署于外置Tomcat容器》,阅读数:2700,链接:https://my.oschina.net/hansonwang99/blog/1824245
——————————————————————————————————————————————-
(82)文章:标题《Tomcat Session管理分析》,阅读数:2600,链接:https://my.oschina.net/OutOfMemory/blog/1825123
———————————————————————————————————————————————
(83)文章:标题《用t-io花5分钟写个udp玩玩,顺便发上100万条消息》,阅读数:2200,链接:https://my.oschina.net/talenttan/blog/1823774
———————————————————————————————————————————————
(84)文章:标题《世界杯快到了,联想,华为又搞出大动作了!》,阅读数:6500,链接:https://my.oschina.net/osczb/blog/1820317
———————————————————————————————————————————————-
(85)文章:标题《MySQL-性能优化-优化设计和设计原则》,阅读数:4200,链接:https://my.oschina.net/qrmc/blog/1819509
———————————————————————————————————————————————
(86)文章:标题《RESTFul 服务测试自动化的艺术 – TODO 服务篇》,阅读数:3600,链接:https://my.oschina.net/greenlaw110/blog/1821431
———————————————————————————————————————————————–
(87)文章:标题《Feign2.0用Apache的Httpclient发送请求并配置连接池》,阅读数:1000,链接:https://my.oschina.net/bianxin/blog/1821684
——————————————————————————————————————————————
(88)文章:标题《从linux源码看socket的close》,阅读数:1000,链接:https://my.oschina.net/alchemystar/blog/1821680
———————————————————————————————————————————————
(89)文章:标题《Netty(一) SpringBoot 整合长连接心跳机制》,阅读数:1000,链接:https://my.oschina.net/crossoverjie/blog/1820353
——————————————————————————————————————————————-
(90)文章:标题《Eureka2.0集群 高可用的认证服务实现与搭建》,阅读数:1000,链接:https://my.oschina.net/bianxin/blog/1819947
———————————————————————————————————————————————
(91)文章:标题《Why c++ coroutine?Why libgo?》,阅读数:4000,链接:https://my.oschina.net/yyzybb/blog/1817226
——————————————————————————————————————————————–
(92)文章:标题《中国人自己的框架——蚂蚁金服RPC框架结构分析》,阅读数:1000,链接:https://my.oschina.net/u/3807747/blog/1819010
——————————————————————————————————————————————–
(93)文章:标题《一场版本升级引发的性能血案的追凶过程》,阅读数:2700,链接:https://my.oschina.net/greenlaw110/blog/1815959
——————————————————————————————————————————————-
(94)文章:标题《RPC框架实践之:Google gRPC》,阅读数:2700,链接:https://my.oschina.net/hansonwang99/blog/1815743
———————————————————————————————————————————————-
(95)文章:标题《OpenApi开放平台架构实践》,阅读数:1000,链接:https://my.oschina.net/u/2476168/blog/1815482
——————————————————————————————————————————————–
(96)文章:标题《基于Docker搭建MySQL主从复制》,阅读数:3400,链接:https://my.oschina.net/u/3773384/blog/1810111
———————————————————————————————————————————————–
(97)文章:标题《使用 maven 生成一个支持端到端自动测试的 RESTful 服务项目脚手架》,阅读数:2600,链接:https://my.oschina.net/greenlaw110/blog/1811714
———————————————————————————————————————————————
(98)文章:标题《深入浅出设计模式——从球赛中悟多例模式》,阅读数:1000,链接:https://my.oschina.net/jack90john/blog/1813483
——————————————————————————————————————————————–
(99)文章:标题《理解 Dubbo SPI 扩展机制》,阅读数:1000,链接:https://my.oschina.net/j4love/blog/1813040
——————————————————————————————————————————————–
(100)文章:标题《Intellij IDEA神器居然还有这些小技巧》,阅读数:13100,链接:https://my.oschina.net/samgege/blog/1808622
———————————————————————————————————————————————–
(101)文章:标题《秒杀架构实践》,阅读数:3700,链接:https://my.oschina.net/crossoverjie/blog/1809257
———————————————————————————————————————————————-
(102)文章:标题《利用Zipkin追踪Mysql数据库调用链》,阅读数:2400,链接:https://my.oschina.net/hansonwang99/blog/1807943
——————————————————————————————————————————————–
(103)文章:标题《接口方法上的注解无法被@Aspect声明的切面拦截的原因分析》,阅读数:2100,链接:https://my.oschina.net/guangshan/blog/1808373
———————————————————————————————————————————————-
(104)文章:标题《Spring boot 前后台分离项目 怎么处理spring security 抛出的异常》,阅读数:1000,链接:https://my.oschina.net/liululee/blog/1808027
———————————————————————————————————————————————
(105)文章:标题《透过现象看原理:详解Spring中Bean的this调用导致AOP失效的原因》,阅读数:1000,链接:https://my.oschina.net/guangshan/blog/1807721
———————————————————————————————————————————————
(106)文章:标题《用t-io来写一个网页聊天室或客服是个怎样的体验》,阅读数:11400,链接:https://my.oschina.net/talenttan/blog/1806324
——————————————————————————————————————————————–
(107)文章:标题《Spring Boot应用监控实战》,阅读数:4500,链接:https://my.oschina.net/hansonwang99/blog/1805402
———————————————————————————————————————————————
(108)文章:标题《Spring Boot 2.0.1 入门教程》,阅读数:1000,链接:https://my.oschina.net/u/3819492/blog/1805170
——————————————————————————————————————————————–
(109)文章:标题《Quartz调度源码分析》,阅读数:3100,链接:https://my.oschina.net/OutOfMemory/blog/1800560
———————————————————————————————————————————————
(110)文章:标题《快速集成Elasticsearch Restful API案例分享》,阅读数:2600,链接:https://my.oschina.net/bboss/blog/1801273
———————————————————————————————————————————————
(111)文章:标题《SpringCloud 之 Zuul 源代码详细笔记》,阅读数:1000,链接:https://my.oschina.net/alexqdjay/blog/1802503
———————————————————————————————————————————————-
(112)文章:标题《Ubuntu 编译ffmpeg 实现GPU 转码》,阅读数:3400,链接:https://my.oschina.net/u/2950272/blog/1796874
———————————————————————————————————————————————–
(113)文章:标题《数据权限管理中心 – 基于mybatis拦截器实现》,阅读数:2700,链接:https://my.oschina.net/gmarshal/blog/1797026
———————————————————————————————————————————————-
(114)文章:标题《完全读懂Spring框架之AOP实现原理》,阅读数:2000,链接:https://my.oschina.net/guangshan/blog/1797461
———————————————————————————————————————————————–
 

作者:TSMYK