首页 文章 精选 留言 我的

精选列表

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

ActiveMQ入门实例

在开始之前需要去到网上去下载一个activeMQ,(官方网站下载:http://activemq.apache.org/),然后直接解压运行bin目录下面的activemq.bat文件,启动后登陆:http://localhost:8161/admin/,创建一个Queue,命名为FirstQueue,到这里准备工作就完成了,然后就可以开始了。 第一步,创建一个普通的java项目,然后导入java包(本人导入的是activemq-all-5.9.0.jar) 第二步、添加消息发送者 publicclassSender{ //连接工厂 privatestaticConnectionFactoryconnectionFactory; static{ connectionFactory=newActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,"tcp://localhost:61616"); } publicstaticvoidmain(String[]args){ //连接 Connectionconnection=null; //会话 Sessionsession=null; //目的地,消息要发往的地方 Destinationdestination; //消息发送者 MessageProducerproducer=null; try{ //获取消息连接 connection=connectionFactory.createConnection(); //开启连接 connection.start(); //通过连接创建会话 session=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); //创建消息队列 destination=session.createQueue("FirstQueue"); //创建发送者 producer=session.createProducer(destination); //发送消息 send(session,producer); }catch(JMSExceptione){ e.printStackTrace(); }finally{ try{ session.commit(); connection.close(); }catch(JMSExceptione){ e.printStackTrace(); } } } publicstaticvoidsend(Sessionsession,MessageProducerproducer)throwsJMSException{ for(inti=0;i<10;i++){ //创建消息 TextMessagemsg=session.createTextMessage("消息"+i); //发送消息 producer.send(msg); System.out.println("发送消息:消息"+i); } } } 最后一步,添加消息的接受者 publicclassconsumer{ privatestaticConnectionFactoryconnectionFactory; static{ connectionFactory=newActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,"tcp://localhost:61616"); } publicstaticvoidmain(String[]args){ Connectionconnection=null; Sessionsession=null; Destinationdestination; MessageConsumerconsumer=null; try{ connection=connectionFactory.createConnection(); connection.start(); session=connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE); destination=session.createQueue("FirstQueue"); consumer=session.createConsumer(destination); while(true){ TextMessagemsg=(TextMessage)consumer.receive(30000); if(msg!=null){ System.out.println("接受到的消息:"+msg.getText()); }else{ break; } } }catch(JMSExceptione){ e.printStackTrace(); }finally{ try{ consumer.close(); session.commit(); connection.close(); }catch(JMSExceptione){ e.printStackTrace(); } } } } 注意:接受消息还可以通过MessageListener接收 publicclassconsumerList{ privatestaticConnectionFactoryconnectionFactory; static{ connectionFactory=newActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,"tcp://localhost:61616"); } publicstaticvoidmain(String[]args){ Connectionconnection=null; Sessionsession=null; Destinationdestination; MessageConsumerconsumer=null; try{ connection=connectionFactory.createConnection(); connection.start(); session=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); destination=session.createQueue("FirstQueue"); consumer=session.createConsumer(destination); consumer.setMessageListener(newMessageListener(){ @Override publicvoidonMessage(Messagemessage){ TextMessagemsg=(TextMessage)message; try{ System.out.println(msg.getText()); }catch(JMSExceptione){ e.printStackTrace(); } } }); }catch(JMSExceptione){ e.printStackTrace(); }finally{ try{ consumer.close(); session.commit(); connection.close(); }catch(JMSExceptione){ e.printStackTrace(); } } } }

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

Spring MVC入门

Spring mvc架构 1.1架构图 1.2.架构流程 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器 5.执行处理器(Controller,也叫后端控制器)。 6.Controller执行完成返回ModelAndView 7.HandlerAdapter将controller执行结果ModelAndView返回 8.DispatcherServletDispatcherServlet将ModelAndView传给ViewReslover视图解析器 9.ViewReslover解析后返回具体View 10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。 11.DispatcherServlet响应用户 一.前端控制器(DispatcherServlet) <servlet> <servlet-name>JdbcSqlServlet</servlet-name> <servlet-class>com.imooc.page.servlet.JdbcSqlServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>JdbcSqlServlet</servlet-name> <url-pattern>/jdbcSql/JdbcSqlServlet</url-pattern> </servlet-mapping> 二.Spring MVC配置文件(同Spring配置文件) <?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 前端控制器(DispatcherServlet)带有默认的,映射器和适配器 三.处理器映射器(HandlerMapping) 用户发起的request请求,前端控制器(DispatcherServlet) 首先会请求 处理器映射器(HandlerMapping)来查找 后端控制器(Handler) 四.处理器适配器(HandlerAdapter) 处理器映射器将查找到的Handler返回给DispatcherServlet后,DispatcherServlet会调用适配器执行Handler,通过适配器去扩展对不同Handler的执行。 五.后端控制器的编写(Handler) Controller.java 六.配置视图解析器(ViewResolver) <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> </bean>

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

Yaml入门笔记

什么是yamlYAML是"YAML Ain't a Markup Language"(YAML不是一种置标语言)的递归缩写,早先YAML的意思其实是:"Yet Another Markup Language"(另外一种置标语言),但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名,YAML的官方定义很简单,即一种人性化的数据格式定义语言,其主要功能用途类似于XML或JSON,YAML使用空白字符和分行来分隔数据,且巧妙避开各种封闭符号,如:引号、括号等,以避免这些符号在复杂层次结构中变得难以辨认。YAML的语法与高阶语言类似,可以很简单地表述序列(java中的list)、杂凑表(java中的map)、标量(java中的基本类型等)数据结构,它重点强调可阅读性。 本文内容 image.png YAML的设计目的 容易人类阅读 适合表示程序语言的数据结构 可用于不同程序间交换数据 支持泛型工具 支持串行处理? 丰富的表达能力和可扩展性 易于使用 xml和yaml的代码块: xml代码块: <site> <name>github</name> <url>https://github.com</url> </site> <site> <name>简书</name> <url>https://www.jianshu.com</url> </site> yaml代码块: --- site: name: github url: https://github.com --- site: name: 简书 url: https://www.jianshu.com --- #或者 --- site:{name:github,url:https://github.com} --- site:{name:简书,url:https://jianshu.com} 主要标记 注释-comment 举例: # Comment Example # Profile Of Mary Mary: - name: Mary - age : 19 # age property 文档(document) # documents example --- site: name: github url: https://github.com --- site: name: 简书 url: https://www.jianshu.com 数据结构 YAML的设计者认为在配置文件中所要表达的数据内容有三种类型:标量(Scalar,如字符串和整数等)、序列(Sequence,如数组)和Mapping(类似hash的key/value pair)。 sequence.png mapping.png 例子:我们用YAML来描述一本书: # 《单元测试之道-c#版》描述 --- # begin of document 书名 : '单元测试之道-C#版' 出版社: '电子工业出版社' 原作者: ['Andrew Hunt', 'David Thomas'] 译者 : - 陈伟柱 - 陶文 前二章节 : - 第一章: 序言 - 第二章: 你的首个单元测试计划 #end document 注意:YAML推荐使用空格作为缩进,避免了在不同编辑器中对tab的表示形式不同而可能产生误解。 YAML 与 XML 优势: YAML的可读性好 YAML和脚本语言的交互性好 YAML使用实现语言的数据类型 YAML有一个一致的信息模型 YAML易于实现 上面5条是XML不足的地方,同时,YAML也具有XML的下列优点: YAML可以基于流来处理 YAML表达能力强,扩展性好 YAML类似于XML的数据描述语言,语法比XML简单很多,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。 YAML 与 JSON JSON的语法其实是YAML的子集,大部分的JSON文件都可以被YAML的剖析器剖析。虽然大部分的数据分层形式也可以使用类似JSON的格式,不过YAML并不建议这样使用,除非这样编写能让文件可读性增加,更重要的是,YAML的许多扩展在JSON是找不到的,如:进阶资料形态、关系锚点、字串不需要引号、映射资料形态会储存键值的顺序等。 YAML用途 脚本语言 由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript,除了Java,其他都是脚本语言。 序列化 YAML比较适合做序列化。因为它是宿主语言数据类型直转的。 配置文件 YAML做配置文件也不错。写YAML要比写XML快得多(无需关注标签或引号),并且比ini文档功能更强。 调试 由于其很强的阅读性,用于调试过程中dump出信息供分析也是一种比较方便的做法。 YAML缺陷与不足 YAML没有自己的数据类型的定义,而是使用实现语言的数据类型。一个YAML文件,在不同语言中解析后得到的数据类型可能会不同,由于其兼容性问题,不同语言间的数据流转不建议使用YAML。 YAML语法与范例 YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16 使用空白字符(不能使用<kbd>Tab</kbd>)分层,同层元素左侧对齐 单行注解由井字号(<kbd> #</kbd> )开始,可以出现在行中任何位置 每个清单成员以单行表示,并用短杠+空白(<kbd>- </kbd>)起始 每个杂凑表的成员用冒号+空白(<kbd>: </kbd>)分开键和值 杂凑表的键值可以用问号 (<kbd>?</kbd>)起始,表示多个词汇组成的键值 字串一般不使用引号,但必要的时候可以用引号框住 使用双引号表示字串时,可用倒斜线(<kbd></kbd>)进行特殊字符转义 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(使用符号<kbd>|</kbd>)或新行折叠(使用符号<kbd>></kbd>)两种方式 在单一档案中,可用连续三个连字号(<kbd>---</kbd>)区分多个档案 可选择性的连续三个点号(<kbd>...</kbd>)用来表示档案结尾(在流式传输时非常有用,不需要关闭流即可知道到达结尾处) 重复的内容可使从参考标记星号 (<kbd>*</kbd>)复制到锚点标记(<kbd>&</kbd>) 指定格式可以使用两个惊叹号 ( !! ),后面接上名称 receipt: Oz-Ware Purchase Invoice date: 2007-08-06 customer: given: Dorothy family: Gale items: - part_no: A4786 descrip: Water Bucket (Filled) price: 1.47 quantity: 4 - part_no: E1628 descrip: High Heeled "Ruby" Slippers price: 100.27 quantity: 1 bill-to: &id001 street: | 123 Tornado Alley Suite 16 city: East Westville state: KS ship-to: *id001 specialDelivery: > Follow the Yellow Brick Road to the Emerald City. Pay no attention to the man behind the curtain. ... 这个文件的的顶层由七个键值组成:其中一个键值"items",是个两个元素构成的清单,清单中的两个元素同时也是包含了四个键值的杂凑表。 文件中重复的部分处理方式:使用锚点(&)和参考(*)标签将"bill-to"杂凑表的内容复制到"ship-to"杂凑表。也可以在文件中加入选择性的空行,以增加可读性。 YAML的JAVA实现 YAML已经有了多种语言不少实现,详见YAML官网。 一般YAML文件扩展名为.yaml,比如John.yaml,其内容为: name: John Smith age: 37 children: - name: Jimmy Smith age: 15 - name: Jenny Smith age: 12 spouse: name: Jane Smith age: 25 由于yaml的超强可读性,我们了解到:John今年37岁,两个孩子Jimmy 和Jenny活泼可爱,妻子Jane年轻美貌,而且年仅25岁,一个幸福的四口之家。 对John.yaml进行java描述,抽象出一个Person类,如下: public class Person { private String name; private int age; private Person sponse; private Person[] children; // setXXX, getXXX方法略. } 现在我们使用java装配一个Jone: Person john = new Person(); john.setAge(37); john.setName("John Smith"); Person sponse = new Person(); sponse.setName("Jane Smith"); sponse.setAge(25); john.setSponse(sponse); Person[] children = {new Person(), new Person()}; children[0].setName("Jimmy Smith"); children[0].setAge(15); children[1].setName("Jenny Smith"); children[1].setAge(12); john.setChildren(children); 使用SnakeYAML实现 项目主页:http://code.google.com/p/snakeyaml/ 使用手册:https://code.google.com/p/snakeyaml/wiki/Documentation SnakeYAML是一个标准的YAML的java实现,它有以下特点: 完全支持YAML 1.1,可以跑通规范中的所有示例 支持YAML的所有类型 支持UTF-8/UTF-16的输入和输出 提供了本地java对象的序列化和反序列化的高层API 提供相对合理的错误提示信息 使用SnakeYAML将john dump出来,如果有引用相同对象,则dump出到yaml文件会自动使用<kbd>&</kbd>和<kbd></kbd>进行锚点和引用*: DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); Yaml yaml = new Yaml(options); //Yaml yaml = new Yaml(); String dump = yaml.dump(john); System.out.println(dump); 内容如下: !!Person age: 37 children: - age: 15 children: null name: Jimmy Smith sponse: null - age: 12 children: null name: Jenny Smith sponse: null name: John Smith sponse: age: 25 children: null name: Jane Smith sponse: null 现在用SnakeYAML把yaml load进来,如果yaml文件中使用了<kbd>&</kbd>和<kbd></kbd>,则会自动对load出来的对象赋相同的值*: Yaml yaml = new Yaml(); Object load = yaml.load(new FileInputStream(new File("jhon.yaml"))); System.out.println(load.getClass()); System.out.println(yaml.dump(load)); 或 Yaml yaml = new Yaml(options); Person person = yaml.loadAs(inputStream, Person.class); System.out.println(person.getSponse().getChildren().length); 如果一个yaml文件中有多个文档,由<kbd>---</kbd>分割,解析如下: Yaml yaml = new Yaml(); int counter = 0; for (Object data : yaml.loadAll(input)) { System.out.println(data); counter++; } 保存一个Map对象: Map<String, Object> data = new HashMap<String, Object>(); data.put("name", "Silenthand Olleander"); data.put("race", "Human"); data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" }); Yaml yaml = new Yaml(); String output = yaml.dump(data); System.out.println(output); // or StringWriter writer = new StringWriter(); yaml.dump(data, writer); System.out.println(writer.toString()); 将多个文档dump出到同一个yaml文件中去: List<Integer> docs = new LinkedList<Integer>(); for (int i = 1; i < 4; i++) { docs.add(i); } DumperOptions options = new DumperOptions(); //options.setCanonical(true); options.explicitStart(true); Yaml yaml = new Yaml(options); System.out.println(yaml.dump(docs)); System.out.println(yaml.dumpAll(docs.iterator())); --- [1, 2, 3] --- 1 --- 2 --- 3 YAML JAVA !null null !!bool Boolean !!int Integer, Long, BigInteger !!float Double !!binary String !!timestamp java.util.Date, java.sql.Date, java.sql.Timestamp !!omap, !!pairs List of Object[] !!set Set !!str String !!seq List !!map Map YAML与java类型对照表: YAML JAVA !null null !!bool Boolean !!int Integer, Long, BigInteger !!float Double !!binary String !!timestamp java.util.Date, java.sql.Date, java.sql.Timestamp !!omap, !!pairs List of Object[] !!set Set !!str String !!seq List !!map Map 集合的默认实现是: List: ArrayList Map: LinkedHashMap 使用JYaml实现 JYaml(最新版本是2007年的,可以考虑放弃了),使用JYaml把Jone “Dump” 出来: File dumpfile = new File("John_dump.yaml"); Yaml.dump(john, dumpfile); 下面我们看看John_dump.yaml是什么样子: --- !yaml.test.internal.Person age: 37 children: !yaml.test.internal.Person[] - !yaml.test.internal.Person age: 15 name: Jimmy Smith - !yaml.test.internal.Person age: 12 name: Jenny Smith name: John Smith sponse: !yaml.test.internal.Person age: 25 name: Jane Smith 其中!yaml.test.internal.Person是一些类型的信息。load的时候需要用。 现在用JYaml把Jone_dump.yaml load进来: Person john2 = (Person) Yaml.loadType(dumpfile, Person.class); 还可以用下面的代码dump出没有类型信息的John.yaml: Yaml.dump(john,dumpfile, true); 我们再来看看JYaml对流处理的支持,为简便起见,我们只是把同一个john写10次: YamlEncoder enc = new YamlEncoder(new FileOutputStream(dumpfile)); for(int i=0; i<10; i++){ john.setAge(37+i); enc.writeObject(john); enc.flush(); } enc.close(); 下面再把这十个对象一个一个读出来(注意while循环退出的方式): YamlDecoder dec = new YamlDecoder(new FileInputStream(dumpfile)); int age = 37; while(true){ try{ john = (Person) dec.readObject(); assertEquals(age, john.getAge()); age++; }catch(EOFException eofe){ break; } } 参考文档: YAML Specification YAML 数据类型说明 http://blog.csdn.net/conquer0715/article/details/42108061 http://www.cnblogs.com/chwkai/archive/2009/03/01/249924.html

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

maven入门(一)

现在基本上很多项目开始使用maven进行构建项目,已经不是直接在lib文件夹下统一放置jar包,所以还是有必要学习掌握下maven的。 针对maven。这篇文章主要介绍一下几点,大家如果都明白了,就可以参照这个思维导图,再复习下,毕竟知识长时间不用,会忘记的。 一、 maven 是什么 Maven的Apache公司开源项目,是项目构建工具,也用来依赖管理。 二、maven的好处 1、由于maven构建的项目是没有jar包的,所以项目的大小上,肯定是maven的项目比较小。 2、jar包统一交给maven管理。 3、maven同样可以进行项目构建。 maven主要就是 项目构建和依赖(jar包)管理 三、maven安装 maven程序安装前提:maven程序java开发,它的运行依赖jdk。 1、 首先去Maven官网,下载Maven的包,地址为http://maven.apache.org/download.cgi 2、下载完解压,然后配置一下环境变量,和JDK的环境变量配置类似(如图) 3、查询maven版本信息 4、 配置本地仓库 找到 解压目录下的 config/setting.xml,我的就是 E:\app\apache-maven-3.5.3\conf\setting.xml 主要修改2个地方 4.1 修改本地仓库路径 4.2 修改成阿里云镜像 <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> 4.4 复制刚刚设置好的setting.xml 到你设置的本地仓库路径 我的是E:\dev_maven 5.仓库类型有哪些 四、 使用maven构建项目 这里我是用eclipse 进行创建的 1、eclipse配置 1.1 配置maven程序 1.2 配置userSetting ,知道仓库位置 1.3 构建索引,方便查找jar包(Window->show view ->maven Repository) 2、开始创建项目 2.1 这里选择普通项目- Maven Project ,点击next 2.2 打包方式选择war ,完成。 2.3 web.xml缺失报错 此时,会报错,需要在src-main-webapp 下面创建 WEB-INF/web.xml 目录结构 web.xml 内容 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app> 同时创建一个index.xml_(src\main\webapp\index.html) <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>Hello maven</h1> </body> </html> 设置jdk编译版本为1.8.默认为1.5 修改pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zhb</groupId> <artifactId>maven_hello</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project> 更新maven 运行项目 tomcat:run 4.大功告成 五、maven 常用命令 clean:清理 将项目根目录下target目录清理掉 compile:编译 将项目中.java文件编译为.class文件 test:单元测试 单元测试类名有要求:XxxxTest.java 将项目根目录下src/test/java目录下的单元测试类都会执行。 package:打包 web project --- war包 java project --- jar 包 将项目打包,打包项目根目录下taget目录。 install:安装 本地多个项目公用一个jar包。 打包到本地仓库 这里大家自己尝试一下,进入工程目录里面 如打包 则执行 mvn package 2018年5月20日更新 我现在发现 我先在使用idea开发,大家可以在自己电脑的c盘的,m2 文件夹下将setting.xml 考到里面,这样本地仓库就是你设置的了 好了,写了好久。终于弄完了。玩的开心。 学习不是要么0分,要么100分的。80分是收获;60分是收获;20分也是收获。有收获最重要。但是因为着眼于自己的不完美,最终放弃了,那就是彻底的0分了。

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

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/,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

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

用户登录
用户注册