首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

python:爬虫入门

直接上代码吧: 一、爬取某外卖平台的指定商家菜品信息 from urllib import request import json import random url = "https://www.ele.me/restapi/shopping/v2/menu?restaurant_id=1392240&terminal=web" # 多搞几个user-agent 看上去更真实点~_^ user_agents = [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36 QQBrowser/4.3.4986.400', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0'] random_user_agent = user_agents[random.randint(0, len(user_agents) - 1)] page = request.Request(url, headers={'User-Agent': random_user_agent}) page_info = request.urlopen(page).read().decode("utf-8") # 该url正好返回的是json数组,直接解析就可以了 menu_json = json.loads(page_info) # 清理一些特殊字符串 def clean_menu_name(name): temp = ["-", "^_^", "\n", "◆"] for s in temp: name = name.replace(s, "") return name for category in menu_json: print("分类名:", clean_menu_name(category["name"])) for food in category["foods"]: print("\t", "菜名:", clean_menu_name(food["name"]), " , 菜ID:", food["item_id"], " , 分类ID:", food["category_id"]) for spec in food["specfoods"]: print("\t\t", "规格ID:", spec["sku_id"], " , 价格:", spec["price"]) 输出: 分类名: 必选品(【必选!】吃法二选一,嘛哩匠心出品) 菜名: 经典骨汤上等豚骨每日现熬 , 菜ID: 17548636051 , 分类ID: 13737658 规格ID: 20830000019 , 价格: 1 菜名: 特色干拌—麻辣拌(招牌,秘制麻酱) , 菜ID: 17548637075 , 分类ID: 13737658 规格ID: 20830001043 , 价格: 1.5 分类名: 热销 菜名: 经典骨汤上等豚骨每日现熬 , 菜ID: 17548636051 , 分类ID: 13737658 规格ID: 20830000019 , 价格: 1 菜名: 娃娃菜 , 菜ID: 17548706707 , 分类ID: 13737835 规格ID: 20830070675 , 价格: 3 菜名: 精品肥牛 , 菜ID: 17548664723 , 分类ID: 13737800 规格ID: 20830028691 , 价格: 5.5 菜名: 金针菇 , 菜ID: 17548711827 , 分类ID: 13737835 规格ID: 20830075795 , 价格: 3 菜名: 土豆 , 菜ID: 17548693395 , 分类ID: 13737835 规格ID: 20830057363 , 价格: 2.5 菜名: 特色干拌—麻辣拌(招牌,秘制麻酱) , 菜ID: 17548637075 , 分类ID: 13737658 规格ID: 20830001043 , 价格: 1.5 菜名: 精品蟹肉棒 , 菜ID: 17548654483 , 分类ID: 13737790 规格ID: 20830018451 , 价格: 4 菜名: 冬瓜 , 菜ID: 17548694419 , 分类ID: 13737835 规格ID: 20830058387 , 价格: 2.5 菜名: 梅林午餐肉 , 菜ID: 17548656531 , 分类ID: 13737790 规格ID: 20830020499 , 价格: 5.5 菜名: 【人气】秘制麻酱芝麻花生酱 , 菜ID: 17548638099 , 分类ID: 13737698 规格ID: 20830002067 , 价格: 1 分类名: 优惠 菜名: 招牌霸道~经典荤素~套餐 , 菜ID: 200000173605996435 , 分类ID: 1238754176 规格ID: 200000199013771155 , 价格: 29.4 菜名: 招牌霸道~素食主义~套餐 , 菜ID: 200000173616109459 , 分类ID: 1238754176 规格ID: 200000199009531795 , 价格: 25.2 分类名: Hi~嘛哩来袭咯~ 菜名: 有问题?找嘛哩!~ , 菜ID: 200000173483983763 , 分类ID: 1238743250 规格ID: 200000198867809171 , 价格: 0.01 分类名: 【不得不吃】秘制酱料匠心出品 菜名: 【人气】秘制麻酱芝麻花生酱 , 菜ID: 17548638099 , 分类ID: 13737698 规格ID: 20830002067 , 价格: 1 菜名: 香辣酱 , 菜ID: 17548639123 , 分类ID: 13737698 规格ID: 20830003091 , 价格: 1 菜名: 沙茶酱 , 菜ID: 17548640147 , 分类ID: 13737698 规格ID: 20830004115 , 价格: 1 菜名: 菌菇酱 , 菜ID: 17548642195 , 分类ID: 13737698 规格ID: 20830006163 , 价格: 1 分类名: 【必选】麻辣在舌尖(口味选择) 菜名: 不麻+不辣 , 菜ID: 17548643219 , 分类ID: 13737734 规格ID: 20830007187 , 价格: 0 菜名: 微麻+微辣 , 菜ID: 17548644243 , 分类ID: 13737734 规格ID: 20830008211 , 价格: 0 菜名: 中麻+中辣 , 菜ID: 17548645267 , 分类ID: 13737734 规格ID: 20830009235 , 价格: 0 菜名: 重麻+重辣 , 菜ID: 17548646291 , 分类ID: 13737734 规格ID: 20830010259 , 价格: 0 分类名: 【可选】调味小料区(放碗里,不单独打包) 菜名: 香葱 , 菜ID: 17548647315 , 分类ID: 13737756 规格ID: 20830011283 , 价格: 0.1 菜名: 蒜泥 , 菜ID: 17548648339 , 分类ID: 13737756 规格ID: 20830012307 , 价格: 0.1 菜名: 醋 , 菜ID: 17548649363 , 分类ID: 13737756 规格ID: 20830013331 , 价格: 0.1 分类名: 人气特色榜单 菜名: 冻豆腐 , 菜ID: 17548650387 , 分类ID: 13737790 规格ID: 20830014355 , 价格: 3.5 菜名: 成都酥肉 , 菜ID: 17548651411 , 分类ID: 13737790 规格ID: 20830015379 , 价格: 4.5 菜名: 芝士年糕 , 菜ID: 17548653459 , 分类ID: 13737790 规格ID: 20830017427 , 价格: 4 菜名: 精品蟹肉棒 , 菜ID: 17548654483 , 分类ID: 13737790 规格ID: 20830018451 , 价格: 4 菜名: 荠菜丸子 , 菜ID: 17548655507 , 分类ID: 13737790 规格ID: 20830019475 , 价格: 3.5 菜名: 梅林午餐肉 , 菜ID: 17548656531 , 分类ID: 13737790 规格ID: 20830020499 , 价格: 5.5 菜名: 哈尔滨红肠 , 菜ID: 17548657555 , 分类ID: 13737790 规格ID: 20830021523 , 价格: 4 菜名: 甜玉米 , 菜ID: 17548658579 , 分类ID: 13737790 规格ID: 20830022547 , 价格: 3.5 菜名: 牛百叶 , 菜ID: 17548659603 , 分类ID: 13737790 规格ID: 20830023571 , 价格: 5 分类名: 精品荤菜 菜名: 燕饺 , 菜ID: 17548690323 , 分类ID: 13737800 规格ID: 20830054291 , 价格: 4 菜名: 广味香肠 , 菜ID: 17548691347 , 分类ID: 13737800 规格ID: 20830055315 , 价格: 4 菜名: 川味香肠 , 菜ID: 17548692371 , 分类ID: 13737800 规格ID: 20830056339 , 价格: 4 菜名: 培根 , 菜ID: 17548660627 , 分类ID: 13737800 规格ID: 20830024595 , 价格: 3.5 菜名: 鸡胗 , 菜ID: 17548661651 , 分类ID: 13737800 规格ID: 20830025619 , 价格: 4 菜名: 里脊肉 , 菜ID: 17548662675 , 分类ID: 13737800 规格ID: 20830026643 , 价格: 3.5 菜名: 骨肉相连 , 菜ID: 17548663699 , 分类ID: 13737800 规格ID: 20830027667 , 价格: 4 菜名: 精品肥牛 , 菜ID: 17548664723 , 分类ID: 13737800 规格ID: 20830028691 , 价格: 5.5 菜名: 鲜腐皮虾卷 , 菜ID: 200000176127363987 , 分类ID: 13737800 规格ID: 200000202129068947 , 价格: 4.9 菜名: 蟹粉包 , 菜ID: 17548668819 , 分类ID: 13737800 规格ID: 20830032787 , 价格: 3 菜名: 海胆包 , 菜ID: 17548669843 , 分类ID: 13737800 规格ID: 20830033811 , 价格: 3 菜名: 蛋饺 , 菜ID: 17548670867 , 分类ID: 13737800 规格ID: 20830034835 , 价格: 3.5 菜名: 千叶豆腐 , 菜ID: 17548671891 , 分类ID: 13737800 规格ID: 20830035859 , 价格: 3 菜名: 鱼皮豆腐 , 菜ID: 17548672915 , 分类ID: 13737800 规格ID: 20830036883 , 价格: 3 菜名: 深海鱼蛋丸 , 菜ID: 200000176114181011 , 分类ID: 13737800 规格ID: 200000202122663827 , 价格: 4 菜名: 墨鱼丸 , 菜ID: 17548674963 , 分类ID: 13737800 规格ID: 20830038931 , 价格: 4.5 菜名: 包心贡丸 , 菜ID: 17548675987 , 分类ID: 13737800 规格ID: 20830039955 , 价格: 4.5 菜名: 撒尿牛丸 , 菜ID: 17548677011 , 分类ID: 13737800 规格ID: 20830040979 , 价格: 4.5 菜名: 龙虾丸 , 菜ID: 17548678035 , 分类ID: 13737800 规格ID: 20830042003 , 价格: 4.5 菜名: 北极翅 , 菜ID: 17548680083 , 分类ID: 13737800 规格ID: 20830044051 , 价格: 4 菜名: 玉米肠 , 菜ID: 17548682131 , 分类ID: 13737800 规格ID: 20830046099 , 价格: 4 菜名: 开花肠 , 菜ID: 17548683155 , 分类ID: 13737800 规格ID: 20830047123 , 价格: 3.5 菜名: 亲亲肠 , 菜ID: 17548684179 , 分类ID: 13737800 规格ID: 20830048147 , 价格: 3.5 菜名: 大红肠 , 菜ID: 17548686227 , 分类ID: 13737800 规格ID: 20830050195 , 价格: 4 分类名: 蔬菜菌类 菜名: 土豆 , 菜ID: 17548693395 , 分类ID: 13737835 规格ID: 20830057363 , 价格: 2.5 菜名: 冬瓜 , 菜ID: 17548694419 , 分类ID: 13737835 规格ID: 20830058387 , 价格: 2.5 菜名: 藕片 , 菜ID: 17548695443 , 分类ID: 13737835 规格ID: 20830059411 , 价格: 3 菜名: 莴笋 , 菜ID: 17548696467 , 分类ID: 13737835 规格ID: 20830060435 , 价格: 3 菜名: 白萝卜 , 菜ID: 17548697491 , 分类ID: 13737835 规格ID: 20830061459 , 价格: 2 菜名: 生菜 , 菜ID: 17548699539 , 分类ID: 13737835 规格ID: 20830063507 , 价格: 2.5 菜名: 茼蒿菜 , 菜ID: 17548700563 , 分类ID: 13737835 规格ID: 20830064531 , 价格: 3 菜名: 香菜 , 菜ID: 17548701587 , 分类ID: 13737835 规格ID: 20830065555 , 价格: 3 菜名: 菠菜 , 菜ID: 17548702611 , 分类ID: 13737835 规格ID: 20830066579 , 价格: 3 菜名: 油麦菜 , 菜ID: 17548703635 , 分类ID: 13737835 规格ID: 20830067603 , 价格: 2.5 菜名: 小青菜 , 菜ID: 17548705683 , 分类ID: 13737835 规格ID: 20830069651 , 价格: 2.5 菜名: 娃娃菜 , 菜ID: 17548706707 , 分类ID: 13737835 规格ID: 20830070675 , 价格: 3 菜名: 有机花菜 , 菜ID: 17548707731 , 分类ID: 13737835 规格ID: 20830071699 , 价格: 3.5 菜名: 西兰花 , 菜ID: 17548708755 , 分类ID: 13737835 规格ID: 20830072723 , 价格: 3.5 菜名: 西红柿 , 菜ID: 17548709779 , 分类ID: 13737835 规格ID: 20830073747 , 价格: 3 菜名: 海带结 , 菜ID: 17548710803 , 分类ID: 13737835 规格ID: 20830074771 , 价格: 2.5 菜名: 金针菇 , 菜ID: 17548711827 , 分类ID: 13737835 规格ID: 20830075795 , 价格: 3 菜名: 香菇 , 菜ID: 17548712851 , 分类ID: 13737835 规格ID: 20830076819 , 价格: 3 菜名: 秀珍菇 , 菜ID: 17548713875 , 分类ID: 13737835 规格ID: 20830077843 , 价格: 3 菜名: 海鲜菇 , 菜ID: 17548714899 , 分类ID: 13737835 规格ID: 20830078867 , 价格: 3.5 菜名: 黑木耳 , 菜ID: 17548715923 , 分类ID: 13737835 规格ID: 20830079891 , 价格: 3 菜名: 红薯 , 菜ID: 17548717971 , 分类ID: 13737835 规格ID: 20830081939 , 价格: 2.5 菜名: 特级笋尖/水笋 , 菜ID: 17548718995 , 分类ID: 13737835 规格ID: 20830082963 , 价格: 4 分类名: 豆蛋类 菜名: 油豆腐 , 菜ID: 17548716947 , 分类ID: 13737840 规格ID: 20830080915 , 价格: 3 菜名: 日本豆腐 , 菜ID: 17548721043 , 分类ID: 13737840 规格ID: 20830085011 , 价格: 3 菜名: 绿豆芽 , 菜ID: 17548722067 , 分类ID: 13737840 规格ID: 20830086035 , 价格: 2 菜名: 豆腐皮 , 菜ID: 17548723091 , 分类ID: 13737840 规格ID: 20830087059 , 价格: 2.5 菜名: 厚百叶 , 菜ID: 17548724115 , 分类ID: 13737840 规格ID: 20830088083 , 价格: 3 菜名: 腐竹 , 菜ID: 17548725139 , 分类ID: 13737840 规格ID: 20830089107 , 价格: 3 菜名: 鸭血 , 菜ID: 17548726163 , 分类ID: 13737840 规格ID: 20830090131 , 价格: 3 菜名: 鹌鹑蛋 , 菜ID: 17548727187 , 分类ID: 13737840 规格ID: 20830091155 , 价格: 2.5 菜名: 油面筋 , 菜ID: 17548728211 , 分类ID: 13737840 规格ID: 20830092179 , 价格: 2.5 菜名: 油条 , 菜ID: 17548729235 , 分类ID: 13737840 规格ID: 20830093203 , 价格: 2.5 分类名: 主食类 菜名: 锅巴 , 菜ID: 17548730259 , 分类ID: 13737847 规格ID: 20830094227 , 价格: 2.5 菜名: 方便面 , 菜ID: 17548731283 , 分类ID: 13737847 规格ID: 20830095251 , 价格: 3 菜名: 鸡蛋面 , 菜ID: 17548732307 , 分类ID: 13737847 规格ID: 20830096275 , 价格: 2.5 菜名: 红薯宽粉 , 菜ID: 17548733331 , 分类ID: 13737847 规格ID: 20830097299 , 价格: 3 菜名: 红薯细粉 , 菜ID: 17548734355 , 分类ID: 13737847 规格ID: 20830098323 , 价格: 3 菜名: 蒙古宽粉 , 菜ID: 17548735379 , 分类ID: 13737847 规格ID: 20830099347 , 价格: 3 菜名: 手工细面 , 菜ID: 17548736403 , 分类ID: 13737847 规格ID: 20830100371 , 价格: 2.5 菜名: 刀削面 , 菜ID: 17548737427 , 分类ID: 13737847 规格ID: 20830101395 , 价格: 3 菜名: 玉米面条 , 菜ID: 17548738451 , 分类ID: 13737847 规格ID: 20830102419 , 价格: 4 菜名: 魔芋丝结 , 菜ID: 17548739475 , 分类ID: 13737847 规格ID: 20830103443 , 价格: 5 菜名: 龙口粉丝 , 菜ID: 17548740499 , 分类ID: 13737847 规格ID: 20830104467 , 价格: 4 菜名: 年糕节 , 菜ID: 17548741523 , 分类ID: 13737847 规格ID: 20830105491 , 价格: 2 分类名: 饿了么送红包 菜名: 扫码领红包 , 菜ID: 260439795603 , 分类ID: 526021154 规格ID: 301159743379 , 价格: 0.01 分类名: 霸道总裁套餐 菜名: 招牌霸道~经典荤素~套餐 , 菜ID: 200000173605996435 , 分类ID: 1238754176 规格ID: 200000199013771155 , 价格: 29.4 菜名: 招牌霸道~素食主义~套餐 , 菜ID: 200000173616109459 , 分类ID: 1238754176 规格ID: 200000199009531795 , 价格: 25.2 二、抓取博客园某园友的首页文章列表 以我自己的博客为例: from urllib import request import random from bs4 import BeautifulSoup url = "http://yjmyzz.cnblogs.com/" # 多搞几个user-agent 看上去更真实点~_^ user_agents = [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36 QQBrowser/4.3.4986.400', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0'] random_user_agent = user_agents[random.randint(0, len(user_agents) - 1)] page = request.Request(url, headers={'User-Agent': random_user_agent}) html = request.urlopen(page).read().decode("utf-8") bsObj = BeautifulSoup(html, "lxml") # 找出标题的a链接 title_links = bsObj.find_all("a", {"class": "postTitle2"}) with open("blog.csv", "a", encoding='utf-8') as f: i = 0 for link in title_links: i += 1 print(str(i), "\t", link.string, "\t", link["href"]) # 保存到csv文件中 f.write(str(i) + "\t" + link.string + "\t" + link["href"] + "\n") 注:BeautifulSoup是一个专门的解析html/xml的模块,贼好用。 输出如下: 1 [置顶]关于博客的背景音乐 http://www.cnblogs.com/yjmyzz/p/listen-to-your-heart.html 2 python: 序列化/反序列化及对象的深拷贝/浅拷贝 http://www.cnblogs.com/yjmyzz/p/python-serialization-and-object-copy.html 3 python中的zip、lambda、map操作 http://www.cnblogs.com/yjmyzz/p/python-zip-lambda-map.html 4 python面向对象笔记 http://www.cnblogs.com/yjmyzz/p/python-object-oriented-programming.html 5 RxJava2学习笔记(3) http://www.cnblogs.com/yjmyzz/p/rx-java-2-tutorial-3.html 6 RxJava2学习笔记(2) http://www.cnblogs.com/yjmyzz/p/rx-java-2-tutorial-2.html 7 RxJava2学习笔记(1) http://www.cnblogs.com/yjmyzz/p/rx-java-2-tutorial-1.html 8 Matplotlib新手上路(下) http://www.cnblogs.com/yjmyzz/p/matplotlib-tutorial-3.html 9 Matplotlib新手上路(中) http://www.cnblogs.com/yjmyzz/p/matplotlib-tutorial-2.html 10 Matplotlib新手上路(上) http://www.cnblogs.com/yjmyzz/p/matplotlib-tutorial-1.html 11 pycharm如何设置python版本、设置国内pip镜像、添加第三方类库 http://www.cnblogs.com/yjmyzz/p/pycharm-add-third-package-and-add-domestic-mirror.html 12 利用java8对设计模式的重构 http://www.cnblogs.com/yjmyzz/p/refactor-design-pattern-using-java8.html 13 机器学习笔记(6):多类逻辑回归-使用gluon http://www.cnblogs.com/yjmyzz/p/8128122.html 14 spring cloud:Edgware.RELEASE版本hystrix超时新坑 http://www.cnblogs.com/yjmyzz/p/8097713.html 15 spring cloud:Edgware.RELEASE版本中zuul回退方法的变化 http://www.cnblogs.com/yjmyzz/p/8093462.html 16 spring cloud:config-server中@RefreshScope的"陷阱" http://www.cnblogs.com/yjmyzz/p/8085530.html 17 机器学习笔记(5):多类逻辑回归-手动添加隐藏层 http://www.cnblogs.com/yjmyzz/p/8035041.html 18 机器学习笔记(4):多类逻辑回归-使用gluton http://www.cnblogs.com/yjmyzz/p/8034597.html 19 spring boot + embed tomcat + standalone jar的内存泄露问题 http://www.cnblogs.com/yjmyzz/p/the-memory-leak-problem-of-spring-boot-with-embed-tomcat.html 20 机器学习笔记(3):多类逻辑回归 http://www.cnblogs.com/yjmyzz/p/7789252.html 21 归一化(softmax)、信息熵、交叉熵 http://www.cnblogs.com/yjmyzz/p/7822990.html 22 NDArray自动求导 http://www.cnblogs.com/yjmyzz/p/7783286.html 23 机器学习笔记(2):线性回归-使用gluon http://www.cnblogs.com/yjmyzz/p/7774166.html 24 机器学习笔记(1):线性回归 http://www.cnblogs.com/yjmyzz/p/7764496.html 25 mxnet安装及NDArray初体验 http://www.cnblogs.com/yjmyzz/p/mxnet-install-and-ndarray-demo.html 26 jupyter notebook 在mac OS上的安装 http://www.cnblogs.com/yjmyzz/p/how-to-install-jupyter-notebook-on-mac.html 27 spring cloud 学习(11) - 用fastson替换jackson及用gb2312码输出 http://www.cnblogs.com/yjmyzz/p/spring-cloud-set-response-gbk-encoding.html 28 spring cloud 学习(10) - 利用springfox集成swagger http://www.cnblogs.com/yjmyzz/p/how-to-integrate-swagger-with-spring-cloud-by-springfox.html 29 spring-boot 速成(12) - 如何注入多个redis StringRedisTemplate http://www.cnblogs.com/yjmyzz/p/how-to-inject-multi-redis-instance-in-spring-boot.html 30 spring cloud 学习(9) - turbine stream无法在eureka注册的解决办法 http://www.cnblogs.com/yjmyzz/p/spring-cloud-turbine-eureka-register-problem.html 31 java:线上问题排查常用手段 http://www.cnblogs.com/yjmyzz/p/7478266.html 32 java一些常用并发工具示例 http://www.cnblogs.com/yjmyzz/p/java-concurrent-tools-sample.html 33 kafka集群部署 http://www.cnblogs.com/yjmyzz/p/kafka-cluster-deployment.html 34 spring cloud 学习(8) - sleuth & zipkin 调用链跟踪 http://www.cnblogs.com/yjmyzz/p/spring-cloud-with-zipkin.html 35 spring集成kafka http://www.cnblogs.com/yjmyzz/p/spring-integration-with-kafka.html 36 @Transactional导致AbstractRoutingDataSource动态数据源无法切换的解决办法 http://www.cnblogs.com/yjmyzz/p/7390331.html 37 centos上安装elasticsearch 5.5.1 遇到的各种坑 http://www.cnblogs.com/yjmyzz/p/7372561.html 38 spring cloud 学习(7) - 生产环境如何不停机热发布? http://www.cnblogs.com/yjmyzz/p/how-to-hot-release-using-eureka-rest-operation.html 39 spring-boot 速成(11) - 单元测试 http://www.cnblogs.com/yjmyzz/p/unit-test-with-spring-boot.html 40 spring-boot 速成(10) -【个人邮箱/企业邮箱】发送邮件 http://www.cnblogs.com/yjmyzz/p/send-mail-using-spring-boot.html 41 spring cloud 学习(6) - zuul 微服务网关 http://www.cnblogs.com/yjmyzz/p/spring-cloud-zuul-demo.html csv文件打开截图: 参考文档: http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/ 作者: 菩提树下的杨过 出处: http://yjmyzz.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

