Java中的数组
数组只能线性存储同一种类型的数据。
1. 一维数组1.1. 声明方式注意Java中声明时是没有分配内存的,所以不需要指定大小,在new的时候才指定。
12int arr1[]; // 方法一int[] arr2; // 方法二(常用)
1.2. 初始化数组一旦初始化,其长度是不可变的。
12345678// 动态初始化:在声明的时候指定数组长度,分配内存。int[] arr1 = new int[3]; // 此时会有默认值,int 类型默认值为 0,对象的默认值是 nullarr1[0] = 1;arr1[1] = 2;arr1[2] = 3;// 静态初始化:初始化时由程序猿显示指定每个数组元素的初始值,由系统决定数组的长度。int[] arr2 = new int[]{1, 2, 3};int[] arr3 = {1, 2, 3};
数组元素的引用:下标索引如 arr[2],与 C/C++ 相同。
每个数组有一个属性 length 表示其长度。
1.3. 一维数组遍历12345678910// 有一维数组 d//需要自己控 ...
Java中的Interface(接口)
1. 什么是Interface(接口)有时必须从几个类中派生出一个子类,继承他们所有的属性和方法。
但是,Java 不支持多重继承,使用接口实现多重继承的效果。
接口是抽象方法和常量值的定义的集合。
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
一个类可以实现多个接口,接口也可以继承其他接口。
12public class ClassName implements Interface1, Interface2 { ... }public interface Interface3 extends Interface1 { ... }
2. 接口的特点
用 interface 来定义;
接口中所有的成员变量都默认是由 public static final 修饰的;
接口中所有的方法都默认是由 public abstract 修饰的;
接口没有构造器;
接口采用多层继承机制。
3. 接口定义举例123456public interface Runner { int ID = ...
Java中的数据类型
在 java 中,数据类型分为基本数据类型和引用数据类型,其中基本数据类型有 8 种,除了这 8 种之外,其他所有的数据类型都是引用数据类型(包括 String 类型等)。
1. 基本数据类型1.1. 数值型1.1.1. 整数类型Java 中的整数类型有 byte,short,int 和 long。
Java 各整数类型有固定的表数范围和字段长度,不受具体OS的影响,以保证java程序的可移植性。整型常量默认为int型,声明long型常量须后加 ‘l’ 或 ‘L’。
类型
存储空间
表示范围
byte
1B = 8bit
$-128$ ~ $127$
short
2B
$-2^{15}$ ~ $2^{15}-1$
int
4B
$-2^{31}$ ~ $2^{31}-1$
long
8B
$-2^{63}$ ~ $2^{63}-1$
1.1.2. 浮点类型Java 中的浮点数类型有 float 和 double。
与整数类型类似,Java浮点类型也有固定的表数范围和字段长度,不受具体OS的影响。浮点型常量默认为double型,声明floa ...
Python中yield关键字的使用
关键字yield与一个概念相关,即生成器。
生成器是一个不断产生值的函数;
包含yield语句的函数是一个生成器;
生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。
生成器一般与循环结构搭配使用,如下面的例子。
生成器写法:
12345678>>> def gen(n):... for i in range(n):... yield i**2... >>> for i in gen(5):... print(i, end=' ')... 0 1 4 9 16
普通写法:
12345678>>> def square(n):... ls = [i**2 for i in range(n)]... return ls... >>> for i in square(5):... print(i, end=' ')... 0 1 4 9 16
生成器写法和普通写法看起来效果是一样的 ...
Requests库和Scrapy框架的比较
Requests库和Scrapy框架都是Python中非常重要的第三方爬虫库(框架)。
1. Requests和Scrapy的相同点
两者都可以进行页面请求和爬取,是Python爬虫的两个重要技术路线。
两者都可用性很好,文档丰富,入门简单。
两者都没有处理js、提交表单、应对验证码等功能(可扩展)。
2. Requests和Scrapy的不同点
Requests
Scrapy
页面级爬虫
网站级爬虫
功能库
框架
并发性考虑不足,性能较差
并发性好,性能较高
重点在于页面下载
重点在于爬虫结构
定制灵活
一般定制灵活,深度定制困难
上手十分简单
入门稍难
3. 如何选择Requests和Scrapy?
非常小的需求:Requests库。
不太小的需求:Scrapy框架。
定制程度很高的需求(不考虑规模),自搭框架:Requests > Scrapy。因为Scrapy的“5+2”结构在自搭框架时反而会成为限制,不如直接用Requests库来编写。
Scrapy爬虫框架入门
1. Scrapy爬虫框架介绍 Scrapy SKRAY-pee是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的程序框架。该框架主要由Scrapinghub 公司进行维护。 ——维基百科
1.1. Scrapy的安装普通环境下:pip install scrapy。Anaconda:conda install scrapy 或在图形界面操作。
验证安装:在命令行输入scrapy -h,打印出正确的版本和帮助信息,说明安装成功。
1.2. Scrapy爬虫框架结构Scrapy一共有7个部分,为“5+2结构”,其中5个部分为框架的主体部分,2个部分为中间件。
5个主体:Engine,Scheduler,Item Pipelines,Spiders,Downloader。2个中间件:Engine和Spiders之间的Spider Middleware,Engine-Downloader之间的Downloader Middleware。
数据(包括网络爬虫提交的请求)以及从网络中获取的相关内容,在5个主题模块之间流动,形成数据流。
Scrapy包 ...
Python中的正则表达式和Re库
1. 正则表达式的概念正则表达式:regular expression,regex,RE。
正则表达式是用来简洁表达一组字符串的表达式。
如有一组字符串如下:
12345'PN''PYN''PYTM''PTRHN''PYTHON'
这组字符串可以用正则表达式简洁的表示:'P(Y|YT|YTH|YTHO)?N'
再有一组字符串如下:
12345'PY''PYY''PYYY'...'PYYYY...'
这组字符串可以用正则表达式简洁的表示:'PY+','+'表示Y可以有1个或无穷多个。
总得来说,正则表达式具有以下特点:1. 通用的字符串表达框架。2. 简洁表达一组字符串的表达式。3. 针对字符串表达”简洁“和”特征“思想的工具。4. 判断某字符串的特征归属。
正则表达式在文本处理中十分常用,他可以:1. 表达文本类型的特征(病毒、入侵等)。2. 同时查找或 ...
中国大学排名定向爬虫
1. 实例介绍世界上针对大学的排名有很多种,这里我们选取由上海交通大学设计研发的最好大学排名。
我们可以在其中获得软科中国最好大学排名2019。
URL为http://zuihaodaxue.com/zuihaodaxuepaiming2019.html。
功能描述输入:大学排名URL链接。输出:大学排名信息的屏幕输出(排名,大学名称,总分)。技术路线:Requests-bs4。定向爬虫:仅对输入URL进行爬取,不扩展爬取。
在进行定向爬虫前,我们要先看看定向爬虫是否可行,也就是要爬取的信息是否在HTML代码中。
有些网站的一些信息是由JavaScript动态生成的,对于这些信息,仅靠Requests和bs4是无法实现的。
我们打开该URL,查看网页源代码,可以看到下面的内容,也就是说,我们要爬取的信息,在HTML代码中。
此外,我们查看此网站的robots协议。
打开http://zuihaodaxue.com/robots.txt ,404 Not Found,说明此网站未对爬虫限制,我们可以合法爬取。
验证可行性后,我们要对程序的结构做一个初步的设计。
对于上面这样的信 ...
基于bs4库的HTML内容查找方法
我们有一份由Requests库request.get()方法获得的demo.html文本如下。
demo.html的文本信息存储于demo变量中,且有soup = BeautifulSoup(demo, "html.parser")。
BeautifulSoup库提供了一个方法find_all(),这个方法可以在soup的变量中去查找一些信息。
find_all()有5个参数,返回一个列表类型,存储查找的结果。
<>.find_all(name, attrs, recursive, string, **kwargs)
下面我们对find_all()方法的每个参数进行说明,每次调用的说明写在注释中。
name:对标签名称的检索字符串。
12>>> soup.find_all('a') # 查找<a>[<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="l ...
信息提取的一般方法
信息指从标记后的信息中提取所关注的内容。
信息标记有三种形式,XML、JSON和YAML,无论哪种形式,在信息标记中包含标签和信息两个部分。
我们关心的是我们想要提取出的信息内容,该怎么做呢?
方法有非常多种,这里从一般意义上给出几种方法。
序号
方法
信息文本
解析器
优点
缺点
1
完整解析信息的标记形式,再提取关键信息。
XML/JSON/YAML
需要标记解析器。例如:bs4库的标签树遍历。
信息解析准确。
提取过程繁琐,速度慢。
2
无视标记形式,直接搜索关键信息。
任何文本
不需要
提取过程简洁,速度较快。
提取结果准确定与信息内容直接相关。
3
融合方法1和方法2
XML/JSON/YAML/任何文本
需要标记解析器以及文本查找函数。
我们以BeautifulSoup库为例,解释如何实现信息提取。
实例:提取HTML中的所有URL链接。
思路:1. 搜索到所有的<a>标签;2. 解析<a>标签格式,提取属性href中的链接内容。
1234567891011121314 ...