先来看看页面长啥样的:https://book.douban.com/top250?start=25
我们将要爬取哪些信息:书名、链接、评分、一句话评价……
1. 爬取单个信息
我们先来尝试爬取书名,利用之前的套路,还是先复制书名的xpath:
得到第一本书《追风筝的人》的书名xpath如下:
//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a
得到xpath,我们就可以按照之前的方法来尝试一下:
返回的竟然是空值,这就很尴尬了。
这里需要注意,浏览器复制的 xpath 信息并不是完全可靠的,浏览器经常会自己在里面增加多余的 tbody 标签,我们需要手动把这些标签删掉。
修改 xpath 后再来尝试,结果如下:
切记:浏览器复制 xpath 不是完全可靠,看到 tbody 标签特别要注意。
分别复制《追风筝的人》、《小王子》、《围城》、《解忧杂货店》的 xpath 信息进行对比:
//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[3]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[4]/tbody/tr/td[2]/div[1]/a
比较可以发现书名的 xpath 信息仅仅 table 后的序号不一样,并且跟书的序号一致,于是去掉序号(去掉 tbody),我们可以得到通用的 xpath 信息:
//*[@id=“content”]/div/div[1]/div/table/tr/td[2]/div[1]/a
好了,我们试试把这一页全部书名爬下来:
2.爬取多个信息
分别复制《追风筝的人》、《小王子》、《围城》、《解忧杂货店》评分的 xpath 信息进行对比:
//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[2]/span[2]
//*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[2]/span[2]
//*[@id="content"]/div/div[1]/div/table[3]/tbody/tr/td[2]/div[2]/span[2]
//*[@id="content"]/div/div[1]/div/table[4]/tbody/tr/td[2]/div[2]/span[2]
相信你已经可以秒写出爬取全部评分的xpath了:
//*[@id=“content”]/div/div[1]/div/table/tr/td[2]/div[2]/span[2]
把评分的xpath放入之前的代码,运行:
现在我们再把书名和评分同时爬取下来:
这里我们默认书名和评分爬到的都是完全的、正确的信息,这种默认一般情况没问题,但其实是有缺陷的,如果我们某一项少爬或多爬了信息,那么两种数据的量就不一样了,从而匹配错误。比如下面的例子:
书名xpath 后的@title 改为 text(),获取的文本数量与评分数量不一致,出现匹配错位。
如果我们以每本书为单位,分别取获取对应的信息,那肯定完全匹配。
书名的标签肯定在这本书的框架内,于是我们从书名的标签向上找,发现覆盖整本书的标签(左边网页会有代码包含内容的信息),把xpath 信息复制下来:
//*[@id="content"]/div/div[1]/div/table[1]
我们将整本书和书名的xpath进行对比
//*[@id=“content”]/div/div[1]/div/table[1] #整本书
//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a #书名
//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[2] #评分
不难发现,书名和评分 xpath 的前半部分和整本书的 xpath 一致的,
那我们可以通过这样写 xpath 的方式来定位信息:
file=s.xpath(“//*[@id=“content”]/div/div[1]/div/table[1]”)
title =div.xpath(“./tr/td[2]/div[1]/a/@title”)
score=div.xpath(“./tr/td[2]/div[2]/span[2]/text()”)
在实际的代码中来看一下:
刚刚我们爬了一本书的信息,那如何爬这个页面所有书呢?很简单啊,把 xpath 中
后面定位的序号去掉就ok。
终于看到庐山真面目了,不过,等等~
title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]
score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]
为什么这两行后面多了个 [0] 呢?我们之前爬出来的数据是列表,外面带个方框,看着非常难受,列表只有一个值,对其取第一个值就OK。如果不熟悉列表的知识,可以回去补补。
接下来就是按照这样的方式多爬几个元素啦!
有一个点需要注意的是:
num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")")
这行代码用了几个 strip() 方法,()里面表示要删除的内容,strip(“(”) 表示删除括号, strip() 表示删除空白符。
嗯,已经把一个页面搞定了,接下来需要,把所有页面的信息都爬下来。
3.翻页,爬取所有页面信息
先来看一下翻页后url是如何变化的:
https://book.douban.com/top250?start=0 #第一页
https://book.douban.com/top250?start=25 #第二页
https://book.douban.com/top250?start=50 #第三页
url 变化的规律很简单,只是 start=() 的数字不一样而已,而且是以每页25为单位,递增25,这不正是每页的书籍的数量吗?于是,我们只需要写一个循环就可以了啊。
for a in range(10):
url = 'https://book.douban.com/top250?start={}'.format(a*25)
#总共10个页面,用 a*25 保证以25为单位递增
这里要强调一下 Python range() 函数
基本语法:range(start, stop, step)
start:计数从 start 开始。默认是从 0 开始。例如 range(5) 等价于range(0,5);
end:计数到 end 结束,但不包括 end。例如:range(0,5)是 [0,1,2,3,4] 没有5
step:步长,默认为1。例如:range(0,5) 等价于 range(0,5,1)
>>>range(10) #从 0 开始到 10 (不包含)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11) #从 1 开始到 11 (不包含)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5) #从0到30(不包含),步长为5
[0, 5, 10, 15, 20, 25]
加上循环之后,完整代码如下:
from lxml import etree
import requests
import time
for a in range(10):
url = 'https://book.douban.com/top250?start={}'.format(a*25)
data = requests.get(url).text
s=etree.HTML(data)
file=s.xpath('//*[@id="content"]/div/div[1]/div/table')
time.sleep(3)
for div in file:
title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]
href = div.xpath("./tr/td[2]/div[1]/a/@href")[0]
score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]
num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")").strip()
scrible=div.xpath("./tr/td[2]/p[2]/span/text()")
if len(scrible) > 0:
print("{},{},{},{},{}".format(title,href,score,num,scrible[0]))
else:
print("{},{},{},{}".format(title,href,score,num))
来运行一下:
请务必要自己练习几遍,你觉得自己看懂了,还是会出错,不信我们赌五毛钱。
Python 的基础语法很重要,没事的时候多去看看:字符串、列表、字典、元组、条件语句、循环语句……
编程最重要的是实战,比如你已经能够爬TOP250的图书了,去试试TOP250电影呢。
好了,这节课就到这里!
你可能感兴趣的:(Python爬虫入门 | 4 爬取豆瓣TOP250图书信息)
中国环境统计年鉴 1998-2021年
年鉴汇
其他
1、数据来源:自身2、时间跨度:1989-20213、区域范围:全国4、指标说明:中国环境年鉴,与中国环境统计年鉴不是同一本。《中国环境统计年鉴》是国家统计局和环境保护部及其他有关部委共同编辑完成的一本反映我国环境各领域基本情况的年度综合统计资料。收录了全国各省、自治区、直辖市环境各领域的基本数据和主要年份的全国主要环境统计数据。本书内容共分为十二个部分,即:1.自然状况;2.水环境;3.海洋环境
【Docker基础】理解 Docker:本质、性质、架构与核心组件
卜及中
Docker学习 docker 架构 eureka 容器
文章目录Docker本质Docker的引擎迭代Docker和虚拟机的区别Docker为什么比虚拟机资源利用率高,速度快?Docker和JVM虚拟化的区别Docker版本1.LXC(LinuxContainers)2.libcontainer3.Moby4.docker-ce5.docker-ee总结:Docker架构1.Docker仓库(Registry)2.Docker守护进程(Daemon)3
【Python】函数详细介绍,附代码详解(参数类型、返回值、作用域、高阶函数、闭包、装饰器、生成器、递归等)
echo 慧
Python学习 python 开发语言 函数 详解 学习
文章目录1.定义2.函数参数类型2.1位置参数2.2默认参数2.3关键字参数2.4可变参数2.4.1*args2.4.2**kwargs2.4.3使用参数的顺序2.5仅限位置参数(Python3.8以上版本)2.6仅限关键字参数3.返回值4.作用域和变量访问5.匿名函数lambda6.高阶函数6.1map()6.2filter()6.3sorted()6.4reduce()7.闭包8.装饰器(De
短视频矩阵系统源码---NGINX 、PHP7.4技术开发
t_18137784554
短视频矩阵系统 矩阵 线性代数 音视频 nginx
#短视频矩阵系统##短视频矩阵系统源码技术开发知识分享##短视频矩阵系统原生态开发#一、短视频矩阵系统源码基于原生态开发的几种方式原生代码:使用特定平台的原生编程语言和工具进行开发,而不是跨平台或混合开发技术。例如,iOS应用使用Swift或Objective-C,Android应用使用Java或Kotlin。原生框架和库:使用操作系统或平台提供的原生框架和库,而不是第三方或开源的替代品。这样可以
加油站小程序实战教程02数据源设计
低代码布道师
小程序 低代码
目录一、引言二、需求分析三、表结构设计思路四、关键设计要点五、总结一、引言在移动互联网时代,小程序已成为连接用户与服务的重要桥梁。以加油小程序为例,其核心功能涉及地图定位、加油站展示、加油下单、钱包管理、优惠券、订单管理以及发票、车辆信息等多个模块。面对如此复杂的业务场景,如何设计一个既满足业务需求、又具备良好扩展性和数据一致性的数据库结构,成为系统开发的重要前提。本文将结合实际需求,逐步解析表结
Node.js 中 fs 模块的高级用法
浪九天
node.js 前端 node.js javascript
目录1.流式文件处理示例:大文件复制2.文件监控示例:使用fs.watch监控文件变化3.异步递归操作示例:异步递归遍历目录4.文件权限管理示例:修改文件权限5.原子操作示例:原子重命名文件在Node.js里,fs(文件系统)模块提供了一系列用于与文件系统进行交互的方法。除了常见的读写文件操作,还有一些高级用法,以下为你详细介绍:1.流式文件处理在处理大文件时,一次性将整个文件加载到内存中可能会导
golang range 的用法
学会了没
golang 开发语言 后端
在Go语言中,range关键字用于迭代遍历数组(array)、切片(slice)、映射(map)、字符串(string)和通道(channel)中的元素。它的基本语法和用法如下:1.遍历数组/切片nums:=[]int{2,3,4}//同时获取索引和值forindex,value:=rangenums{fmt.Printf(“索引:%d,值:%d\n”,index,value)}//仅获取索引fo
最全redis缓存核心知点(原理+图解)
敲代码的胖虎
数据库 redis 队列 数据库 分布式
redis缓存核心知点一、主流应用架构二、缓存知识考点三、多路I/O复用模型四、常用的数据类型五、消息队列六、Redis的持久化6.1BGSAVE原理6.2RBD持久化的缺点6.3持久化方式之AOF6.4AOF文件重写6.5Redis数据的恢复6.7RDB和AOF的优缺点6.8RDB-AOF混合持久化方式(新版本的默认备份方式)七、Pipeline及主从同步7.1Pipeline的简介7.2red
Chrony 无法同步时间的排查过程
中年如酒
Linux linux
文章目录1.问题描述2.检查chrony.conf配置3.检查Chronyd进程状态4.检查Chrony是否在跟踪时间5.检查Chrony是否获取了NTP源6.检查防火墙7.检查网络连接性8.根因9.解决方案10.验证1.问题描述在一台Linux服务器上配置了Chrony作为NTP客户端,配置文件/etc/chrony.conf指定了两个NTP服务器:2.检查chrony.conf配置cat/et
深入解析 Python 的 __str__() 方法重写
web安全工具库
python microsoft 开发语言
各类资料学习下载合集https://pan.quark.cn/s/8c91ccb5a474在Python中,__str__()是一个特殊的方法,用于定义对象的“非正式”字符串表示。重写__str__()方法可以让我们定制类的实例在打印或转换成字符串时的表现。本文将详细讲解__str__()方法的作用、如何重写它,以及具体的代码示例和运行结果。一、什么是__str__()方法__str__()方法是
PG统计信息
三思呐三思
PG postgres统计信息 postgres性能问题排查
文章目录一、统计信息1.1PG统计信息概述1.2负载指标统计信息1.2.1pg_stat_database指标含义1.2.2pg_stat_user_tables指标含义2.2.3pg_stat_user_indexes指标含义2.2.4pg_statio_user_tables指标含义2.2.5pg_stat_bgwriter指标含义2.2.6pg_stat_replication指标含义2.2
MySQL复合索引的最左匹配原则
web2u
MySQL mysql android 数据库
聊聊MySQL复合索引的最左匹配原则:从一个简单例子说起今天想跟你们聊聊MySQL里一个挺有意思的话题——复合索引的最左匹配原则。说实话,我刚接触数据库的时候,看到索引这个东西脑袋就有点晕,后来慢慢踩了点坑,才发现这玩意儿其实没那么神秘,反而有点像生活里找东西的逻辑。今天就拿个小例子,带你们看看这东西到底怎么回事,顺便分享下我的理解和心得。先搭个简单场景假设我们有个用户信息表,叫user_info
FastSAM:高效图像分割算法详解与实战
阿qi 爱喝拿铁
本文还有配套的精品资源,点击获取简介:图像分割在图像处理领域中起着至关重要的作用,而FastSAM作为一种高效的图像分割算法,结合了像素的局部特征与全局信息,以自适应聚类方式实现了快速且精确的像素级别分割。其采用基于密度的空间聚类方法处理噪声和不规则形状,自适应策略调整聚类参数以增强泛化能力,并优化计算流程实现并行化处理以提升运行速度。FastSAM算法在医疗、自动驾驶等多个领域具有广泛应用前景。
设计模式-建造者模式
老菜鸟的每一天
设计模式 设计模式 建造者模式
解释生活中有着很多的Builder的例子,个人觉得大学生活就是一个Builder模式的最好体验:要完成大学教育,一般将大学教育过程分成4个学期进行,因此没有学习可以看作是构建完整大学教育的一个部分构建过程,每个人经过这4年的(4个阶段)构建过程得到的最后的结果不一样,因为可能在四个阶段的构建中引入了很多的参数(每个人的机会和际遇不完全相同)。Builder模式要解决的也正是这样的问题:当我们要创建
JMeter 集成到 Jenkins 实现 CI CD过程
小赖同学啊
jmeter专栏 jmeter jenkins ci/cd
将JMeter集成到Jenkins实现CI/CD可以实现自动化的性能测试,以下是详细的实现方式和配置参数说明:1.环境准备JMeter安装:确保JMeter已经安装在Jenkins服务器或者可被Jenkins访问的节点上。记录JMeter的安装路径,例如/opt/apache-jmeter-5.4.1。Jenkins安装与配置:安装Jenkins并确保其正常运行。可以通过浏览器访问Jenkins的
Kafka 基础教程 — 可靠的数据传递
码炫课堂-码哥
kafka专题 kafka 消息队列
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对
DeepSeek:大模型时代的“破局者”
qq_44233281
ai 深度学习 人工智能
DeepSeek,是谁?DeepSeek,中文名深度求索,是一家成立于2023年7月17日的创新型科技公司,由知名量化资管巨头幻方量化创立,法定代表人系裴湉。公司专注于开发先进的大语言模型(LLM)和相关技术,致力于在人工智能领域实现技术突破和创新应用。在成立后的短时间内,DeepSeek取得了令人瞩目的成绩。2024年1月5日,发布首个包含670亿参数的大模型DeepSeekLLM,该模型从零开
【python随手记】——读取文本文件内容转换为json格式
番茄番茄君
python json windows
文章目录前言一、TXT文件转换为JSON数组1.txt文件内容2.python代码3.输出结果二、TXT文件转换为JSON对象1.txt文件2.python代码3.输出结果前言场景:用于读取包含空格分隔数据的TXT文件,并将其转换为结构化JSON文件一、TXT文件转换为JSON数组1.txt文件内容地点A116.40528539.90498943.5地标B121.47370131.2304164.
深度学习-133-LangGraph之应用实例(二)使用面向过程和面向对象的两种编程方式构建带记忆的聊天机器人
皮皮冰燃
深度学习 深度学习 人工智能 LangGraph
文章目录1通用配置1.1大语言模型ChatOllama1.2函数trim_messages1.2.1函数概述1.2.2函数参数1.2.3测试应用2面向过程编程2.1不裁剪历史信息2.1.1创建图2.1.2调用图2.2裁剪历史信息2.2.1创建图2.2.2调用图3面向对象编程3.1定义类MyState3.2定义类AIChat3.3应用4附录4.1问题及解决tokenizer4.2参考附录1通用配置L
40年之后送走了父母,世上再无至亲之人,你会做些什么呢?
山海守门人
人生感悟 人生思考 世间难题 痛彻心扉
有这样一个让人痛彻心扉的问题:假如40年之后,你送走了父母的最后一程,而自己又未婚,那时的你会做些什么呢?众多网友的回答,仿若一把把利刃,直直地刺入人心,让人瞬间破防。这是一种刻入骨髓的痛楚,几乎没有人能够读到此处还保持着无动于衷。若是真到了那般田地,或许我们应当在活着的时候,拼尽全力去好好生活。可以想象,在离开这个世界的时候,父母会像小时候接我们放学一样,来迎接我们。余华曾说:“生的终止不过是一
Opencv之图像SIFT 特征检测与Harris角点检测
是十一月末
opencv opencv 计算机视觉 人工智能 python 特征检测
图像SIFT特征检测与Harris角点检测目录图像SIFT特征检测与Harris角点检测1SIFT特征检测1.1概念1.2主要步骤1.3优缺点1.4函数及参数2Harris角点检测2.1概念2.2**算法思想**2.3特点2.4函数及参数3角点、特征检测3.1焦点、特征检测代码及结果1SIFT特征检测1.1概念SIFT(尺度不变特征变换)是一种用于图像处理中检测和描述图像中局部结构的算法。它是由D
数据挖掘中特征发现与特征提取的数学原理
调皮的芋头
数据挖掘 人工智能 AIGC 计算机视觉
好的,我将深入研究数据挖掘中特征发现与特征提取的数学原理,涵盖统计学基础、特征工程的数学方法、以及在机器学习和深度学习中的应用。我会整理相关数学公式和理论,包括主成分分析(PCA)、独立成分分析(ICA)、线性判别分析(LDA)、信息增益、互信息、方差分析等统计方法,并结合金融量化交易的实际应用,确保内容既有理论深度,又能落地实践。完成后,我会通知您!1.统计学基础:描述性统计、方差分析、相关性与
Java 大视界 -- Java 大数据未来十年的技术蓝图与发展愿景(95)
青云交
大数据新视界 Java 大视界 java 大数据 开发语言 未来十年 技术蓝图 发展愿景 新兴技术融合
亲爱的朋友们,热烈欢迎来到青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而我的博客正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!一、欢迎加入【福利社群】点击快速加入:青云交灵犀技韵交响盛汇福利社群点击快速加入2:2024CSDN博客之星创作交流营(NEW)二、本博客的精华专栏:大数据新视
Java 大视界 -- 5G 与 Java 大数据融合的行业应用与发展趋势(82)
青云交
大数据新视界 Java 大视界 java 5G 大数据 技术融合 智能交通 工业制造 智能安防
亲爱的朋友们,热烈欢迎来到青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而我的博客正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!一、欢迎加入【福利社群】点击快速加入:青云交灵犀技韵交响盛汇福利社群点击快速加入2:2024CSDN博客之星创作交流营(NEW)二、本博客的精华专栏:大数据新视
DeepSeek免费福利限时开启,AI界的“薅羊毛”机会来了!
算法
作者:京东科技张新磊背景最近一直在关注deepseek的动态,现在看到一则好消息,分享给大家;国家超算中心目前上线了deepseek且免费调用DeepSeek-R1:7B、DeepSeek-R1:14B、DeepSeek-R1:32B三个模型,具体操作如下操作步骤通过如下导航栏进入,进行购买\购买完成后,我们点击去使用,获取密钥\测试代码importrequestsimportjsonurl="h
设计模式 之 建造者模式(C++)
TT-Kun
设计模式 C++ 设计模式 建造者模式 c++
文章目录设计模式之建造者模式(C++)建造者模式概述建造者模式的结构C++实现建造者模式示例1.产品类(`Computer`)2.抽象建造者类(`Builder`)3.具体建造者类(`MacBookBuilder`)4.指挥者类(`Director`)5.客户端代码(`main`函数)建造者模式的优缺点优点缺点建造者模式的适用场景与其他模式的比较与工厂模式的比较与抽象工厂模式的比较设计模式之建造者
PC端-发票真伪查验系统-Node.js全国发票查询接口
OCR_API
接口 node.js
在现代企业的财务管理中,发票真伪的验证至关重要。随着电子发票的普及,假发票问题日益严峻,如何高效、准确的对发票进行真伪查验,已经成为各类企业在日常运营中必须解决的关键问题。翔云发票查验接口做企业财务管理、税务合规的好帮手。快速查询,全国覆盖:通过全国增值税发票查验接口,用户只需提供发票的基础信息,如发票代码、号码、日期、金额、校验码等,系统即可实现全国范围内的查询与比对。无论是来自哪个省市的发票,
docker镜像基本操作
十亿点烦
docker eureka 容器
docker镜像基本操作1.拉取镜像[root@wyx~]#dockerpullswr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nats:2.10.16-alpine2.10.16-alpine:Pullingfromddn-k8s/docker.io/natsb84a74cde5af:Pullcomplete823b46200779:Pull
计算机网络概述
少天z
网络
1.基本概念计算机网络:由多台计算机和网络设备通过通信链路连接,实现资源共享和信息交换。节点:网络中的设备,如计算机、服务器、路由器、交换机等。链路:连接节点的物理或逻辑通道,如光纤、电缆、无线信号等。2.网络分类按覆盖范围:局域网(LAN):覆盖小范围,如家庭、办公室。城域网(MAN):覆盖城市范围。广域网(WAN):覆盖国家或全球,如互联网。按传输介质:有线网络:如以太网、光纤。无线网络:如W
利用Java爬虫精准获取商品销量详情:实战案例指南
小爬虫程序猿
java 爬虫 开发语言
在电商领域,商品销量数据是衡量产品受欢迎程度和市场表现的关键指标。精准获取商品销量详情不仅能帮助商家优化产品策略,还能为市场研究和数据分析提供丰富的数据资源。本文将详细介绍如何利用Java爬虫技术精准获取商品销量详情,并分享关键技术和代码示例。一、前期准备(一)环境搭建确保你的开发环境已安装以下必要的Java库:Jsoup:用于解析HTML页面。HttpClient:用于发送HTTP请求。Log4
算法 单链的创建与删除
换个号韩国红果果
c 算法
先创建结构体
struct student {
int data;
//int tag;//标记这是第几个
struct student *next;
};
// addone 用于将一个数插入已从小到大排好序的链中
struct student *addone(struct student *h,int x){
if(h==NULL) //??????
《大型网站系统与Java中间件实践》第2章读后感
白糖_
java中间件
断断续续花了两天时间试读了《大型网站系统与Java中间件实践》的第2章,这章总述了从一个小型单机构建的网站发展到大型网站的演化过程---整个过程会遇到很多困难,但每一个屏障都会有解决方案,最终就是依靠这些个解决方案汇聚到一起组成了一个健壮稳定高效的大型系统。
看完整章内容,
zeus持久层spring事务单元测试
deng520159
java DAO spring jdbc
今天把zeus事务单元测试放出来,让大家指出他的毛病,
1.ZeusTransactionTest.java 单元测试
package com.dengliang.zeus.webdemo.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import
Rss 订阅 开发
周凡杨
html xml 订阅 rss 规范
RSS是 Really Simple Syndication的缩写(对rss2.0而言,是这三个词的缩写,对rss1.0而言则是RDF Site Summary的缩写,1.0与2.0走的是两个体系)。
RSS
分页查询实现
g21121
分页查询
在查询列表时我们常常会用到分页,分页的好处就是减少数据交换,每次查询一定数量减少数据库压力等等。
按实现形式分前台分页和服务器分页:
前台分页就是一次查询出所有记录,在页面中用js进行虚拟分页,这种形式在数据量较小时优势比较明显,一次加载就不必再访问服务器了,但当数据量较大时会对页面造成压力,传输速度也会大幅下降。
服务器分页就是每次请求相同数量记录,按一定规则排序,每次取一定序号直接的数据
spring jms异步消息处理
510888780
jms
spring JMS对于异步消息处理基本上只需配置下就能进行高效的处理。其核心就是消息侦听器容器,常用的类就是DefaultMessageListenerContainer。该容器可配置侦听器的并发数量,以及配合MessageListenerAdapter使用消息驱动POJO进行消息处理。且消息驱动POJO是放入TaskExecutor中进行处理,进一步提高性能,减少侦听器的阻塞。具体配置如下:
highCharts柱状图
布衣凌宇
hightCharts 柱图
第一步:导入 exporting.js,grid.js,highcharts.js;第二步:写controller
@Controller@RequestMapping(value="${adminPath}/statistick")public class StatistickController { private UserServi
我的spring学习笔记2-IoC(反向控制 依赖注入)
aijuans
spring mvc Spring 教程 spring3 教程 Spring 入门
IoC(反向控制 依赖注入)这是Spring提出来了,这也是Spring一大特色。这里我不用多说,我们看Spring教程就可以了解。当然我们不用Spring也可以用IoC,下面我将介绍不用Spring的IoC。
IoC不是框架,她是java的技术,如今大多数轻量级的容器都会用到IoC技术。这里我就用一个例子来说明:
如:程序中有 Mysql.calss 、Oracle.class 、SqlSe
TLS java简单实现
antlove
java ssl keystore tls secure
1. SSLServer.java
package ssl;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.KeyStore;
import
Zip解压压缩文件
百合不是茶
Zip格式解压 Zip流的使用 文件解压
ZIP文件的解压缩实质上就是从输入流中读取数据。Java.util.zip包提供了类ZipInputStream来读取ZIP文件,下面的代码段创建了一个输入流来读取ZIP格式的文件;
ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
&n
underscore.js 学习(一)
bijian1013
JavaScript underscore
工作中需要用到underscore.js,发现这是一个包括了很多基本功能函数的js库,里面有很多实用的函数。而且它没有扩展 javascript的原生对象。主要涉及对Collection、Object、Array、Function的操作。 学
java jvm常用命令工具——jstatd命令(Java Statistics Monitoring Daemon)
bijian1013
java jvm jstatd
1.介绍
jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。
jstatd是基于RMI的,所以在运行jstatd的服务
【Spring框架三】Spring常用注解之Transactional
bit1129
transactional
Spring可以通过注解@Transactional来为业务逻辑层的方法(调用DAO完成持久化动作)添加事务能力,如下是@Transactional注解的定义:
/*
* Copyright 2002-2010 the original author or authors.
*
* Licensed under the Apache License, Version
我(程序员)的前进方向
bitray
程序员
作为一个普通的程序员,我一直游走在java语言中,java也确实让我有了很多的体会.不过随着学习的深入,java语言的新技术产生的越来越多,从最初期的javase,我逐渐开始转变到ssh,ssi,这种主流的码农,.过了几天为了解决新问题,webservice的大旗也被我祭出来了,又过了些日子jms架构的activemq也开始必须学习了.再后来开始了一系列技术学习,osgi,restful.....
nginx lua开发经验总结
ronin47
使用nginx lua已经两三个月了,项目接开发完毕了,这几天准备上线并且跟高德地图对接。回顾下来lua在项目中占得必中还是比较大的,跟PHP的占比差不多持平了,因此在开发中遇到一些问题备忘一下 1:content_by_lua中代码容量有限制,一般不要写太多代码,正常编写代码一般在100行左右(具体容量没有细心测哈哈,在4kb左右),如果超出了则重启nginx的时候会报 too long pa
java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶
bylijinnan
java
import java.util.Stack;
public class ReverseStackRecursive {
/**
* Q 66.颠倒栈。
* 题目:用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。
* 颠倒之后的栈为{5,4,3,2,1},5处在栈顶。
*1. Pop the top element
*2. Revers
正确理解Linux内存占用过高的问题
cfyme
linux
Linux开机后,使用top命令查看,4G物理内存发现已使用的多大3.2G,占用率高达80%以上:
Mem: 3889836k total, 3341868k used, 547968k free, 286044k buffers
Swap: 6127608k total,&nb
[JWFD开源工作流]当前流程引擎设计的一个急需解决的问题
comsci
工作流
当我们的流程引擎进入IRC阶段的时候,当循环反馈模型出现之后,每次循环都会导致一大堆节点内存数据残留在系统内存中,循环的次数越多,这些残留数据将导致系统内存溢出,并使得引擎崩溃。。。。。。
而解决办法就是利用汇编语言或者其它系统编程语言,在引擎运行时,把这些残留数据清除掉。
自定义类的equals函数
dai_lm
equals
仅作笔记使用
public class VectorQueue {
private final Vector<VectorItem> queue;
private class VectorItem {
private final Object item;
private final int quantity;
public VectorI
Linux下安装R语言
datageek
R语言 linux
命令如下:sudo gedit /etc/apt/sources.list1、deb http://mirrors.ustc.edu.cn/CRAN/bin/linux/ubuntu/ precise/ 2、deb http://dk.archive.ubuntu.com/ubuntu hardy universesudo apt-key adv --keyserver ke
如何修改mysql 并发数(连接数)最大值
dcj3sjt126com
mysql
MySQL的连接数最大值跟MySQL没关系,主要看系统和业务逻辑了
方法一:进入MYSQL安装目录 打开MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起MYSQL即可
方法二:MySQL的最大连接数默认是100客户端登录:mysql -uusername -ppass
单一功能原则
dcj3sjt126com
面向对象的程序设计 软件设计 编程原则
单一功能原则[
编辑]
SOLID 原则
单一功能原则
开闭原则
Liskov代换原则
接口隔离原则
依赖反转原则
查
论
编
在面向对象编程领域中,单一功能原则(Single responsibility principle)规定每个类都应该有
POJO、VO和JavaBean区别和联系
fanmingxing
VO POJO javabean
POJO和JavaBean是我们常见的两个关键字,一般容易混淆,POJO全称是Plain Ordinary Java Object / Plain Old Java Object,中文可以翻译成:普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO,但是JavaBean则比POJO复杂很多,JavaBean是一种组件技术,就好像你做了一个扳子,而这个扳子会在很多地方被
SpringSecurity3.X--LDAP:AD配置
hanqunfeng
SpringSecurity
前面介绍过基于本地数据库验证的方式,参考http://hanqunfeng.iteye.com/blog/1155226,这里说一下如何修改为使用AD进行身份验证【只对用户名和密码进行验证,权限依旧存储在本地数据库中】。
将配置文件中的如下部分删除:
<!-- 认证管理器,使用自定义的UserDetailsService,并对密码采用md5加密-->
mac mysql 修改密码
IXHONG
mysql
$ sudo /usr/local/mysql/bin/mysqld_safe –user=root & //启动MySQL(也可以通过偏好设置面板来启动)$ sudo /usr/local/mysql/bin/mysqladmin -uroot password yourpassword //设置MySQL密码(注意,这是第一次MySQL密码为空的时候的设置命令,如果是修改密码,还需在-
设计模式--抽象工厂模式
kerryg
设计模式
抽象工厂模式:
工厂模式有一个问题就是,类的创建依赖于工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。我们采用抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
总结:这个模式的好处就是,如果想增加一个功能,就需要做一个实现类,
评"高中女生军训期跳楼”
nannan408
首先,先抛出我的观点,各位看官少点砖头。那就是,中国的差异化教育必须做起来。
孔圣人有云:有教无类。不同类型的人,都应该有对应的教育方法。目前中国的一体化教育,不知道已经扼杀了多少创造性人才。我们出不了爱迪生,出不了爱因斯坦,很大原因,是我们的培养思路错了,我们是第一要“顺从”。如果不顺从,我们的学校,就会用各种方法,罚站,罚写作业,各种罚。军
scala如何读取和写入文件内容?
qindongliang1922
java jvm scala
直接看如下代码:
package file
import java.io.RandomAccessFile
import java.nio.charset.Charset
import scala.io.Source
import scala.reflect.io.{File, Path}
/**
* Created by qindongliang on 2015/
C语言算法之百元买百鸡
qiufeihu
c 算法
中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁,母,雏各几何?
代码如下:
#include <stdio.h>
int main()
{
int cock,hen,chick; /*定义变量为基本整型*/
for(coc
Hadoop集群安全性:Hadoop中Namenode单点故障的解决方案及详细介绍AvatarNode
wyz2009107220
NameNode
正如大家所知,NameNode在Hadoop系统中存在单点故障问题,这个对于标榜高可用性的Hadoop来说一直是个软肋。本文讨论一下为了解决这个问题而存在的几个solution。
1. Secondary NameNode
原理:Secondary NN会定期的从NN中读取editlog,与自己存储的Image进行合并形成新的metadata image
优点:Hadoop较早的版本都自带,