优秀的个人博客,低调大师

快应用入门

小程序自2016年推出以来,可以说是一路火爆,更是改写了移动互联网的格局,开辟了另一流量战场。正所谓,“哪里有商机哪里就有竞争”,据报道,中国九大安卓手机厂商华为、小米、OPPO、vivo、中兴、金立、联想、魅族、努比亚联起手来共同对抗微信小程序的迅猛扩张,他们将于3月20日将共同启动「快应用」标准,打造移动应用新生态,目的是遏制急剧扩张的微信小程序。 快应用简介 什么是快应用,快应用具有哪些特点: 1. 快应用是基于手机硬件平台的新型应用形态,标准是由主流手机厂商组成的快应用联盟联合制定。 2. 快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台,以平台化的生态模式对个人开发者和企业开发者全品类开放。 3. 快应用具备传统APP完整的应用体验,无需安装、即点即用。 打开华为市场,搜索“快应用”,可以看到很多的厂商已经上线了快应用。 点击一个运行,其体验丝毫不比原生体验差,下面是录的一个gif动画。 目前,并非所有的平台都上线了快应用,目前还有很多的厂商还在开发中,目前提供快应用的厂商有:小米、华为、金立。魅族、努比亚、OPPO、ViVo,其他平台目前还在开发中。 快应用上手 官网:https://www.quickapp.cn/ 开发文档:https://doc.quickapp.cn/ 既然是快应用,那就是快、方便。快应用使用JavaScript编写,部署即可见。那么如何搭建一个快应用并发布到应用市场呢?本文就这方面给大家做一个整理。 环境搭建 1,安装Node 任何使用JavaScript进行开发的平台都会用到Node,Node可以下载安装,下载的官方地址为:https://nodejs.org/en/download/。 2,安装hap-toolkit 使用npm安装命令安装hap-toolkit: npm install -g hap-toolkit 1 安装完成后,可以通过查看版本来确认是否安装成功。 hap -V 1 3,创建HelloWorld 快应用目前没有很好的开发工具,可以选择前端比较出名的一些开发工具来开发,如WebStrom、IDEA、vscode等。为了演示,本文以命令行的方式来创建一个HelloWorld项目。 创建一个快应用文件夹,选择一个合适文件,使用命令创建项目: hap init <ProjectName> 1 其中,ProjectName为你的项目名称,完成后会显示: prompt: Init your Project: (helloworld) 1 看到这个图不要傻傻等着,点击回车,系统会为你创建一个helloword的快应用。创建完成后,项目的目录结构如图: 然后,切换到helloword目录,执行npm命令行安装依赖包(webpack,babel等): npm install 1 然后,运行如下命令即可在dist目录下生成rpk包。其实,这和vue开发客户端,并使用Hbuilder开发跨平台APP的思路是一致的,有兴趣的童鞋可以了解下。 npm run build 1 注意:如果报错遇到Cannot find module ‘…/webpack.config.js’,请重新执行一次hap update –force。这是由于高版本的npm在npm install时,会校验并删除了node_modules下部分文件夹,导致报错。而hap update –force会重新复制hap-toolkit文件夹到node_modules中。 然后再次执行”npm run build“,即可看到效果。 安装生成的包 下载快应用提供的调试apk文件,并安装到手机上,下载地址:https://statres.quickapp.cn/quickapp/quickapp/201803/file/201803200129552999556.apk 不过对于有些手机你会发现,你安装上之后,什么也干不了,颜色都是灰的。 请注意这很正常,你还需要安装一个平台app 手机安装平台预览版 使用下面地址下载预览版:https://statres.quickapp.cn/quickapp/quickapp/201803/file/201803200130021102030.apk 你安装完成后应该是个白板,啥也没有,正常。你回到之前的安装调试器apk,会发现按钮都可以点击了。然后再次打开即可。 还记得刚才helloworld生成的rpk包么,可以使用以下的命令导入到sd卡中。 adb push xxx.rpk /sdacrd/ 1 push到手机根目录,然后选择本地安装,选择rpk包即可。

优秀的个人博客,低调大师

KM算法入门

KM算法的基本概念: http://baike.baidu.com/view/739278.htm http://baike.baidu.com/view/501092.htm 看这个算法之前,最好先看下匈牙利算法,KM算法 是建立在匈牙利算法基础上实现的 对于这个算法最有误区的地方,个人感觉还是在 X 集合 -d 和 Y 集合 + d之后 还要进行 操作,再加上 深搜递归操作 ,理解容易产生误区,在这里我给出一组模板的测试数据来帮助初学者理解 注意观察: visx[],visy[],lx[],ly[],linky[],在调用中的变化: 3 4 0 0 2 0 1 6 1 1 7 2 1 14 2 2 3 模板:(O ^ 4) #define M 505#define inf 0x3fffffffbool sx[M], sy[M];int match[M], w[M][M], n, m, d, lx[M], ly[M];//n:左集元素个数; m:右集元素个数void init (){ memset (w, 0, sizeof(w)); //不一定要,求最小值一般要初始化为负无穷!}bool dfs (int u){ int v; sx[u] = true; for (v = 0; v < m; v++) { if (!sy[v] && lx[u]+ly[v]==w[u][v]) { sy[v] = true; if (match[v] == -1 || dfs (match[v])) { match[v] = u; return true; } } } return false;}int KM (){ int i, j, k, sum = 0; memset (ly, 0, sizeof(ly)); for (i = 0; i < n; i++) { lx[i] = -inf; for (j = 0; j < m; j++) if (lx[i] < w[i][j]) lx[i] = w[i][j]; } memset (match, -1, sizeof(match)); for (i = 0; i < n; i++) { while (1) { memset (sx, false, sizeof(sx)); memset (sy, false, sizeof(sy)); if (dfs (i)) break; d = inf; for (j = 0; j < n; j++) if (sx[j]) for (k = 0; k < m; k++) if (!sy[k]) d = min (d, lx[j]+ly[k]-w[j][k]); if (d == inf) //找不到完美匹配 return -1; for (j = 0; j < n; j++) if (sx[j]) lx[j] -= d; for (j = 0; j < m; j++) if (sy[j]) ly[j] += d; } } for (i = 0; i < m; i++) if (match[i] > -1) sum += w[match[i]][i]; return sum;} 改进后的模板(O^3) /*其实在求最大 最小的时候只要用一个模板就行了,把边的权值去相反数即可得到另外一个.求结果的时候再去相反数即可*//*最大最小有一些地方不同。。*/#include <iostream>#include<cstring>#include<cstdio>#include<cmath>//赤裸裸的模板啊。。const int maxn = 101;const int INF = (1<<31)-1;int w[maxn][maxn];int lx[maxn],ly[maxn]; //顶标int linky[maxn];int visx[maxn],visy[maxn];int slack[maxn];int nx,ny;bool find(int x){ visx[x] = true; for(int y = 0; y < ny; y++) { if(visy[y]) continue; int t = lx[x] + ly[y] - w[x][y]; if(t==0) { visy[y] = true; if(linky[y]==-1 || find(linky[y])) { linky[y] = x; return true; //找到增广轨 } } else if(slack[y] > t) slack[y] = t; } return false; //没有找到增广轨(说明顶点x没有对应的匹配,与完备匹配(相等子图的完备匹配)不符)}int KM() //返回最优匹配的值{ int i,j; memset(linky,-1,sizeof(linky)); memset(ly,0,sizeof(ly)); for(i = 0; i < nx; i++) for(j = 0,lx[i] = -INF; j < ny; j++) if(w[i][j] > lx[i]) lx[i] = w[i][j]; for(int x = 0; x < nx; x++) { for(i = 0; i < ny; i++) slack[i] = INF; while(true) { memset(visx,0,sizeof(visx)); memset(visy,0,sizeof(visy)); if(find(x)) //找到增广轨,退出 break; int d = INF; for(i = 0; i < ny; i++) //没找到,对l做调整(这会增加相等子图的边),重新找 { if(!visy[i] && d > slack[i]) d = slack[i]; } for(i = 0; i < nx; i++) { if(visx[i]) lx[i] -= d; } for(i = 0; i < ny; i++) { if(visy[i]) ly[i] += d; else slack[i] -= d; } } } int result = 0; for(i = 0; i < ny; i++) if(linky[i]>-1) result += w[linky[i]][i]; return result;}int main(){ // freopen("g:/1.txt","r",stdin); while(true) { scanf("%d%d",&nx,&ny); int a,b,c; while(scanf("%d%d%d",&a,&b,&c),a+b+c) { w[a][b]=c; } printf("%d\n",KM()); break; } return 0;} 题目推荐: 第一题:hdu 2255 奔小康赚大钱 http://acm.hdu.edu.cn/showproblem.php?pid=2255 模板不解释 View Code 第二题:hdu 1533Going Home http://acm.hdu.edu.cn/showproblem.php?pid=1533 用 w[i][j] = -w[i][j]建图再套模板 求最大值 输出【-sum】 View Code 第三题:hdu 1853 Cyclic Tour 注意是有向图,和重边的判断 View Code 第四题:hdu 3488 Tour http://acm.hdu.edu.cn/showproblem.php?pid=3488跟第三题几乎一样 View Code 第五题:hdu 3435 A new Graph Game http://acm.hdu.edu.cn/showproblem.php?pid=3435跟第三题代码基本上一样,只是要双向建图,也有重边 福大 AekdyCoin 出的题,好险的题啊,时间跑了 2000+ ; View Code 第六题: hdu 2426 Interesting Housing Problem http://acm.hdu.edu.cn/showproblem.php?pid=2426 注意 题目输入 |Vi| <= 10000左集是学生,右集是房子,w[i][j] < 0 不可匹配,最后无法完美匹配输出-1 View Code 第七题:hdu 2853 Assignment http://acm.hdu.edu.cn/showproblem.php?pid=2853思路:让原有匹配更有优势就可以了实现:所有权值扩大100倍,原有匹配【例如a匹配b】w[a][b]+ +设结果是res最大值:res/100至少改变个数:n - res%100这种处理比较有意思 View Code 第八题:hdu 3718 http://acm.hdu.edu.cn/showproblem.php?pid=3718题目求的是两字符串的最大相似度思路:因为第一个串的一种字母只能匹配第二个串的一种字母,所以可以转化为求【字母的最大匹配值/n】 注意输入 scanf--%s 不要用 %c%*c View Code 推荐题目链接: http://972169909-qq-com.iteye.com/blog/1184514

优秀的个人博客,低调大师

Kafka实战-入门

1.概述 经过一个多月的时间观察,业务上在集成Kafka后,各方面还算稳定,这里打算抽时间给大家分享一下Kafka在实际场景中的一些使用心得。本篇博客打算先给大家入个门,让大家对Kafka有个初步的了解,知道Kafka是做什么的,下面是本篇博客的目录内容: Kafka背景 Kafka应用场景 Kafka架构原理 下面开始今天的博客分享内容。 2.Kafka背景 Kafka它本质上是一个消息系统,由当时从LinkedIn出来创业的三人小组开发,他们开发出了Apache Kafka实时信息队列技术,该技术致力于为各行各业的公司提供实时数据处理服务解决方案。Kafka为LinkedIn的中枢神经系统,管理从各个应用程序的汇聚,这些数据经过处理后再被分发到其他地方。Kafka不同于传统的企业信息队列系统,它是以近乎实时的方式处理流经一个公司的所有数据,目前已经服务于LinkedIn、Netflix、Uber以及Verizon,并为此建立了实时信息处理平台。 流水数据是所有站点对其网站使用情况做报表时都要用到的数据中最常用的一部分,流水数据包括PV,浏览内容信息以及搜索记录等。这些数据通常是先以日志文件的形式存在,然后有周期的去对这些日志文件进行统计分析处理,然后获得需要的KPI指标结果。 3.Kafka应用场景 我们在接触一门新技术或是新语言时,得明白这门技术(或是语言)的应用场景,也就说要明白它能做什么,服务的对象是谁,下面用一个图来说明,如下图所示: 首先,Kafka可以应用于消息系统,比如,当下较为热门的消息推送,这些消息推送系统的消息源,可以使用Kafka作为系统的核心组建来完成消息的生产和消息的消费。然后是网站的行迹,我们可以将企业的Portal,用户的操作记录等信息发送到Kafka中,按照实际业务需求,可以进行实时监控,或者做离线处理等。最后,一个是日志收集,类似于Flume套件这样的日志收集系统,但Kafka的设计架构采用push/pull,适合异构集群,Kafka可以批量提交消息,对Producer来说,在性能方面基本上是无消耗的,而在Consumer端中,我们可以使用HDFS这类的分布式文件存储系统进行存储。 4.Kafka架构原理 Kafka的设计之初是希望做一个统一的信息收集平台,能够实时的收集反馈信息,并且具有良好的容错能力。Kafka中我们最直观的感受就是它的消费者与生产者,如下图所示: 4.1Producer And Consumer 这里Kafka对消息的保存是根据Topic进行归类的,由消息生产者(Producer)和消息消费者(Consumer)组成,另外,每一个Server称为一个Broker。对于Kafka集群而言,Producer和Consumer都依赖于ZooKeeper来保证数据的一致性。 4.2Topic 在每条消息输送到Kafka集群后,消息都会由一个Type,这个Type被称为一个Topic,不同的Topic的消息是分开存储的。如下图所示: 一个Topic会被归类为一则消息,每个Topic可以被分割为多个Partition,在每条消息中,它在文件中的位置称为Offset,用于标记唯一一条消息。在Kafka中,消息被消费后,消息仍然会被保留一定时间后在删除,比如在配置信息中,文件信息保留7天,那么7天后,不管Kafka中的消息是否被消费,都会被删除;以此来释放磁盘空间,减少磁盘的IO消耗。 在Kafka中,一个Topic的多个分区,被分布在Kafka集群的多个Server上,每个Server负责分区中消息的读写操作。另外,Kafka还可以配置分区需要备份的个数,以便提高可用行。由于用到来ZK来协调,每个分区都有一个Server为Leader状态,服务对外响应(如读写操作),若该Leader宕机,会由其他的Follower来选举出新的Leader来保证集群的高可用性。 5.总结 总体来说,介绍Kafka的相关背景,概述及原理,这些较为偏理论,概念性较强,需要大家认真的去理解、琢磨,这里可以大致熟悉一下,心中有个轮廓,后面会陆续介绍Kafka的实战用法,让大家在实际业务和编码中去体会Kafka的这些原理。 6.结束语 这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉! 联系方式: 邮箱:smartloli.org@gmail.com Twitter: https://twitter.com/smartloli QQ群(Hadoop - 交流社区1): 424769183 温馨提示:请大家加群的时候写上加群理由(姓名+公司/学校),方便管理员审核,谢谢! 热爱生活,享受编程,与君共勉! 本文转自哥不是小萝莉博客园博客,原文链接:http://www.cnblogs.com/smartloli/,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spring入门介绍

spring是为了解决企业应用开发环境所创建的。框架的主要优势之一是分层架构,分层架构允许使用者选择使用哪一个组件,同时也为javaEE应用开发提供集成的框架。 IOC和AOP这两个模块是Spring的核心模块,同时也是系统中其他模块的其他组件应用开发的基础。只有深刻了解这两个模块的基本原理,才能更好的进行Spring应用程序的开发。 一、Spring概况 a.Spring的简介 Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架,它主要是为了解决企业应用开发的复杂性而诞生的。 目的:解决企业应用开发的复杂性 功能:使用基本的JavaBean代替EJB 范围:任何的Java应用 b.Spring的起源 Spring的存在是因为它自身有着得天独厚的优势: 它定位的领域是其他framework没有的 Spring是全面的和模块化的 它的设计从底部帮助开发者编写易于测试的代码 Spring是潜在的一站式解决方案 c.Spring的优点 Spring天生就存在如下的优点: 低侵入式设计,代码污染极低 Write Once,Run Anywhere DI有效的降低了耦合度 AOP提供了通用任务的集中管理 ORM和DAO简化了对数据库的访问 高度开放性,并不强制 Spring的优点给开发带来的好处: 可以有效组织中间层对象 使用统一的配置文件 促进良好编程习惯,减少编程代价 易于单元测试 使EJB成为一种备选 为数据的存取提供了一致的框架 d.Spring的特点 方便解耦,简化开发 AOP编程的支持 声明式事务的支持 方便程序的测试 方便集成各种优秀框架 降低JavaEE API的使用难度 Spring的源码是经典的学习范例 e.Spring的核心模块 Spring框架是一个分层架构,它由7个定义良好的模块组成。Spring的模块构建在核心容器之上,核心容器对应了创建、配置和管理Bean的方式。组成Spring框架的每个模块或者组件都可以单独存在,或者与其他一个或多个模块来联合实现一个应用程序。 核心容器(Spring Core) 核心容器定义了框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 应用上下文(Spring Context) Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。 AOP模块(Spring AOP) 通过配置管理特性,Spring的AOP模块直接将面向切面的编程功能集成到了Spring框架当中。所以,可以很容易地使Spring框架管理的任何对象都可以支持AOP。Spring的AOP模块为基于Spring的应用程序中的对象提供了事务管理服务,通过使用Spring AOP,不用依赖EJB组件就可以将声明性事务管理集成到应用程序当中。 JDBC和DAO模块(Spring DAO) JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。 对象实体映射(Spring ORM) Spring框架插入了若干个ORM框架,从而提供了ORM对象的关系工具。其中包括JDO、Hibernate、iBats。所有这些都遵从Spring的通用事务和DAO异常层次结构。 Web模块(Spring Web) Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以Spring框架支持与Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到预对象的工作。 MVC模块(Spring Web MVC) Spring的MVC框架是一个全功能的构建Web应用程序的MVC的实现。通过策略接口,MVC框架变成了高度可配置的。MVC容纳了大量视图技术,其中包括JSP、Tiles、iText和POI。模型由JavaBean来构成,存放于map当中。而视图是一个接口,负责实现模型。控制器表示逻辑代码,是Controller的实现。 Spring的框架的功能可以用在任何J2EE服务器当中,大多数功能也适用于不受管理的环境。Spring的核心要点就是:支持不把用到特定JavaEE服务的可重用业务和数据的访问对象。毫无疑问,这样的业务和对象可以在不同的JavaEE环境独立应用程序和测试环境之间重用。 本文转自yeleven 51CTO博客,原文链接:http://blog.51cto.com/11317783/1832047

优秀的个人博客,低调大师

openstack(一)入门

可能很多人会跟我一样,开始刚接触openstack,去学的时候发现东西很多,越看越乱,有种无处发力的感觉。这里我结合红帽RHCA认证里的openstack课程认证和openstack官方网站,加上自己的理解,整理成博文,抛砖引玉。 一、基本概念 OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。 OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。 概念里面几个关键字:开源、云计算管理平台、IaaS、集成。 总的来讲,个人觉得,学习openstack大概需要了解以下几个技能: 要有基本的linux知识 了解基本的虚拟化相关概念,熟悉KVM等 搞云计算离不开网络,对DHCP、NAt、Bridge、vlan这些网络知识是必须要了解的。 了解相关存储知识,如分布式存储、对象存储 掌握一种自动化部署的工具,比如puppet、ansible、Chef等你会发现事半功倍 Python 了解一个框架,flask或Django起码知道。OpenStack 基于 Web 的管理控制台 OpenStack Dashboard 是用 Python 和 Django 框架写的。 二、openstack架构 先上图,暂不多说: 三、主要服务(service) 因为openstack涉及的service比较多,初期接触的时候建议只关注几个关键的服务,慢慢的由浅入深。 安照openstack官方给出的顺序: 第一步,选择你的使用方式,How will you beusing OpenStack? 是只当计算资源用还是当对象存储 使用,亦或两者结合使用; 第二步,选择核心服务,包括keystone(identity)、nova(compute)、neutron(networking)、cinder(block storage)、swift(object storage)glance(glance),这几个core service基本都是需要了解的; 第三步,选Optional Services来强化,这里面可以优先选择看horizon(dashboard)、 ceilometer(telemetry)、heat(orchestration)。 相关服务介绍如下: Horizon(dashboard) 一个基于Web的Openstack管理平台,为用户提供如:启动虚拟机、管理虚拟网络、设置访问控制的图像接口。 Keystone(identity) 一个中心认证服务,为其他服务提供认证和授权。keystone同时提供openstack云各个其他组件的目录服务。 Keystone提供多种认证方式包括:用户名、密码,令牌,AWS(Amazon logins) Keystone是所有服务的起始点,只有经过认证,其它的服务才会认为可以合法执行。它是Openstack的钥匙。 Neutron(networking) 在Openstack云中创建和管理虚拟网络架构(网络、子网、路由、防火墙) Cinder(block storage) 为虚拟机提供逻辑卷管理功能,通常为虚拟机提供附加磁盘存储。 Nova(compute) 提供虚拟机管理功能,调用底层的Hypervisor提供该功能,支持libvirtd,qemu,kvm等Hypervisor。 Glance(image) Glance项目提供虚拟机镜像的发现,注册,取得服务; Glance提供restful API可以查询虚拟机镜像的metadata,并且可以获得镜像; 通过Glance,虚拟机镜像可以被存储到多种存储上,比如简单的文件存储或者对象存储。 Swift(object storage) Swift项目提供了弹性可伸缩、高可用的分布式对象存储服务,适合存储大规模非结构化数据。 Ceilometer(metering) Ceilometer像一个漏斗,能把OpenStack内部发生的几乎所有的事件都收集起来,然后为计费和监控以及其它服务提供数据支撑。 Heat(orchestration) heat实现了一种自动化的通过简单定义和配置就能实现的云部署方式。可以在heat模板中定义连串相关任务(例如用某配置开几台虚拟机,然后再去在其中一台中安装一个mysql服务,设定相关数据库属性,然后再配置几台虚拟机安装web服务集群等等),然后交由heat,由heat按照一定的顺序执行heat模板中定义的一连串任务。 本文转自Jx战壕 51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1745675,如需转载请自行联系原作者

优秀的个人博客,低调大师

Docker入门(二)

一、Docker相关概念 1.Docker: namespace,cgroup: 解决方案: lxc,openvz lxc:linux containers docker最初就是lxc的封装版本。 docker engine/docker server:输出一个api,用于接受外部请求 接受到client请求,借助于lxc虚拟化技术,在lxc上创建一个虚拟机实例。 docker借助于外部的dockerhub,实现image 后台docker不再使用lxc,使用libcontainer[centos 7],隔离用户空间的引擎 在前端使用没有区别 2.容器虚拟化 例如kvm也需要images,有一个完整的OS 而容器所需的images,并非完整的OS,只拥有FS,没有内核 借助于AUFS技术对映像文件进行分层,容器运行一个独立的FS上 运行nginx需要nginx依赖的库,运行mysql需要依赖mysql的库 把FS做成一个base image,再做几个专用的image,例如nginx专用的,MySQl专用的 [docker hub] / / [cn1][cn2]... [API] [docker engine ] ======================= Hypervisor ============= Host OS ============== 【硬件】 3.核心组件; docker client:docker的client工具,用户使用docker的接口,docker client与docker daemon通信。并将结果返回给client docker daemon:运行在宿主机,Docker的守护进程,用户可通过docker client与其交互; image :只读的,基于aufs或者UnionFS叠加在一起,用来创建container 一个镜像可以运行多个container;镜像文件可以通过Dockerfile创建,也可以从docker hub/registry 下载 repository 公共仓库 //提供有base image Docuer hub/registry 私有仓库 //docker repository docker container:docker的运行实例,容器是一个隔离环境 另外两个重要组件: docker link:各docker之间的通信,openvswtich,netns构建, docker volume:容器中的数据的持久化 二、安装Docker: centos6 ;epel centos7: extra docker-engine 安装Docker: https://mirrors.aliyun.com/docker-engine/yum/repo/main/centos/7/ yum install docker-engine [root@node1 ~]# rpm -ql docker-engine |egrep -v "share" /etc/udev/rules.d/80-docker.rules /usr/bin/docker /usr/bin/docker-containerd /usr/bin/docker-containerd-ctr /usr/bin/docker-containerd-shim /usr/bin/docker-init /usr/bin/docker-proxy /usr/bin/docker-run /usr/bin/dockerd /usr/lib/systemd/system/docker.service docker子命令有很多 systemctl start docker.service docker images //查看镜像 docker search centos Name DESCRIPTION STARS STARS OFFICAL AUTOMATED 星 自动生成 darksheer/centos //用户名:镜像名 docker search busybox docker pull busybox //拉取官方镜像 base iamge tag : lastest //最新版本,默认最新版本 docker pull hub.mt.com:5000/busybox //执行私有仓库获取image,必须支持ssl。或者禁止使用tls docker help run //运行 docker run [OPTIONS] IMAGS [COMMAND] [AEG,...] //image应该有一个运行起来后,默认运行的命令。 -t --tty=false 分配一个默认的伪终端 -i --interactive=false 打开之后运行在交互式 [root@node1 ~]# docker run -it busybox:latest /bin/sh docker ps //查看正在运行的 docker 需要借助于外 volume 保存创建的数据。 docker help commit //基于当前容器的所有修改,创建一个新的images docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 三、docker常用命令: 1.环境信息相关 info version 2.系统维护相关 images inspect :容器的详细信息 build:基于dockerfile创建image文件 commit:基于运行中的容器创建映像文件 pause:暂停 unpause rm rmi //删除映像文件 run //基于image运行一个容器 start/stop/restart top //资源占用情况 ps kill ... 3.日志相关 events; hisgory; logs; 4.Docker hub 相关 login logout pull push search 基本操作: 获取映像:pull 启动容器:run -i,-t docker run -it centos:latest /bin/bash ifconfig //docker0 一个虚拟接口 一半在虚拟机, 一半在宿主机 docker kill c98dac012556 //kill 掉容器,容器ID docker ps -a //可以查看所有的 关闭后,默认还是会占用内存,可以在启动的时候 docker run --rm //退出则,rm自动移除容器 docker rm c98dac012556 //删除该容器 docker image的创建: 1.基于dockerfile 2.基于运行中的容器修改 //仅仅是打包最上面一层,只有最上面一层是可写的。 实验:commit,保存文件 [root@node1 ~]# docker run -it centos:latest /bin/bash 在home中 useradd centos [root@node1 ~]# docker commit faecb4def9d5 centos:newuser [root@node1 ~]# docker images 有 newuser [root@node1 ~]# docker kill faecb4def9d5 [root@node1 ~]# docker rm faecb4def9d5 [root@node1 ~]# docker ps -a 没有之前的容器了 [root@node1 ~]# docker run -it --rm centos:newuser /bin/bash rm用于关闭后,就删除容器 [root@3f20a3c7f5df /]# id centos uid=1000(centos) gid=1000(centos) groups=1000(centos) [root@3f20a3c7f5df /]# exit [root@node1 ~]# docker ps -a //将没有容器运行 本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1946362,如需转载请自行联系原作者

优秀的个人博客,低调大师

Tensorflow CNN入门

一、概论 以图像识别来举例,比如我们让计算机如何识别一张猫的图片识别出猫呢? 老式的计算机视觉是如何做的呢? 比如OpenCV: 首先理解很多算法,比如如何检测线条(Edge Detection) 如何做形态学变化等 根据我们的知识, 经验, 脑洞来设计很多特征; 用这些特征去比对一张图像是不是猫。 这样做存在的问题呢? 每一种不同的物件,我们都得去设计特征。 这样的人工智能主要是人工,而不是只能。 老式的流程: 原始数据 ——> 人工特征提取 ——> 算法 ——> 结果 卷积要解决的问题就是自动的特征提取(Feature Extraction) 卷积神经网络: 原始数据 ——> 卷积网络 ——> 算法 ——> 结果 #其中 卷积网络 + 算法 称为 深度学习

优秀的个人博客,低调大师

lvs简单入门

只解决c10k问题是不够的,单台主机的处理能力是有限的,一台主机同时处理500个动态网页请求已经是极限了。这里有两种方法提升处理性能,一,定制高性能的计算机,众所周知计算机硬件设计成本极其高,性能每提高10%成本就要增加一倍,这也是intel被称为挤牙膏公司的原因,不是其研发能力不行而是计算机硬件性能提升的难度太大,这个方法貌似不可行。二,使用两台主机处理业务,这就会引来一个问题怎么把请求分发到两个主机,这里我们引入了负载均衡器。 # 目录 负载均衡 lvs工作方式和调度方法 ipvsadm的使用 lvs-nat lvs-dr 多端口绑定和持久连接 # 负载均衡 使用负载均衡有两个方法,一是采用商用负载均衡硬件的,这个方法是最好的方法,能上硬件一定不要使用软件,又是硬件同样的问题也是价格,只要是涉及到基础设施的服务一定要使用。一方面是硬件的稳定性,比软件好很多,虽然软件可维护性和拓展性比较好,但是对于一些金融公司,他们玩的就是公信力和大众信心,每个故障都是竞争对手拆台的理由,一旦故障硬件背锅,理赔。常用的硬件F5的Big-IP,Citrix的Netscaler,A10的A10 另一种是采用软件负载均衡,只要考虑成本使用负载均衡软件就对了,它的性能比硬件也不会差别太大,并且灵活。常用的有lvs,nginx,haproxy,ats。。。 在做负载均衡的时候,我们在7层模型的哪一层做负载均衡,ip层基于主机做负载均衡粒度太大可用性太差基本不使用,更低的层基本上没有价值了,tcp层的话我们就可以把不同服务的请求采取不同的方式负载均衡,应用层的话我们可以根据具体协议拆包分析后负载均衡,既然涉及到拆开数据包,那处理的数据量就会大大增加,那么对计算机性能要求也越高,性能就越差,并且负载均衡器的通用性也越差。 传输层:lvs,nginx:(stream),haproxy:(mode tcp) 应用层: http:nginx, httpd, haproxy(mode http) fastcgi:nginx, httpd mysql:mysql-proxy # lvs工作方式和调度方法 ### lvs的工作方式 有四种lvs-nat,lvs-dr,lvs-tun,lvs-fullnat lvs集群类型中的术语: vs:Virtual Server, Director, Dispatcher, Balancer rs:Real Server, upstream server, backend server CIP:Client IP, VIP: Virtual serve IP, RIP: Real server IP, DIP: Director IP * lvs-nat 它的工作机制类似iptables的dnat功能,但是它工作于input链上。一次请求过程如下图 当客户端向director发送数据,数据在input链上目的地址vip换为rip后,被转发到postrouting链上过滤后发送到real server,real server处理完后把数据发送到director,director把这个数据的源地址rip更改为vip,当然lvs-nat不仅仅是更改ip也可以更改端口,所以支持端口映射,由以上可以总结nat的特点,rip和dip必须在同一网络中,rs的网关需要指向dip,因为所以的数据必须经过director更改ip。 这种工作方式director很容成为网络瓶颈,因为所以的数据都要经过director,director网卡的吞吐量就代表整个网站的流量吞吐量,当今世界的慢慢走向5G,director是完全不能满足需求的,需要借助其它网络设备帮助director分担流量,这就引入了lvs-dr模型。 * lvs-dr 如图,lvs-dr也是在input链上更改数据,但是它更改的不是ip地址而是mac地址,它把目的mac地址vmac更改为rmac,这里就要求vip,rip,dip必须在广播域内,但是地址不一定要在一个网段,因为他们间的通信需要使用mac直接通信。realserver处理请求后直接把数据返回给客户端。 等等,不对啊!realserver是怎么给客户端发送数据包的,realserver服务器上只有rip怎么用vip给客户端通信,这里需要我们给realserver配置vip。但是有一个问题,在网络中多个主机拥有同一个ip会产生冲突的,我们的解决方案是只让一个主机发送arp广播并且响应arp请求,选谁毋庸置疑只能选择director。 控制arp广播arp-ignore,0广播,1不广播;控制响应arp-announce,0响应所有接口信息,1尽量只响应当前网卡的信息,2只响应当前网卡的信息 lvs-dr的使用方法有两种,一种是每个realserver都有与公网交互的公网ip,另一种是只有内网ip,之后演示。 * lvs-tun 它是在原本的报文外部继续封装一个ip头,有可能造成超级帧 * lvs-fullnat 它是把源ip和目的ip都更改,相当于director请求realserver,realserver响应回来数据再把两个ip地址更改,这样这个数据包就可以跨越路由通信了,nat本来就会造成director网络瓶颈,它的使用场景主要应用于请求数据量不大但后服务器数量很多的场景。 ### 调度方法 调用方法可以分为两类,一类是静态调度算法,一类是动态调用算法 * 静态算法 rr #以轮询的方法,把请求转发到后端的主机 wrr #加权轮询,把请求按照一定的比例转发后端主机 sh #源地址哈希,把源地址做hash运算后,把realserver也hash,每个realserver只处理自己hash和上一realserver的hash之间的源地址的请求如图 dh #目标地址哈希,这样realserver可以开启缓存了 * 动态算法 lc #最少连接,根据realserver的正在处理请求的数量进行调度,Overhead=activeconns*256+inactiveconns wlc #加权最少连接,Overhead=(activeconns*256+inactiveconns)/weight nq #在lc的基础上改进的,意思是不许有realserver主机空闲 sed #最短等等时间,Overhead=(activeconns+1)*256/weight lblc #动态的DH算法;基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑 lblcr #带复制功能的lblc # ipvsadm的使用 管理集群服务:增、改、删; 增、改: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] 删: ipvsadm -D -t|u|f service-address [-s scheduler]:指定集群的调度算法,默认为wlc service-address: -t|u|f: -t: TCP协议的端口,VIP:TCP_PORT -u: TCP协议的端口,VIP:UDP_PORT -f:firewall MARK,是一个数字; 管理集群上的RS:增、改、删; 增、改: ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] 删: ipvsadm -d -t|u|f service-address -r server-address server-address: rip[:port] # lvs-nat nat实验拓扑图 这个使用我采用的是虚拟机,主机ip做cip,director的vip采用的桥接网络,dip和rip采用的是仅主机模式 realserver1执行的命令 yuminstallhttpd-y#安装httpd echors1>/var/www/html/index.html#提供网页文件 realserver2执行的命令 yuminstallhttpd-y echors2>/var/www/html/index.html director执行的命令 yuminstallipvsadm-y ipvsadm-A-t172.16.29.4:80-swrr ipvsadm-a-t172.16.29.4:80-r192.168.95.2-m-w1 ipvsadm-a-t172.16.29.4:80-r192.168.95.3-m-w2 # lvs-dr ### 都采用公网ip的方案 所有网卡都采用桥接 director执行的命令 ifconfigeno16777736:0172.16.29.4netmask255.255.255.255broadcast172.16.29.4up#若在directer和realserver在同一个网段里一定要使用这一行 ipvsadm-A-t172.16.29.4:80-swrr ipvsadm-a-t172.16.29.4:80-r172.16.29.10-g-w1 ipvsadm-a-t172.16.29.4:80-r172.16.29.20-g-w2 realserver执行的命令 echo1>/proc/sys/net/ipv4/conf/all/arp_ignore echo1>/proc/sys/net/ipv4/conf/lo/arp_ignore echo2>/proc/sys/net/ipv4/conf/lo/arp_announce echo2>/proc/sys/net/ipv4/conf/all/arp_announce ifconfiglo:0172.16.29.4netmask255.255.255.255broadcast172.16.29.4up routeadd-host172.16.29.4devlo:0 ### 只要一个公网ip的解决方案 全部接口采用的仅主机模式,并且每个主机只有一个网卡,每个网卡都先配置一个ip,后期再添加需要的ip director要执行的命令 ifconfigeno16777736:0192.168.95.20netmask255.255.255.0broadcast192.168.95.20 ipvsadm-A-t192.168.95.20:80-swrr ipvsadm-a-t192.168.95.20:80-r10.0.0.10-g-w2 ipvsadm-a-t192.168.95.20:80-r10.0.0.20-g-w2 realserver需要执行的命令 echo1>/proc/sys/net/ipv4/conf/all/arp_ignore echo1>/proc/sys/net/ipv4/conf/lo/arp_ignore echo2>/proc/sys/net/ipv4/conf/lo/arp_announce echo2>/proc/sys/net/ipv4/conf/all/arp_announce ifconfiglo:0192.168.95.20netmask255.255.255.255broadcast192.168.95.20up routeadd-host192.168.95.20devlo:0 routeadddefaultgw10.0.0.1 路由设备需要执行的命令 echo 1 > /pro/sys/net/ipv4/ip_forward #开启转发功能 # 多端口绑定和持久连接 ### FWM:FireWall Mark 借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度; 打标记方法(在Director主机): # iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER 基于标记定义集群服务: # ipvsadm -A -f NUMBER [options] ### lvs persistence:持久连接 持久连接模板:实现无论使用任何算法,在一段时间内,实现将来自同一个地址的请求始终发往同一个RS; ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] port Affinity: 每端口持久:每集群服务单独定义,并定义其持久性; 每防火墙标记持久:基于防火墙标记定义持久的集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity; 每客户端持久:基于0端口定义集群服务,即将客户端对所有应用的请求统统调度至后端主机,而且可使用持久连接进行绑定; # 总结 lvs是负载均衡器中最基本的,理解了它的原理和使用方法,基本上掌握了大多数的负载均衡器的原理。其中dr模型是必须掌握的,真正使用的话我感觉会使用dr,net的功能很有可能被7层代理的服务器替代了。多端口绑定功能也很常用比如80和443端口绑定统一调度;持久连接虽然破坏调度效果,但是在没有session缓存服务器的话还是很高效的。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册