python爬虫 - scrapy的安装和使用

http://blog.csdn.net/pipisorry/article/details/45190851

Crawler Framework爬虫框架scrapy简介

Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy = Scrach+Python。

Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试、信息处理和历史档案等大量应用范围内抽取结构化数据的应用程序框架,广泛用于工业。Scrapy 使用Twisted 这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。Scrapy是由Twisted写的一个受欢迎的Python事件驱动网络框架,它使用的是非堵塞的异步处理。[使用Twisted进行异步编程][您好,异步编程]

整体架构如下图

scrapy_architecture

Note: 最简单的单个网页爬取流程是spiders > scheduler > downloader > spiders > item pipeline

Scrapy主要包括了以下组件:

  • 引擎,用来处理整个系统的数据流处理,触发事务。
  • 调度器,用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。
  • 下载器,用于下载网页内容,并将网页内容返回给蜘蛛。
  • 蜘蛛,蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。
  • 项目管道,负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清洗、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
  • 下载器中间件,位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
  • 蜘蛛中间件,介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。
  • 调度中间件,介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

组件详解:
1、Scrapy Engine(Scrapy引擎)
    Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。
2、Scheduler(调度)
    调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返还给他们。
3、Downloader(下载器)
    下载器的主要职责是抓取网页并将网页内容返还给蜘蛛( Spiders)。
4、Spiders(蜘蛛)

    蜘蛛是有Scrapy用户自己定义用来解析网页并抓取制定URL返回内容的类,每个蜘蛛都能处理一个域名或一组域名。换句话说就是用来定义特定网站的抓取和解析规则。
    蜘蛛的整个抓取流程(周期)是这样的:
首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。第一个请求是通过调用start_requests()方法。该方法默认从start_urls中的Url中生成请求,并执行解析来调用回调函数。
在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭代。这些请求也将包含一个回调,然后被Scrapy下载,然后有指定的回调处理。
在回调函数中,你解析网站的内容,同程使用的是Xpath选择器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜欢的程序),并生成解析的数据项。
最后,从蜘蛛返回的项目通常会进驻到项目管道。

5、Item Pipeline(项目管道)

    项目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清洗、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。每个项目管道的组件都是有一个简单的方法组成的Python类。他们获取了项目并执行他们的方法,同时他们还需要确定的是是否需要在项目管道中继续执行下一步或是直接丢弃掉不处理。
    项目管道通常执行的过程有:
清洗HTML数据
验证解析到的数据(检查项目是否包含必要的字段)
检查是否是重复数据(如果重复就删除)
将解析到的数据存储到数据库中
6、Downloader middlewares(下载器中间件)

   下载中间件是位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。它提供了一个自定义的代码的方式来拓展Scrapy的功能。下载中间器是一个处理请求和响应的钩子框架。他是轻量级的,对Scrapy尽享全局控制的底层的系统。
7、Spider middlewares(蜘蛛中间件)

    蜘蛛中间件是介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。它提供一个自定义代码的方式来拓展Scrapy的功能。蛛中间件是一个挂接到Scrapy的蜘蛛处理机制的框架,你可以插入自定义的代码来处理发送给蜘蛛的请求和返回蜘蛛获取的响应内容和项目。
8、Scheduler middlewares(调度中间件)

    调度中间件是介于Scrapy引擎和调度之间的中间件,主要工作是处从Scrapy引擎发送到调度的请求和响应。他提供了一个自定义的代码来拓展Scrapy的功能。

scrapy爬虫机制/工作流

1. 绿线是数据流向,首先从初始 URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider 分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到 Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。

2. 发起请求->下载中间件处理请求->下载数据得到response->中间件对response做处理->parse函数解析response,提取你要的信息->生成item(或request)->pipeline处理item。

一般要定制的主要是parse和pipeline,其他的scrapy都帮我们搞定了,所以只用专注于解析数据、生成新请求和存储了。现在scrapy的流程已经清楚了,scrapy还提供了一些额外的服务,比如日志模块,feed exports来帮助转换数据格式等,不过都是锦上添花了。

3. 数据处理流程详解
    Scrapy的整个数据处理流程有Scrapy引擎进行控制,其主要的运行方式为:
引擎打开一个域名,时蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL。
引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。
引擎从调度那获取接下来进行爬取的页面。
调度将下一个爬取的URL返回给引擎,引擎将他们通过下载中间件发送到下载器。
当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。
引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。
蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。
引擎将抓取到的项目项目管道,并向调度发送请求。
系统重复第二部后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系。

scrapy的重点 - 自定义部分

items模块:items用来定义你需要提取的数据的格式,方便进行一层一层的分析操作,你可以直接把它在使用上类比成python的字典,在概念上类比为mongodb的schema。

spider:就是我们的爬虫主体了,这里最重要的功能是对下载下来的数据做解析,生成符合规范的item或发起新的请求。我们首先实现的parse函数是解析spider的start_url请求的,对start_url默认的下载操作是直接拉下整个html,所以动态网页就不行了。那对于网页里嵌入了js的下面再讲。对于我们手动发起的请求而非初始请求,我们是可以自己指定解析函数的,而非使用默认。同时我们也是可以通过继承scrapy的请求类构造自己的请求以附带一些信息的。这样就实现了请求和对返回结果解析的松耦合。

pipeline:pipeline是对得到的item做进一步处理的,并非你所得到的所有item都是合乎要求的,也有可能还要做一些计算工作才得到你想要的。scrapy这里的强大在于做处理的时候是传入spider对象做参数的,这样你可以把一个pipeline和多个spider拼接,不需要为一个spider另写一个pipeline,同时pipeline是可以有多个在一起的,只要你在processitem函数里返回这个item,它就会被下面的pipeline继续处理。

[Python抓取框架:Scrapy的架构]

scrapy的python3支持

不过很抱歉的一点是scrapy并不支持python3,目前正在移植中,相信在2016年前应该差不多可以用了吧。[Python 3 Porting]

scrapy的功能

HTML, XML源数据 选择及提取 的内置支持
提供了一系列在spider之间共享的可复用的过滤器(即 Item Loaders),对智能处理爬取数据提供了内置支持。
通过 feed导出 提供了多格式(JSON、CSV、XML),多存储后端(FTP、S3、本地文件系统)的内置支持
提供了media pipeline,可以 自动下载 爬取到的数据中的图片(或者其他资源)。
高扩展性。您可以通过使用 signals ,设计好的API(中间件, extensions, pipelines)来定制实现您的功能。
内置的中间件及扩展为下列功能提供了支持:
cookies and session 处理
HTTP 压缩
HTTP 认证
HTTP 缓存
user-agent模拟
robots.txt
爬取深度限制
针对非英语语系中不标准或者错误的编码声明, 提供了自动检测以及健壮的编码支持。
支持根据模板生成爬虫。在加速爬虫创建的同时,保持在大型项目中的代码更为一致。详细内容请参阅 genspider 命令。
针对多爬虫下性能评估、失败检测,提供了可扩展的 状态收集工具 。
提供 交互式shell终端 , 为您测试XPath表达式,编写和调试爬虫提供了极大的方便
提供 System service, 简化在生产环境的部署及运行
内置 Web service, 使您可以监视及控制您的机器
内置 Telnet终端 ,通过在Scrapy进程中钩入Python终端,使您可以查看并且调试爬虫
Logging 为您在爬取过程中捕捉错误提供了方便
支持 Sitemaps 爬取
具有缓存的DNS解析器[http://doc.scrapy.org/en/latest/]

皮皮Blog



scrapy的安装和环境配置

我们将需要 Scrapy以及 BeautifulSoup用于屏幕抓取,SQLAlchemy用于存储数据。

创建虚拟环境(按需)

virtualenv --no-site-packages --python=2.7 ScrapyEnv

[python虚拟环境配置]

安装scrapy

unix

直接通过 pip 命令安装

pip install Scrapy

Windows

1. 下载包的编译版本完成简易安装

需要手工安装 scrapy 的一些依赖:pywin32、pyOpenSSL、Twisted、lxml 和 zope.interface。

2. 使用pip安装

首先也要安装pywin32的py2.7版本http://sourceforge.net/projects/pywin32/files/,再安装scrapy就ok了pip install Scrapy,它会自动安装依赖的包pyOpenSSL、Twisted、lxml 、six等等。

如果使用的是virtualenv要这样安装pywin32:

c:\> copy D:\python27\Lib\site-packages\pywin32.pth E:\mine\python_workspace\ScrapyEnv\Lib\site-packages\pywin32.pth

将其内容改为:

D:\python27\Lib\site-packages\win32
D:\python27\Lib\site-packages\win32\lib
D:\python27\Lib\site-packages\Pythonwin

[linux和windows下安装python拓展包]

验证安装是否成功

通过在python命令行下输入import scrapy验证你的安装,如果没有返回内容,那么你的安装已就绪。

python爬虫 - scrapy的安装和使用_第1张图片

[Installing Scrapy]

安装爬虫相关拓展包(按需)

安装网络请求包requests

pip install requests

[requests网络请求简洁之道]

安装rsa加密拓展包

pip install rsa

加入到git管理中(按需)

git init

git add .

git commit -m 'first commit'

github上添加repository

git remote add scrapyEnv [email protected]:***.git

git push -u scrapyEnv master #首次运行以后用git push scrapyEnv master

皮皮Blog




Scrapy 爬虫项目实践

了解一些 Scrapy 的基本概念和使用方法,并学习 Scrapy 项目的例子 dirbot 。该项目爬取网站目录python语言下books和Resourses目录。

Dirbot 项目位于 https://github.com/scrapy/dirbot,该项目包含一个 README 文件,它详细描述了项目的内容。如果你熟悉 git,你可以 checkout 它的源代码。或者你可以通过点击 Downloads 下载 tarball 或 zip 格式的文件。

下面以该例子来描述如何使用 Scrapy 创建一个爬虫项目。大概流程如下:

1. 创建一个新的爬虫项目

2. 定义你要爬取的items

3. 写一个spider来爬取网站并抽取items

4. 写一个item pipeline来存储抽取的数据

新建工程

在抓取之前,你需要新建一个 Scrapy 工程。进入一个你想用来保存代码的目录,然后执行:

$scrapy startproject tutorial

这个命令会在当前目录下创建一个新目录 tutorial

目录 tutorial下的结构:

tutorial/
    scrapy.cfg            # deploy configuration file
    tutorial/             # project's Python module, you'll import your code from here
        __init__.py
        items.py          # project items file
        pipelines.py      # project pipelines file
        settings.py       # project settings file
        spiders/          # a directory where you'll later put your spiders
            __init__.py
            ...

这些文件主要是:

  • scrapy.cfg: 项目配置文件
  • tutorial/: 项目python模块, 呆会代码将从这里导入
  • tutorial/items.py: 项目items文件
  • tutorial/pipelines.py: 项目管道文件
  • tutorial/settings.py: 项目配置文件
  • tutorial/spiders: 放置spider的目录

Note:

1. 该命令会创建一个tutorial目录,里面有个scrapy-ctl.py 是整个项目的控制脚本,而代码全都放在子目录tutorial里面。

2. 如果你想在pycharm中使用,还要配置一下pycharm中该项目的解释器为py2.7(使用虚拟环境的当前是指定到虚拟环境中的py2.7),这样import scrapy才会成功。

皮皮Blog


定义Item

Items是将要装载抓取的数据的容器,它工作方式像 python 里面的字典,但它提供更多的保护,比如对未定义的字段填充以防止拼写错误。在items.py 文件里,scrapy 需要我们定义一个容器用于放置爬虫抓取的数据。items.py 与 Django 中的models.py 类似。它通过创建一个scrapy.Item 类来声明,定义它的属性为scrpy.Field 对象,就像是一个对象关系映射(ORM, Object Relational Mapping).

我们通过将需要的item模型化,来控制从dmoz.org  获得的站点数据,比如我们要获得站点的名字,url 和网站描述,我们定义这三种属性的域。

class CrawlertestItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

    def __str__(self):
        return 'BlogCrawlItem(url: %s)' % self.link

皮皮Blog


编写爬虫(Spider)

Spider 是用户编写的类,用于从一个域(或域组)中抓取信息。定义用于下载的URL的初步列表,如何跟踪链接,以及如何来解析这些网页的内容用于提取items。

要建立一个 Spider,你可以为 scrapy.Spider 创建一个子类,并确定三个主要的、强制的属性:

  • name:爬虫的识别名,它必须是唯一的,在不同的爬虫中你必须定义不同的名字.
  • start_urls:爬虫开始爬的一个 URL 列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些 URLS 开始。其他子 URL 将会从这些起始 URL 中继承性生成。
  • parse():爬虫的方法,调用时候传入从每一个 URL 传回的 Response 对象作为参数,response 将会是 parse 方法的唯一的一个参数,这个方法负责解析返回的数据、匹配抓取的数据(解析为 item )并跟踪更多的 URL。

1. 可以在项目根目录下使用命令scrapy genspider -t crawl weibo weibo.com生成模块化spider代码

2. 也可以在 tutorial/spiders 目录下创建 DmozSpider.py

import scrapy

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        open(filename, 'wb').write(response.body)
Note:

1.DmozSpider继承自 Spider (通常直接继承自功能更丰富的scrapy.contrib.spiders.CrawlSpider 要方便一些,不过为了展示数据是如何 parse 的,这里还是使用Spider 了)。继承自CrawlSpider类的WeiboSpider的name,allowed_domains属性是必须的,但是start_urls属性是可以不要的,改由其他方法生成。

2. 变量是自解释的 :name 定义了爬虫的名字。

allowed_domains 列出了供爬虫爬行的允许域名(allowed domain)的base-URL,scrapy有一个offsite机制,即是否抓其他域名,需要将allowed_domains属性添加上。

start_urls 列出了爬虫从这里开始爬行的 URL。后续的 URL 将从爬虫从start_urls 下载的数据的URL开始。

3. parse 方法是我们需要定义的回调函数,默认的 request 得到 response 之后会调用这个回调函数,我们需要在这里对页面进行解析,返回两种结果(需要进一步 crawl 的链接和需要保存的数据),但它的接口定义里这两种结果竟然是混杂在一个 list 里返回的。总之这里我们先写一个空函数,只返回一个空列表。另外,定义一个“全局”变量SPIDER ,它会在 Scrapy 导入这个 module 的时候实例化,并自动被 Scrapy 的引擎找到。

parse() 方法使用了response 参数,它是抓取器在像 Hacker News 发起一次请求之后所要返回的东西。 我们会用我们的 XPaths 转换那个响应。

4.接着,scrapy 使用 XPath 选择器从网站获取数据--通过一个给定的 XPath 从 HTML 数据的特定部分进行选择。正如它们的文档所说,"XPath 是一种用于从XML选择节点的语言,它也可以被用于HTML"。

在抓取你自己的站点并尝试计算 XPath 时, Chrome 的开发工具提供了检查html元素的能力, 可以让你拷贝出任何你想要的元素的xpath. 它也提供了检测xpath 的能力,只需要在 Javascript 控制台中使用$x, 例如$x("//img")。 而在这个教程就不多深究这个了,Firefox 有一个插件, FirePath 同样也可以编辑,检查和生成XPath。

运行项目(project’s top level目录)

$scrapy crawl dmoz


该命令从 dmoz.org 域启动爬虫,第三个参数为 DmozSpider.py 中的 name 属性值。

这样之后,你就可以在当前目录下看到爬取下来的两个文件:Books.html and Resources.html

Note: 当然,lz已将它写入到一个启动函数里。在项目根目录下创建文件ExcuteScrapyCrawler:

import subprocess
subprocess.call(r'..\Scripts\activate', shell=True)
subprocess.call('scrapy crawl dmoz')
What just happened under the hood?
Scrapy creates scrapy.Request objects for each URL in the start_urls attribute of the Spider, and assigns them the parse method of the spider as their callback function.
These Requests are scheduled, then executed, and scrapy.http.Response objects are returned and then fed back to the spider, through the parse() method.

皮皮Blog


提取items

spider之xpath选择器

Scrapy 使用一种叫做 XPath 或者 CSS 选择器的机制。[selectors]

Note: CSS vs XPath: you can go a long way extracting data from web pages using only CSS selectors. However, XPath offers more power because besides navigating the structure, it can also look at the content: you’re able to select things like: the link that contains the text ‘Next Page’. Because of this, we encourage you to learn about XPath even if you already know how to construct CSS selectors.

XPath表达式的简单例子:

/html/head/title: 选择HTML文档  元素下面的 </code> 标签。</p> <p><code>/html/head/title/text()</code>: 选择前面提到的<code><title></code> 元素下面的文本内容</p> <p><code>//td</code>: 选择所有 <code><td></code> 元素</p> <p><code>//div[@class="mine"]</code>: 选择所有<span>包含 <code>class="mine"</code> 属性的div 标签</span>元素</p> <p>[XPath 教程][this tutorial to learn XPath through examples][this tutorial to learn “how to think in XPath”]</p> <p>为了方便使用 XPaths</p> <p><strong><span>Scrapy 提供 Selector 类, 有4种方法:</span></strong></p> <p><code><code class="xref py py-meth docutils literal" style="font-family:Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;font-size:12px;border:1px solid rgb(225,228,229);color:rgb(64,64,64);font-weight:bold;background:rgb(255,255,255);"><span class="pre">xpath()</span></code></code>:返回selectors列表, 每一个select表示一个xpath参数表达式选择的节点</p> <p><code><code class="xref py py-meth docutils literal" style="font-family:Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;font-size:12px;border:1px solid rgb(225,228,229);color:rgb(64,64,64);font-weight:bold;background:rgb(255,255,255);"><span class="pre">extract()</span></code></code>:返回一个unicode字符串,该字符串为XPath选择器返回的数据</p> <p><code><code class="xref py py-meth docutils literal" style="font-family:Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;font-size:12px;border:1px solid rgb(225,228,229);color:rgb(64,64,64);font-weight:bold;background:rgb(255,255,255);"><span class="pre">re()</span></code></code>: 返回unicode字符串列表,字符串作为参数由正则表达式提取出来</p> <p><code class="xref py py-meth docutils literal" style="font-family:Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;font-size:12px;border:1px solid rgb(225,228,229);color:rgb(64,64,64);font-weight:bold;background:rgb(255,255,255);"><span class="pre">css()</span></code>: returns a list of selectors, each of which represents the nodes selected by the CSS expression given as argument</p> <p><br></p> <p><span style="font-size:14px;"><strong>在Shell中使用Selectors<br></strong></span>To illustrate the use of Selectors we’re going to use the built-in Scrapy shell, which also requires IPython (an extended Python console) installed on your system.<br>To start a shell, you must go to the project’s top level directory and run:<br>scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"<br></p> <p><strong>Note</strong>: 它会启动 crawler ,把命令行指定的这个页面抓取下来,然后进入 shell ,根据提示,我们有许多现成的变量可以用,其中一个就是 <span style="font-family:'Courier New', Courier, monospace;"><span style="font-size:14.4px;line-height:20px;">hxs</span></span> ,它是一个 <span style="font-family:'Courier New', Courier, monospace;"><span style="font-size:14.4px;line-height:20px;">HtmlXPathSelector</span></span> </p> <p>[Trying Selectors in the Shell]</p> <p><br></p> <h2><span><span style="font-size:14px;">spider之提取数据</span></span></h2> <p><strong>查看要爬取的网页</strong></p> <p>You could type response.body in the console, and inspect the source code to figure out the XPaths you need to use. However, inspecting the raw HTML code there could become a very tedious task. To make it easier, you can use Firefox Developer Tools or some Firefox extensions like Firebug. For more information see <span style="border:1px solid rgb(225,228,229);">Using Firebug for scraping</span><span style="border:1px solid rgb(225,228,229);"> and </span>Using Firefox for scraping</p> <p><a href="http://img.e-com-net.com/image/info8/042cf66e850949f88b4c854154af3016.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/042cf66e850949f88b4c854154af3016.jpg" alt="" width="650" height="74"></a></p> <p><strong>这是要爬取部分的html代码</strong></p> <p></p> <p><ul class="directory-url" style="margin-left:0;"><br>            <li><br>        <a href="http://www.pearsonhighered.com/educator/academic/product/0,,0130260363,00%2Ben-USS_01DBC.html" class="listinglink">Core Python Programming</a> <br>        - By Wesley J. Chun; Prentice Hall PTR, 2001, ISBN 0130260363. For experienced developers to improve extant skills; professional level examples. Starts by introducing syntax, objects, error handling, functions, classes, built-ins. [Prentice Hall]<br>        <div class="flag"><a href="/public/flag?cat=Computers%2FProgramming%2FLanguages%2FPython%2FBooks&url=http%3A%2F%2Fwww.pearsonhighered.com%2Feducator%2Facademic%2Fproduct%2F0%2C%2C0130260363%2C00%252Ben-USS_01DBC.html"><img src="/img/flag.png" alt="[!]" title="report an issue with this listing"></a></div><br>           </li><br>           <li></p> <p>               ...<br><span></span>    </li><br><span></span>    ...<br></ul></p> <p><strong>审查desc部分元素还发现,这部分需要使用正则表达式来提取</strong>(里面包含很多多余字符)</p> <p><a href="http://img.e-com-net.com/image/info8/dc021ece1379463b8a5b598a40101a00.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/dc021ece1379463b8a5b598a40101a00.jpg" alt="python爬虫 - scrapy的安装和使用_第2张图片" width="598" height="238" style="border:1px solid black;"></a><br></p> <p><strong>Note</strong>: <ul> 标签与 <span><li></span> 标签一起使用,创建无序列表<br></p> <p>我们可以通过如下命令选择每个在网站中的 <code><li></code> 元素:</p> <p><span>sel.xpath(</span><span class="hljs-string">'//ul/li'</span><span>) </span></p> <p>然后是网站描述:</p> <p><span>sel.xpath(</span><span class="hljs-string">'//ul/li/text()'</span><span>).extract()</span></p> <p>网站标题:</p> <p><span>sel.xpath(</span><span class="hljs-string">'//ul/li/a/text()'</span><span>).extract()</span></p> <p>网站链接:</p> <p><span>sel.xpath(</span><span class="hljs-string">'//ul/li/a/@href'</span><span>).extract()</span></p> <p>如前所述,每个 <code>xpath()</code> 调用返回一个 selectors 列表,所以我们可以结合 <code>xpath()</code> 去挖掘更深的节点。我们将会用到这些特性,所以:</p> <pre class="hljs perl"><code class="lang-python"></code></pre> <pre style="color:rgb(248,248,242);font-family:SimSun;font-size:10.5pt;"><span style="color:#66d9ef;"><em>for </em></span>sel <span style="color:#66d9ef;"><em>in </em></span><span style="color:#fd971f;"><em>response</em></span>.xpath(<span style="color:#e6db74;">'//ul[@class="directory-url"]/li'</span>)<span style="color:#f92672;">:</span> <span style="color:#e6db74;">title</span> <span style="color:#f92672;">= </span>sel.xpath(<span style="color:#e6db74;">'a/text()'</span>).extract() <span style="color:#e6db74;">link</span> <span style="color:#f92672;">= </span>sel.xpath(<span style="color:#e6db74;">'a/@href'</span>).extract() <span style="color:#e6db74;">desc</span> <span style="color:#f92672;">= </span>sel.xpath(<span style="color:#e6db74;">'text()'</span>).re(<span style="color:#e6db74;">r'-\s(.*)\r\n'</span>)</pre> <p><strong>Note</strong>: </p> <p>1. 正则表达式中提取的内容为- 和回车换行中间的部分,也就是纯的desc部分。</p> <p>2. xpath表达式中的内容也可以通过chrome浏览器F12右键得到,不过不总是很好,有时需要分析修改<a href="http://img.e-com-net.com/image/info8/33f1156e41234e5da23f9ba97ed5b7a0.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/33f1156e41234e5da23f9ba97ed5b7a0.jpg" alt="python爬虫 - scrapy的安装和使用_第3张图片" width="650" height="256" style="border:1px solid black;"></a><br></p> <p></p> <p>这个得到的是//*[@id="bd-cross"]/fieldset[3]/ul/li[1]/text()<br></p> <p><br></p> <p><code><span style="font-size:14px;"><strong>使用Item记录数据<br></strong></span></code></p> <p><code>scrapy.Item</code> 的调用接口类似于 python 的 dict (Item objects are custom Python dicts),Item 包含多个<code>scrapy.Field</code>。这跟 django 的 Model 相似。</p> <p>Item 通常是在 Spider 的 parse 方法里使用,它用来保存解析到的数据。</p> <pre><code class="language-python">import scrapy from tutorial.items import DmozItem class DmozSpider(scrapy.Spider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self, response): for sel in response.xpath('//ul/li'): item = DmozItem() item['title'] = sel.xpath('a/text()').extract() item['link'] = sel.xpath('a/@href').extract() item['desc'] = sel.xpath('text()').extract() yield item</code></pre> <p>现在,可以再次运行该项目查看运行结果。</p> <p><br></p> <p><span style="font-size:14px;"><strong>Following links跟踪链接</strong></span></p> <p>爬取 Python directory目录下所有你感兴趣的链接</p> <p></p> <pre><code class="language-python">import scrapy from tutorial.items import DmozItem class DmozSpider(scrapy.Spider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/", ] def parse(self, response): for href in response.css("ul.directory.dir-col > li > a::attr('href')"): url = response.urljoin(href.extract()) yield scrapy.Request(url, callback=self.parse_dir_contents) def parse_dir_contents(self, response): for sel in response.xpath('//ul/li'): item = DmozItem() item['title'] = sel.xpath('a/text()').extract() item['link'] = sel.xpath('a/@href').extract() item['desc'] = sel.xpath('text()').extract() yield item</code></pre>现在的parse()方法只是从python目录网页中抽取感兴趣的链接,通过response.urljoin()方法建立一个完整url,并在之后生成新的requests用于在后面发送,注册为callback函数的方法parse_dir_contents()最终会抓取我们要的数据。 <p></p> <p>Here is the Scrapy’s mechanism of following links: when you yield a Request in a callback method, Scrapy will schedule that request to be sent and register a callback method to be executed when that request finishes.</p> <p><strong><span>A common pattern</span></strong> is a callback method that extract some items, looks for a link to follow to the next page and then yields a Request with the same callback for it:</p> <p>def parse_articles_follow_next_page(self, response):<br>    for article in response.xpath("//article"):<br>        item = ArticleItem()<br><br>        ... extract article data here<br><br>        yield item<br><br>    next_page = response.css("ul.navigation > li.next-page > a::attr('href')")<br>    if next_page:<br>        url = response.urljoin(next_page[0].extract())<br>        yield Request(url, self.parse_articles_follow_next_page)</p> <p>This creates a sort of loop, following all the links to the next page until it doesn’t find one – handy for crawling blogs, forums and other sites with pagination.</p> <p><strong><span>Another common pattern</span> </strong>is to build an item with data from more than one page, using a trick to pass additional data to the callbacks.</p> <p><strong><span>一种折中的机制是在spiders中使用rules</span></strong></p> <p>自定义的spider继承CrawlSpider</p> <p></p> <pre><code class="language-python">class MySpider(CrawlSpider): name = 'example.com' allowed_domains = ['example.com'] start_urls = ['http://www.example.com'] rules = ( # Extract links matching 'category.php' (but not matching 'subsection.php') # and follow links from them (since no callback means follow=True by default). Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))), # Extract links matching 'item.php' and parse them with the spider's method parse_item Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'), ) def parse_item(self, response): self.logger.info('Hi, this is an item page! %s', response.url) item = scrapy.Item() item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)') item['name'] = response.xpath('//td[@id="item_name"]/text()').extract() item['description'] = response.xpath('//td[@id="item_description"]/text()').extract() return item</code></pre> <p><strong>Note</strong>: 该类并没有实现parse方法,并且规则中定义了回调函数 <code>parse_item</code></p> <p>[CrawlSpider-Crawling rules and CrawlSpider example]</p> <p>皮皮Blog<br></p> <p><br></p> <p><br></p> <p><span><span style="font-size:24px;"><strong>保存抓取的数据</strong></span></span></p> <p></p> <p>保存信息的最简单的方法是通过 Feed exports,命令如下:</p> <p>scrapy crawl dmoz -o items.json</p> <p><span style="color:#c0c0c0;"><span class="hljs-variable">$ </span><span>scrapy crawl dmoz -o items.json -t json</span></span></p> <p>所有抓取的 items 将以 JSON 格式被保存在新生成的 items.json 文件中。</p> <p>除了 json 格式之外,还支持 JSON lines、CSV、XML格式,你也可以通过接口扩展一些格式。对于小项目用这种方法也足够了。如果是比较复杂的数据的话可能就需要编写一个 Item Pipeline 进行处理了。</p> <p><span><strong><span style="font-size:14px;">使用Item Pipeline</span></strong></span></p> <p><strong><span>激活item pipeline</span></strong></p> <p>在 settings.py 中设置 <code>ITEM_PIPELINES</code>,其默认为<code>[]</code>,与 django 的 <code>MIDDLEWARE_CLASSES</code> 相似。从 Spider 的 parse 返回的 Item 数据将依次被 <code>ITEM_PIPELINES</code> 列表中的 Pipeline 类处理。</p> <p><span><strong>ITEM_PIPELINES <span class="pl-k">=</span> {<span class="pl-s"><span class="pl-pds">'</span>dirbot.pipelines.FilterWordsPipeline<span class="pl-pds">'</span></span>:<span class="pl-c1">1</span>}<br></strong></span></p> <p>Note: 后面的整数是piplines运行的顺序,items从小整数到大经过piplines,整数范围是0-1000。</p> <p><strong><span>一个 Item Pipeline 类必须实现的方法</span></strong></p> <p><code>process_item(item, spider)</code> 为每个 item pipeline 组件调用,并且需要返回一个 <code>scrapy.Item</code> 实例对象或者抛出一个 <code>scrapy.exceptions.DropItem</code> 异常。当抛出异常后该 item 将不会被之后的 pipeline 处理。</p> <p>参数:<code>item (Item object)</code> – 由 parse 方法返回的 Item 对象; <code>spider (BaseSpider object)</code> – 抓取到这个 Item 对象对应的爬虫对象</p> <p>也可额外的实现以下3个方法:</p> <p><code>open_spider(spider):</code> 当爬虫打开之后被调用。参数: <code>spider (BaseSpider object)</code> – 已经运行的爬虫</p> <p><code>close_spider(spider):</code> 当爬虫关闭之后被调用。参数: <code>spider (BaseSpider object)</code> – 已经关闭的爬虫<br></p> <p>from_crawler(cls, crawler):If present, this classmethod is called to create a pipeline instance from a Crawler. It must return a new instance of the pipeline. Crawler object provides access to all Scrapy core components like settings and signals; it is a way for pipeline to access them and hook its functionality into Scrapy.</p> <p><strong><span>几个pipline的例子</span></strong></p> <p><strong>过滤desc中带有敏感词的item</strong></p> <p></p> <pre style="color:rgb(248,248,242);font-family:SimSun;font-size:10.5pt;"><span style="color:#66d9ef;"><em>class </em></span><span style="color:#a6e22e;">FilterWordsPipeline</span>(<span style="color:#66d9ef;">object</span>)<span style="color:#f92672;">: </span><span style="color:#f92672;"> </span><span style="color:#75715e;">""" </span><span style="color:#75715e;"> A pipeline for filtering out items which contain certain words in their description </span><span style="color:#75715e;"> """ </span><span style="color:#75715e;"> </span><span style="color:#75715e;"> </span>words_to_filter <span style="color:#f92672;">= </span>[<span style="color:#e6db74;">'politics'</span>, <span style="color:#e6db74;">'religion'</span>] <span style="color:#66d9ef;"><em>def </em></span><span style="color:#a6e22e;">process_item</span>(<span style="color:#fd971f;"><em>self</em></span>, <span style="color:#fd971f;"><em>item</em></span>, <span style="color:#fd971f;"><em>spider</em></span>)<span style="color:#f92672;">: </span><span style="color:#f92672;"> </span><span style="color:#66d9ef;"><em>for </em></span>word <span style="color:#66d9ef;"><em>in </em></span><span style="color:#fd971f;"><em>self</em></span>.words_to_filter<span style="color:#f92672;">: </span><span style="color:#f92672;"> </span><span style="color:#66d9ef;"><em>if </em></span>word <span style="color:#66d9ef;"><em>in </em></span><span style="color:#66d9ef;">unicode</span>(<span style="color:#fd971f;"><em>item</em></span>[<span style="color:#e6db74;">'description'</span>]).lower()<span style="color:#f92672;">: </span><span style="color:#f92672;"> </span><span style="color:#66d9ef;"><em>raise </em></span>DropItem(<span style="color:#e6db74;">"Contains forbidden word: %s" </span><span style="color:#f92672;">% </span>word) <span style="color:#66d9ef;"><em>else</em></span><span style="color:#f92672;">: </span><span style="color:#f92672;"> </span><span style="color:#66d9ef;"><em>return </em></span><span style="color:#fd971f;"><em>item</em></span></pre> <p></p> <p>皮皮Blog<br></p> <p><br></p> <p><br></p> <p><span style="font-size:24px;color:#FF0000;"><strong>PS:其它相关知识</strong></span><br></p> <p><span style="font-size:14px;color:#FF0000;"><strong>Request对象相关函数和方法</strong></span></p> <p><strong>Note</strong>: Response.body: Keep in mind that Response.body is always a str.If you want the unicode version use TextResponse.body_as_unicode().也就是说response.body已经有编码类型如utf-8了。<br></p> <p>[request objects]<br></p> <p><span style="color:#FF0000;"><strong><span style="font-size:14px;">Response对象<span style="font-size:14px;color:#FF0000;"><strong>相关函数和方法</strong></span></span></strong></span></p> <p>[Response objects]<br></p> <p><br></p> <span style="font-size:18px;"><strong><span>定时任务</span></strong></span> <p>如果我们不得不定期手动去执行这个脚本,那将会是很烦人的. 所有这里需要加入定时任务 .<br>定时任务将会在你指定的任何时间自动运行. 但是! 它只会在你的计算机处在运行状态时 (并不是在休眠或者关机的时候),并且特定于这段脚本需要是在和互联网处于联通状态时,才能运行. 为了不管你的计算机是出在何种状态都能运行这个定时任务, 你应该将<code>hn</code> 代码 和<code>bash</code> 脚本,还有<code>cron</code> 任务放在分开的将一直处在”运行“状态的服务器上伺服.</p> <p><br></p> <p><span style="font-size:18px;"><strong><span style="color:#FF0000;">相关错误解决</span></strong></span></p> <p>scrapy ImportError: No module named settings</p> <p>原因:爬虫根目录下不能有__init__文件,用startproject命令创建的目录是没有这个的,如果手动创建可能会创建相关文件</p> <p>解决:将__init__文件移除就OK了<br></p> <p>皮皮Blog<br></p> <p><br></p> <p><strong><span><span style="font-size:18px;">使用 BeautifulSoup进行转换&&数据存入了数据库</span></span></strong></p> <p>[使用 Scrapy 建立一个网站抓取器]</p> <p><span><strong>数据存入数据库</strong></span><br></p> <p>Crawl a website with scrapy & 2 mongoDB<br>Web Scraping with Scrapy and MongoDB<br>Scrapy 轻松定制网络爬虫 - 存入python自带数据库sqlite</p> <p><span><strong>想用爬虫下文件怎么办</strong></span></p> <p>最好你是不要直接用scrapy默认的下载操作,对下载链接的拉取和解析应该和下载文件的处理分离开来。那么你可以自己写一个请求类,然后写一个下载中间件,中间件里维护一个进程池。在里面判断请求的类别,如果不带你定义的标记,就按照原来的默认操作,如果符合,是文件下载,就从进程池里拉出一个进程来做这件事,即使某个文件的下载失败了,你可以监控的,并且在response里表露出来的,更不会影响新的下载链接的生成何已有下载任务的执行。</p> <p>最后中间件的问题,中间件可以包装response,这个我倒觉得对于做爬虫本身意义不是特别大,除非你的爬虫种类非常多,爬的网站也各不相同,就需要先做一点包装和处理了。</p> <p><span style="font-size:18px;"><strong>对于动态页面怎么办</strong></span></p> <p>我们可以自己写一个下载中间件,继承最初始的,然后利用ghost.py在里面模拟用户行为,等html改变之后再拉取。</p> <p><span><strong>scrapy 和 javascript 交互例子</strong></span></p> <p>用scrapy框架爬取js交互式表格数据</p> <p>scrapy + selenium 解析javascript 实例</p> <p><span style="font-size:18px;"><strong><span>gzip/deflate支持+多线程</span></strong><br></span></p> <p>[使用python爬虫抓站的一些技巧总结:进阶篇]</p> <p><strong><span><span style="font-size:14px;">更多爬虫实战文章</span></span></strong></p> <p>Github 上实现了数据爬取的仓库:</p> <p>https://github.com/KeithYue/Zhihu_Spider 实现先通过用户名和密码登陆再爬取数据,代码见zhihu_spider.py。</p> <p>https://github.com/immzz/zhihu-scrapy 使用 selenium 下载和执行 javascript 代码。</p> <p>https://github.com/tangerinewhite32/zhihu-stat-py</p> <p>https://github.com/Zcc/zhihu 主要是爬指定话题的topanswers,还有用户个人资料,添加了登录代码。</p> <p>用Python Requests抓取知乎用户信息</p> <p>https://github.com/pelick/VerticleSearchEngine 基于爬取的学术资源,提供搜索、推荐、可视化、分享四块。使用了 Scrapy、MongoDB、Apache Lucene/Solr、Apache Tika等技术。</p> <p>https://github.com/geekan/scrapy-examples scrapy的一些例子,包括获取豆瓣数据、linkedin、腾讯招聘数据等例子。</p> <p>https://github.com/owengbs/deeplearning 实现分页获取话题。</p> <p>https://github.com/gnemoug/distribute_crawler 使用scrapy、redis、mongodb、graphite实现的一个分布式网络爬虫,底层存储mongodb集群,分布式使用redis实现,爬虫状态显示使用graphite实现</p> <p>https://github.com/weizetao/spider-roach 一个分布式定向抓取集群的简单实现。</p> <p>使用scrapy框架爬取自己的博文</p> <p>在scrapy中怎么让Spider自动去抓取豆瓣小组页面</p> <p>Scraping images with Python and Scrapy</p> <p>from:http://blog.csdn.net/pipisorry/article/details/45190851<br></p> <p>ref:Scrapy Tutorial</p> <p>Scrap入门教程(Scrapy Tutorial中文文档)</p> <p>[Scrapy 0.24 文档]*<br></p> <p>官方主页: http://www.scrapy.org/</p> <p>GitHub项目主页:https://github.com/scrapy/scrapy</p> <p>Scrapy小解</p> <p>使用Scrapy抓取数据</p> <p>Python写爬虫抓站的一些技巧</p> <p>在scrapy中怎么让Spider自动去抓取豆瓣小组页面</p> <p>http://www.52ml.net/tags/Scrapy 收集了很多关于 Scrapy 的文章</p> <p>Scrapy 深入一点点</p> <p>使用scrapy写(定制)爬虫的经验,杂</p> <p>Scrapy实用技巧<br></p> <p><br></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1294219321391783936"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Python网络请求与爬虫)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1901395400154214400.htm" title="金融时间序列分析(Yahoo Finance API实战)" target="_blank">金融时间序列分析(Yahoo Finance API实战)</a> <span class="text-muted">闲人编程</span> <a class="tag" taget="_blank" href="/search/Python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%AE%9E%E6%88%98%E7%B2%BE%E8%A6%81/1.htm">Python数据分析实战精要</a><a class="tag" taget="_blank" href="/search/%E9%87%91%E8%9E%8D/1.htm">金融</a><a class="tag" taget="_blank" href="/search/yfinance/1.htm">yfinance</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97/1.htm">时间序列</a><a class="tag" taget="_blank" href="/search/%E6%B3%A2%E5%8A%A8%E7%8E%87/1.htm">波动率</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BD%92%E4%B8%80%E5%8C%96/1.htm">数据归一化</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/Dash/1.htm">Dash</a> <div>这里写目录标题金融时间序列分析(YahooFinanceAPI实战)1.引言2.项目背景与意义3.数据集介绍4.GPU加速在数据处理中的应用5.交互式GUI设计与加速处理6.系统整体架构7.数学公式与指标计算8.完整代码实现9.代码自查与BUG排查10.总结与展望金融时间序列分析(YahooFinanceAPI实战)1.引言在当今金融市场中,时间序列数据分析是理解股票、指数以及其他金融产品走势的重</div> </li> <li><a href="/article/1901395273805000704.htm" title="系分 02 软件工程" target="_blank">系分 02 软件工程</a> <span class="text-muted">一越王超</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AF%E8%80%83/1.htm">软考</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E5%88%86%E6%9E%90%E5%B8%88/1.htm">系统分析师</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/1.htm">软件工程</a> <div>软件工程本身涵盖内容很广,从系统规划到分析……到维护都属于软件工程,但是我们将会在其他章节讨论相关内容,本节我们主要内容如下:系统规划软件工程信息系统生命周期(★)软件开发模型(★★★★)逆向工程(★★)净室软件工程(★)需求工程系统设计系统测试与维护基础知识软件工程是指应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题的工程,其目的是提高软件生产率、提高软件质量、减低软件成</div> </li> <li><a href="/article/1901395021689581568.htm" title="Python第二十三课:自监督学习 | 无标注数据的觉醒" target="_blank">Python第二十三课:自监督学习 | 无标注数据的觉醒</a> <span class="text-muted">程之编</span> <a class="tag" taget="_blank" href="/search/Python%E5%85%A8%E6%A0%88%E9%80%9A%E5%85%B3%E7%A7%98%E7%B1%8D/1.htm">Python全栈通关秘籍</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>本节目标理解自监督学习的核心范式与优势掌握对比学习(ContrastiveLearning)框架实现图像掩码自编码器(MaskedAutoencoder)开发实战项目:亿级参数模型轻量化探索数据增强的创造性艺术一、自监督学习基础(AI的拼图游戏)1.核心思想解析学习范式数据需求生活比喻监督学习海量标注数据老师逐题批改作业无监督学习纯无标签数据自学杂乱笔记自监督学习自动生成伪标签玩拼图游戏(根据碎片</div> </li> <li><a href="/article/1901393508065931264.htm" title="【从零开始学习计算机科学】软件工程(五)软件设计" target="_blank">【从零开始学习计算机科学】软件工程(五)软件设计</a> <span class="text-muted">贫苦游商</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/1.htm">软件工程</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/1.htm">软件开发</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1/1.htm">软件设计</a><a class="tag" taget="_blank" href="/search/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91/1.htm">敏捷开发</a><a class="tag" taget="_blank" href="/search/%E6%9E%81%E9%99%90%E7%BC%96%E7%A8%8B/1.htm">极限编程</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E9%9C%80%E6%B1%82/1.htm">软件需求</a> <div>【从零开始学习计算机科学】软件工程(五)软件设计软件设计概述良好的设计具有三大特性设计主要包含的方面设计中的一些概念设计的方法与策略体系结构设计体系结构设计的基本问题:体系结构的设计模式体系结构设计的过程构建级设计面向对象构件设计用户接口设计用户接口设计原则:用户接口分析的目标:设计的评审软件设计概述软件的分析偏重于问题域,描述软件要做什么,而设计则偏重于解决方案,描述软件究竟要如何做。设计创建了</div> </li> <li><a href="/article/1901393500499406848.htm" title="97.HarmonyOS NEXT跑马灯组件教程:基础概念与架构设计" target="_blank">97.HarmonyOS NEXT跑马灯组件教程:基础概念与架构设计</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a> <div>温馨提示:本篇博客的详细代码已发布到git:https://gitcode.com/nutpi/HarmonyosNext可以下载运行哦!HarmonyOSNEXT跑马灯组件教程:基础概念与架构设计1.跑马灯组件概述跑马灯(Marquee)是一种常见的UI组件,主要用于在有限的空间内展示超出显示区域的文本内容。当文本内容过长无法在固定宽度内完整显示时,跑马灯组件会使文本自动滚动,以便用户可以查看全</div> </li> <li><a href="/article/1901393379690868736.htm" title="【从零开始学习计算机科学】软件工程(一)软件工程中的过程模型" target="_blank">【从零开始学习计算机科学】软件工程(一)软件工程中的过程模型</a> <span class="text-muted">贫苦游商</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/1.htm">软件工程</a><a class="tag" taget="_blank" href="/search/%E8%BF%87%E7%A8%8B%E6%A8%A1%E5%9E%8B/1.htm">过程模型</a><a class="tag" taget="_blank" href="/search/%E7%80%91%E5%B8%83%E6%A8%A1%E5%9E%8B/1.htm">瀑布模型</a><a class="tag" taget="_blank" href="/search/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91/1.htm">敏捷开发</a><a class="tag" taget="_blank" href="/search/%E6%9E%81%E9%99%90%E7%BC%96%E7%A8%8B/1.htm">极限编程</a><a class="tag" taget="_blank" href="/search/V%E6%A8%A1%E5%9E%8B/1.htm">V模型</a> <div>【从零开始学习计算机科学】软件工程(一)软件工程中的过程模型软件与软件工程软件工程具有以下核心要素软件工程中的过程模型惯用过程模型瀑布模型V模型增量过程模型演化过程模型原型模型螺旋模型协同开发模型喷泉模型专用过程模型构件组装模型统一过程模型(RUP)统一过程模型的起源与发展面向对象UMLRUP有9个工作流:敏捷模型敏捷开发的立场极限编程工业级极限编程(IXP)ScrumScrum中有三种角色:Sc</div> </li> <li><a href="/article/1901393253362626560.htm" title="【从零开始学习计算机科学】设计模式(一)设计模式概述" target="_blank">【从零开始学习计算机科学】设计模式(一)设计模式概述</a> <span class="text-muted">贫苦游商</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/1.htm">软件工程</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/1.htm">软件开发</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1/1.htm">软件设计</a><a class="tag" taget="_blank" href="/search/%E8%A1%8C%E4%B8%BA%E6%A8%A1%E5%BC%8F/1.htm">行为模式</a><a class="tag" taget="_blank" href="/search/%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F/1.htm">建造者模式</a> <div>【从零开始学习计算机科学】设计模式(一)设计模式概述设计模式简介设计模式与软件架构设计模式的分类1.创建型模式(CreationalPatterns)2.结构型模式(StructuralPatterns)3.行为型模式(BehavioralPatterns)4.J2EE模式(J2EEPatterns)设计模式的实际应用设计模式简介设计模式在现代软件开发中扮演着至关重要的角色。它们是开发者在长期实践</div> </li> <li><a href="/article/1901393246010011648.htm" title="85.HarmonyOS NEXT 网络请求与数据处理:构建可靠的数据层" target="_blank">85.HarmonyOS NEXT 网络请求与数据处理:构建可靠的数据层</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a> <div>温馨提示:本篇博客的详细代码已发布到git:https://gitcode.com/nutpi/HarmonyosNext可以下载运行哦!HarmonyOSNEXT网络请求与数据处理:构建可靠的数据层1.网络请求基础1.1基本概念概念说明使用场景HTTP请求基本的网络通信API调用WebSocket双向实时通信即时消息数据序列化数据格式转换请求/响应处理1.2HTTP请求封装classHttpCl</div> </li> <li><a href="/article/1901393121313353728.htm" title="【从零开始学习计算机科学】数字逻辑(四)数字系统设计" target="_blank">【从零开始学习计算机科学】数字逻辑(四)数字系统设计</a> <span class="text-muted">贫苦游商</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%97%E9%80%BB%E8%BE%91/1.htm">数字逻辑</a><a class="tag" taget="_blank" href="/search/verilog/1.htm">verilog</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%97%E7%B3%BB%E7%BB%9F/1.htm">数字系统</a><a class="tag" taget="_blank" href="/search/HDL/1.htm">HDL</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%97%E7%94%B5%E8%B7%AF/1.htm">数字电路</a><a class="tag" taget="_blank" href="/search/FPGA/1.htm">FPGA</a> <div>【从零开始学习计算机科学】数字逻辑(四)数字系统设计数字系统设计硬件描述语言HDL(HardwareDescriptionLanguage)VerilogHDL的起源与发展HDL软核、固核和硬核的重用HDL的应用数字系统设计实现数字系统设计一个数字集成电路的可以从不同的层次(系统级、算法级、寄存器传输级、门级、开关级)以及不同的领域(行为领域、结构领域、物理领域)进行描述。三个领域主要含义如下:行</div> </li> <li><a href="/article/1901393123104321536.htm" title="【从零开始学习计算机科学】硬件设计与FPGA原理" target="_blank">【从零开始学习计算机科学】硬件设计与FPGA原理</a> <span class="text-muted">贫苦游商</span> <a class="tag" taget="_blank" href="/search/%E3%80%90%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E4%B9%A0%E8%AE%A1%E7%AE%97%E6%9C%BA%E3%80%91%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1/1.htm">【从零开始学习计算机】硬件设计</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%97%E9%80%BB%E8%BE%91/1.htm">数字逻辑</a><a class="tag" taget="_blank" href="/search/verilog/1.htm">verilog</a><a class="tag" taget="_blank" href="/search/HDL/1.htm">HDL</a><a class="tag" taget="_blank" href="/search/%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1/1.htm">硬件设计</a><a class="tag" taget="_blank" href="/search/%E7%A1%AC%E4%BB%B6%E5%B7%A5%E7%A8%8B/1.htm">硬件工程</a> <div>硬件设计硬件设计流程在设计硬件电路之前,首先要把大的框架和架构要搞清楚,这要求我们搞清楚要实现什么功能,然后找找有否能实现同样或相似功能的参考电路板(要懂得尽量利用他人的成果,越是有经验的工程师越会懂得借鉴他人的成果)。如果你找到了的参考设计,最好还是先看懂并理解,这一方面能提高我们的电路理解能力,而且能避免设计中的错误。在开始做硬件设计前,根据自己的项目需求,可以去找能够满足硬件功能设计的,有很</div> </li> <li><a href="/article/1901392991793246208.htm" title="HarmonyOS ArkTS声明式UI开发实战教程" target="_blank">HarmonyOS ArkTS声明式UI开发实战教程</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/harmonyos/1.htm">harmonyos</a> <div>引言:为何选择ArkTS?在HarmonyOS生态快速发展的当下,ArkTS作为新一代声明式UI开发框架,正在引发移动应用开发范式的变革。笔者曾在多个跨平台框架开发中经历过"命令式编程之痛",直到接触ArkTS后才发现,原来UI开发可以如此直观高效。本文将通过完整案例解析,带您掌握声明式UI设计的精髓。一、ArkTS声明式设计核心理念1.1与命令式开发的本质差异传统开发中,我们需要逐步指示每个UI</div> </li> <li><a href="/article/1901392111232675840.htm" title="新手村:数据预处理-异常值检测方法" target="_blank">新手村:数据预处理-异常值检测方法</a> <span class="text-muted">嘉羽很烦</span> <a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>机器学习中异常值检测方法一、前置条件知识领域要求编程基础Python基础(变量、循环、函数)、JupyterNotebook或PyCharm使用。统计学基础理解均值、中位数、标准差、四分位数、正态分布、Z-score等概念。机器学习基础熟悉监督/无监督学习、分类、聚类、回归等基本概念。数据预处理数据清洗、特征缩放(标准化/归一化)、数据可视化(Matplotlib/Seaborn)。二、渐进式学习</div> </li> <li><a href="/article/1901391732826763264.htm" title="python ==module 'datetime' has no attribute 'strptime'" target="_blank">python ==module 'datetime' has no attribute 'strptime'</a> <span class="text-muted">NO如果</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>示例:datetime.datetime.strptime(string,"%Y-%m-%d%H:%M:%S")换成时分秒格式,数据库存储为datetime格式</div> </li> <li><a href="/article/1901391733338468352.htm" title="面向实战的 nftables 防火墙配置指南:从入门到高级" target="_blank">面向实战的 nftables 防火墙配置指南:从入门到高级</a> <span class="text-muted">小白也有IT梦</span> <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/%E9%98%B2%E7%81%AB%E5%A2%99/1.htm">防火墙</a><a class="tag" taget="_blank" href="/search/nftables/1.htm">nftables</a> <div>目录初步准备:基础概念与常见命令场景一:基础服务器防火墙(过滤规则)场景二:NAT网关(SNAT/MASQUERADE/DNAT/端口转发)场景三:黑名单/白名单/大量IP的批量管理场景四:记录日志与限速(log/limit/meter)场景五:仅允许特定网卡或特定连接状态(iif/oif/ctstate)场景六:桥接防火墙、VLAN与ingress过滤(bridge/vlan/ingress)场</div> </li> <li><a href="/article/1901389213044109312.htm" title="CTP开发爬坑指北(四)" target="_blank">CTP开发爬坑指北(四)</a> <span class="text-muted">开心秋水</span> <a class="tag" taget="_blank" href="/search/CTP/1.htm">CTP</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E9%87%91%E8%9E%8D/1.htm">金融</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a> <div>CTP开发中有很多需要注意的小细节,稍有不慎就会出问题,不然,轻则表现与预期不符,重则程序崩溃影响策略盈利。本系列将容易遇到的坑列出来,以供开发时参考,如有疑义之处,欢迎指正。三人行,必有我师焉。欢迎加入QQ群736174420,一起讨论交易CTP的使用!~01哪些报单状态是最终状态?我们先来看CTP中有哪些报单状态:/*报单状态*////全部成交#defineTHOST_FTDC_OST_All</div> </li> <li><a href="/article/1901387827141210112.htm" title="遗传算法与深度学习实战(2)——生命模拟及其应用" target="_blank">遗传算法与深度学习实战(2)——生命模拟及其应用</a> <span class="text-muted">盼小辉丶</span> <a class="tag" taget="_blank" href="/search/%E9%81%97%E4%BC%A0%E7%AE%97%E6%B3%95%E4%B8%8E%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%AE%9E%E6%88%98/1.htm">遗传算法与深度学习实战</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E9%81%97%E4%BC%A0%E7%AE%97%E6%B3%95/1.htm">遗传算法</a> <div>遗传算法与深度学习实战(2)——生命模拟及其应用0.前言1.康威生命游戏1.1康威生命游戏的规则1.2实现康威生命游戏1.3空间生命和智能体模拟2.实现生命模拟3.生命模拟应用小结系列链接0.前言生命模拟是进化计算的一个特定子集,模拟了自然界中所观察到的自然过程,例如粒子或鸟群的聚集方式。生命模拟只是用来探索和优化问题的模拟形式之一,还有很多其他形式的模拟,可以更好地建模各种过程,但它们都源于康威</div> </li> <li><a href="/article/1901387323233333248.htm" title="在Python中如何检测和解决内存泄漏问题" target="_blank">在Python中如何检测和解决内存泄漏问题</a> <span class="text-muted">python资深爱好者</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>在Python中,内存泄漏通常不是像在一些低级语言(如C或C++)中那样常见,因为Python的内存管理(包括自动垃圾回收)相对高级且自动化。然而,在长时间运行的应用程序中,特别是在使用大量循环、大型数据结构或外部库时,仍然可能出现内存泄漏。以下是在Python中检测和解决内存泄漏的一些方法:1.使用内存分析工具a.objgraphobjgraph是一个用于分析Python对象图的库,可以帮助你识</div> </li> <li><a href="/article/1901385936747425792.htm" title="Python在数据处理中的应用:从入门到精通" target="_blank">Python在数据处理中的应用:从入门到精通</a> <span class="text-muted">程之编</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>活动发起人@小虚竹想对你说:这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你参加为期14天的创作挑战赛!在当今数字化时代,数据处理已成为各个领域不可或缺的一部分。无论是企业决策、科学研究还是日常的个人数据分析,掌握高效的</div> </li> <li><a href="/article/1901385937447874560.htm" title="洛谷 P5534 【XR-3】等差数列 python" target="_blank">洛谷 P5534 【XR-3】等差数列 python</a> <span class="text-muted">阿于阿于</span> <a class="tag" taget="_blank" href="/search/xr/1.htm">xr</a> <div>这题不用向下取整//就会错,不太能理解为什么...感觉对结果好像没什么影响啊a1,a2,n=map(int,input().split())d=a2-a1an=a1+d*(n-1)s=(a1+an)*n//2print(s)</div> </li> <li><a href="/article/1901385178455011328.htm" title="MCP(Model Context Protocol)模型上下文协议 理论篇1 - 架构" target="_blank">MCP(Model Context Protocol)模型上下文协议 理论篇1 - 架构</a> <span class="text-muted">AIQL</span> <a class="tag" taget="_blank" href="/search/MCP%28Model/1.htm">MCP(Model</a><a class="tag" taget="_blank" href="/search/Context/1.htm">Context</a><a class="tag" taget="_blank" href="/search/Protocol%29/1.htm">Protocol)</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/MCP/1.htm">MCP</a> <div>核心架构理解MCP如何连接客户端、服务器和LLM模型上下文协议(MCP)建立在灵活、可扩展的架构之上,能够实现LLM应用程序和集成之间的无缝通信。本文档涵盖了核心架构组件和概念。概述MCP采用客户端-服务器架构,其中:主机(Hosts)是发起连接的LLM应用程序(例如DesktopApp或IDE)。客户端(Clients)在主机应用程序内部与服务器保持1对1的连接。服务器(Servers)为客户端</div> </li> <li><a href="/article/1901383541493657600.htm" title="python 装饰器" target="_blank">python 装饰器</a> <span class="text-muted">每天减 1/5kg</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>装饰器装饰器本质上是一个返回函数的高阶函数,可以接收函数作为参数,并返回一个新的函数。它允许你在不修改原函数代码的情况下,动态地给函数或方法添加额外的功能在我们的日常使用中,装饰器一般用于:日志记录、权限认证、性能分析、缓存等场景。简单示例defmy_decorator(func):defwrapper(*args,**kwargs):print("Beforecallingthefunction</div> </li> <li><a href="/article/1901383541921476608.htm" title="协程与事件循环" target="_blank">协程与事件循环</a> <span class="text-muted">每天减 1/5kg</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>协程与事件循环协程协程是一种用户态的轻量级线程,允许在多个任务间高效的切换,而无需依赖操作系统的线程调度。特点协作式多任务:协程主动让出执行权(通过yield或await),而非被操作系统调度(强制中断——抢占式)。状态保存:协程的状态保存在协程的栈中,协程切换时保存上下文(如局部变量、执行位置),恢复时从中断处继续。性能提升:协程相比线程,在切换消耗上性能提升。缺点需要在代码中显式调用,且需要手</div> </li> <li><a href="/article/1901382534281883648.htm" title="支持向量机 (SVM) 算法详解" target="_blank">支持向量机 (SVM) 算法详解</a> <span class="text-muted">sssugarr</span> <a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3/1.htm">机器学习算法详解</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/svm/1.htm">svm</a><a class="tag" taget="_blank" href="/search/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA/1.htm">支持向量机</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/sklearn/1.htm">sklearn</a> <div>支持向量机(SVM)算法详解支持向量机(SupportVectorMachine,SVM)是一种监督学习模型,广泛应用于分类和回归分析。SVM特别适合高维数据,并且在处理复杂非线性数据时表现出色。本文将详细讲解SVM的原理、数学公式、应用场景及其在Python中的实现。什么是支持向量机?支持向量机的目标是找到一个最佳的决策边界(或称超平面)来最大限度地分隔不同类别的数据点。对于线性可分的数据,SV</div> </li> <li><a href="/article/1901382407924281344.htm" title="python记录运行时间_计算python程序运行时间" target="_blank">python记录运行时间_计算python程序运行时间</a> <span class="text-muted">weixin_39668408</span> <a class="tag" taget="_blank" href="/search/python%E8%AE%B0%E5%BD%95%E8%BF%90%E8%A1%8C%E6%97%B6%E9%97%B4/1.htm">python记录运行时间</a> <div>本文介绍三种方法用来计算python程序的运行时间,考虑多现在计算机都是多进程执行环境,本文介绍的方法,前两种统计了其它进程的时间,实际上是python程序执行开始和结束的时间,只有最后一个方法,是计算的python程序的独自占用的CPU时间,但是python官方已经不再推荐。各位同学可以根据自己的应用情况选择考虑。1,用datatime模块,秒级精度>>>importdatetime>>>dat</div> </li> <li><a href="/article/1901382153720098816.htm" title="京准电钟分享:水利系统NTP网络时间服务器应用" target="_blank">京准电钟分享:水利系统NTP网络时间服务器应用</a> <span class="text-muted">北京华人开创公司</span> <a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%92%9F%E7%B3%BB%E7%BB%9F/1.htm">时钟系统</a><a class="tag" taget="_blank" href="/search/%E5%8C%97%E6%96%97%E5%8D%AB%E6%98%9F%E6%8E%88%E6%97%B6/1.htm">北斗卫星授时</a><a class="tag" taget="_blank" href="/search/NTP%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5/1.htm">NTP时间同步</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5/1.htm">时间同步</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%92%9F%E5%90%8C%E6%AD%A5/1.htm">时钟同步</a><a class="tag" taget="_blank" href="/search/NTP%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">NTP服务器</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E6%97%B6%E9%97%B4%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">网络时间服务器</a> <div>京准电钟分享:水利系统NTP网络时间服务器应用京准电钟分享:水利系统NTP网络时间服务器应用1.项目背景水利控制系统涵盖水文监测、闸门控制、泵站调度、数据采集与传输等多个子系统,设备分布广泛且需协同工作。系统内各设备(如PLC、RTU、SCADA服务器、传感器等)的时间一致性直接影响数据记录的准确性、事件报警的时序性以及故障分析的可靠性。为实现全系统高精度时间同步,需部署NTP(NetworkTi</div> </li> <li><a href="/article/1901382155209076736.htm" title="京准电钟:体育馆GPS北斗卫星校时钟系统" target="_blank">京准电钟:体育馆GPS北斗卫星校时钟系统</a> <span class="text-muted">北京华人开创公司</span> <a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%92%9F%E7%B3%BB%E7%BB%9F/1.htm">时钟系统</a><a class="tag" taget="_blank" href="/search/%E5%8C%97%E6%96%97%E5%8D%AB%E6%98%9F%E6%8E%88%E6%97%B6/1.htm">北斗卫星授时</a><a class="tag" taget="_blank" href="/search/NTP%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5/1.htm">NTP时间同步</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%92%9F%E7%B3%BB%E7%BB%9F/1.htm">时钟系统</a><a class="tag" taget="_blank" href="/search/%E5%AD%90%E6%AF%8D%E9%92%9F%E7%B3%BB%E7%BB%9F/1.htm">子母钟系统</a><a class="tag" taget="_blank" href="/search/NTP%E6%97%B6%E9%92%9F/1.htm">NTP时钟</a><a class="tag" taget="_blank" href="/search/%E5%8D%AB%E6%98%9F%E6%A0%A1%E6%97%B6%E9%92%9F/1.htm">卫星校时钟</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E6%8E%88%E6%97%B6%E7%B3%BB%E7%BB%9F/1.htm">网络授时系统</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5%E7%B3%BB%E7%BB%9F/1.htm">时间同步系统</a> <div>京准电钟:体育馆GPS北斗卫星校时钟系统京准电钟:体育馆GPS北斗卫星校时钟系统一、系统架构与组成主控系统(母钟)采用GPS/北斗双模接收模块,通过卫星信号获取标准UTC时间,精度可达±100ns14。主备冗余设计:两台母钟互为热备份,故障时自动切换(切换时间<50ms),内置铷原子钟或恒温晶振作为守时源,确保卫星失锁24小时内误差不超过20μs234。支持NTP/SNTP协议,为网络设备提供时间</div> </li> <li><a href="/article/1901382025898684416.htm" title="京准电钟:关于NTP网络时间同步系统应用方案" target="_blank">京准电钟:关于NTP网络时间同步系统应用方案</a> <span class="text-muted">北京华人开创公司</span> <a class="tag" taget="_blank" href="/search/%E5%8C%97%E6%96%97%E5%8D%AB%E6%98%9F%E6%8E%88%E6%97%B6/1.htm">北斗卫星授时</a><a class="tag" taget="_blank" href="/search/NTP%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5/1.htm">NTP时间同步</a><a class="tag" taget="_blank" href="/search/%E5%8D%AB%E6%98%9F%E5%90%8C%E6%AD%A5%E6%97%B6%E9%92%9F/1.htm">卫星同步时钟</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5/1.htm">时间同步</a><a class="tag" taget="_blank" href="/search/NTP/1.htm">NTP</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E6%8E%88%E6%97%B6/1.htm">网络授时</a><a class="tag" taget="_blank" href="/search/%E6%8E%88%E6%97%B6%E6%9C%8D%E5%8A%A1/1.htm">授时服务</a><a class="tag" taget="_blank" href="/search/%E5%8D%AB%E6%98%9F%E6%8E%88%E6%97%B6%E6%9C%8D%E5%8A%A1/1.htm">卫星授时服务</a> <div>京准电钟:关于NTP网络时间同步系统应用方案京准电钟:关于NTP网络时间同步系统应用方案一、背景与需求分析在现代信息化系统中,网络设备、服务器、终端设备的时间同步是保障业务连续性、数据一致性和安全审计的核心基础。时间不同步可能导致以下问题:日志记录时间混乱,影响故障排查;分布式系统事务冲突或数据不一致;安全证书验证失败或攻击行为难以追溯;工业控制、金融交易等高精度场景的时间敏感操作异常。需求目标:</div> </li> <li><a href="/article/1901381899520110592.htm" title="京准电钟分享:医院网络内NTP时间同步服务器作用是什么?" target="_blank">京准电钟分享:医院网络内NTP时间同步服务器作用是什么?</a> <span class="text-muted">北京华人开创公司</span> <a class="tag" taget="_blank" href="/search/%E5%8C%97%E6%96%97%E5%8D%AB%E6%98%9F%E6%8E%88%E6%97%B6/1.htm">北斗卫星授时</a><a class="tag" taget="_blank" href="/search/NTP%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5/1.htm">NTP时间同步</a><a class="tag" taget="_blank" href="/search/GPS%E5%AF%B9%E6%97%B6%E8%A3%85%E7%BD%AE/1.htm">GPS对时装置</a><a class="tag" taget="_blank" href="/search/NTP/1.htm">NTP</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">时间同步服务器</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E6%97%B6%E9%97%B4%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">网络时间服务器</a><a class="tag" taget="_blank" href="/search/NTP%E6%97%B6%E9%97%B4%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">NTP时间服务器</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%B3%BB%E7%BB%9F%E6%97%B6%E9%92%9F%E5%90%8C%E6%AD%A5/1.htm">网络系统时钟同步</a> <div>京准电钟分享:医院网络内NTP时间同步服务器作用是什么?京准电钟分享:医院网络内NTP时间同步服务器作用是什么?时间同步技术必定将是整个大数据处理系统的重要支撑和保障。时间同步技术使数据产生与处理系统的所有节点具有全局的、统一的标准时间,从而使系统中的所有各种消息、事件、节点、数据等具备正确的逻辑性、协调性以及可追溯性。大数据产生与处理系统是各种计算设备集群的,计算设备将统一、同步的标准时间用于记</div> </li> <li><a href="/article/1901379884333199360.htm" title="[特殊字符] 用Rust重塑Web开发速度极限:Hyperlane框架——开启高性能服务的「光年时代」[特殊字符]" target="_blank">[特殊字符] 用Rust重塑Web开发速度极限:Hyperlane框架——开启高性能服务的「光年时代」[特殊字符]</a> <span class="text-muted">LTPP</span> <a class="tag" taget="_blank" href="/search/rust/1.htm">rust</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%B9%B6%E5%8F%91/1.htm">高并发</a> <div>每秒百万级请求?Rust超新星Hyperlane框架让Web开发突破性能次元壁!颠覆性技术亮点:为何全球顶尖工程师正疯狂迁移至Hyperlane?⚡️「速度即正义」:重新定义Web性能天花板零延迟战场:实测万级并发下延迟低于5ms,让传统框架望尘莫及。Rust内核级优化:基于tokio异步运行时的极致封装,QPS突破5万+,内存占用极低,完美适配边缘计算与云原生场景。️「开发者狂喜」:5分钟极速上</div> </li> <li><a href="/article/1901378749077712896.htm" title="设计模式——装饰器模式" target="_blank">设计模式——装饰器模式</a> <span class="text-muted">zzzhpzhpzzz</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E8%A3%85%E9%A5%B0%E5%99%A8%E6%A8%A1%E5%BC%8F/1.htm">装饰器模式</a> <div>一、定义与概念定义C++装饰器模式(DecoratorPattern)是一种结构型设计模式,它允许在运行时动态地给对象添加额外的功能,而无需修改对象的原始类结构。该模式通过创建一个装饰类,包装原始对象,并在保持原始对象接口不变的情况下,扩展其功能。核心思想把对象的功能扩展从类的继承关系转变为对象之间的组合关系。通过装饰器类对原始对象进行包装,装饰器类和原始对象实现相同的接口,这样在客户端看来,装饰</div> </li> <li><a href="/article/102.htm" title="xml解析" target="_blank">xml解析</a> <span class="text-muted">小猪猪08</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>1、DOM解析的步奏 准备工作:    1.创建DocumentBuilderFactory的对象    2.创建DocumentBuilder对象    3.通过DocumentBuilder对象的parse(String fileName)方法解析xml文件    4.通过Document的getElem</div> </li> <li><a href="/article/229.htm" title="每个开发人员都需要了解的一个SQL技巧" target="_blank">每个开发人员都需要了解的一个SQL技巧</a> <span class="text-muted">brotherlamp</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/linux%E8%A7%86%E9%A2%91/1.htm">linux视频</a><a class="tag" taget="_blank" href="/search/linux%E6%95%99%E7%A8%8B/1.htm">linux教程</a><a class="tag" taget="_blank" href="/search/linux%E8%87%AA%E5%AD%A6/1.htm">linux自学</a><a class="tag" taget="_blank" href="/search/linux%E8%B5%84%E6%96%99/1.htm">linux资料</a> <div>  对于数据过滤而言CHECK约束已经算是相当不错了。然而它仍存在一些缺陷,比如说它们是应用到表上面的,但有的时候你可能希望指定一条约束,而它只在特定条件下才生效。 使用SQL标准的WITH CHECK OPTION子句就能完成这点,至少Oracle和SQL Server都实现了这个功能。下面是实现方式: CREATE TABLE books (   id &</div> </li> <li><a href="/article/356.htm" title="Quartz——CronTrigger触发器" target="_blank">Quartz——CronTrigger触发器</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a><a class="tag" taget="_blank" href="/search/CronTrigger/1.htm">CronTrigger</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2208295 一.概述 CronTrigger 能够提供比 SimpleTrigger 更有具体实际意义的调度方案,调度规则基于 Cron 表达式,CronTrigger 支持日历相关的重复时间间隔(比如每月第一个周一执行),而不是简单的周期时间间隔。 二.Cron表达式介绍 1)Cron表达式规则表 Quartz</div> </li> <li><a href="/article/483.htm" title="Informatica基础" target="_blank">Informatica基础</a> <span class="text-muted">18289753290</span> <a class="tag" taget="_blank" href="/search/Informatica/1.htm">Informatica</a><a class="tag" taget="_blank" href="/search/Monitor/1.htm">Monitor</a><a class="tag" taget="_blank" href="/search/manager/1.htm">manager</a><a class="tag" taget="_blank" href="/search/workflow/1.htm">workflow</a><a class="tag" taget="_blank" href="/search/Designer/1.htm">Designer</a> <div>1. 1)PowerCenter Designer:设计开发环境,定义源及目标数据结构;设计转换规则,生成ETL映射。 2)Workflow  Manager:合理地实现复杂的ETL工作流,基于时间,事件的作业调度 3)Workflow  Monitor:监控Workflow和Session运行情况,生成日志和报告 4)Repository  Manager:</div> </li> <li><a href="/article/610.htm" title="linux下为程序创建启动和关闭的的sh文件,scrapyd为例" target="_blank">linux下为程序创建启动和关闭的的sh文件,scrapyd为例</a> <span class="text-muted">酷的飞上天空</span> <a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a> <div>对于一些未提供service管理的程序  每次启动和关闭都要加上全部路径,想到可以做一个简单的启动和关闭控制的文件   下面以scrapy启动server为例,文件名为run.sh:   #端口号,根据此端口号确定PID PORT=6800 #启动命令所在目录 HOME='/home/jmscra/scrapy/' #查询出监听了PORT端口</div> </li> <li><a href="/article/737.htm" title="人--自私与无私" target="_blank">人--自私与无私</a> <span class="text-muted">永夜-极光</span> <div>            今天上毛概课,老师提出一个问题--人是自私的还是无私的,根源是什么?               从客观的角度来看,人有自私的行为,也有无私的</div> </li> <li><a href="/article/864.htm" title="Ubuntu安装NS-3 环境脚本" target="_blank">Ubuntu安装NS-3 环境脚本</a> <span class="text-muted">随便小屋</span> <a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a> <div>  将附件下载下来之后解压,将解压后的文件ns3environment.sh复制到下载目录下(其实放在哪里都可以,就是为了和我下面的命令相统一)。输入命令:   sudo ./ns3environment.sh >>result   这样系统就自动安装ns3的环境,运行的结果在result文件中,如果提示     com</div> </li> <li><a href="/article/991.htm" title="创业的简单感受" target="_blank">创业的简单感受</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E5%88%9B%E4%B8%9A%E7%9A%84%E7%AE%80%E5%8D%95%E6%84%9F%E5%8F%97/1.htm">创业的简单感受</a> <div>        2009年11月9日我进入a公司实习,2012年4月26日,我离开a公司,开始自己的创业之旅。      今天是2012年5月30日,我忽然很想谈谈自己创业一个月的感受。 当初离开边锋时,我就对自己说:“自己选择的路,就是跪着也要把他走完”,我也做好了心理准备,准备迎接一次次的困难。我这次走出来,不管成败</div> </li> <li><a href="/article/1118.htm" title="如何经营自己的独立人脉" target="_blank">如何经营自己的独立人脉</a> <span class="text-muted">aoyouzi</span> <a class="tag" taget="_blank" href="/search/%E5%A6%82%E4%BD%95%E7%BB%8F%E8%90%A5%E8%87%AA%E5%B7%B1%E7%9A%84%E7%8B%AC%E7%AB%8B%E4%BA%BA%E8%84%89/1.htm">如何经营自己的独立人脉</a> <div>独立人脉不是父母、亲戚的人脉,而是自己主动投入构造的人脉圈。“放长线,钓大鱼”,先行投入才能产生后续产出。   现在几乎做所有的事情都需要人脉。以银行柜员为例,需要拉储户,而其本质就是社会人脉,就是社交!很多人都说,人脉我不行,因为我爸不行、我妈不行、我姨不行、我舅不行……我谁谁谁都不行,怎么能建立人脉?我这里说的人脉,是你的独立人脉。   以一个普通的银行柜员</div> </li> <li><a href="/article/1245.htm" title="JSP基础" target="_blank">JSP基础</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/%E6%B3%A8%E9%87%8A/1.htm">注释</a><a class="tag" taget="_blank" href="/search/%E9%9A%90%E5%BC%8F%E5%AF%B9%E8%B1%A1/1.htm">隐式对象</a> <div>  1,JSP语句的声明 <%! 声明 %>    声明:这个就是提供java代码声明变量、方法等的场所。 表达式 <%= 表达式 %>    这个相当于赋值,可以在页面上显示表达式的结果, 程序代码段/小型指令 <% 程序代码片段 %>   2,JSP的注释   <!-- --> </div> </li> <li><a href="/article/1372.htm" title="web.xml之session-config、mime-mapping" target="_blank">web.xml之session-config、mime-mapping</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/session-config/1.htm">session-config</a><a class="tag" taget="_blank" href="/search/mime-mapping/1.htm">mime-mapping</a> <div>session-config 1.定义: <session-config> <session-timeout>20</session-timeout> </session-config> 2.作用:用于定义整个WEB站点session的有效期限,单位是分钟。   mime-mapping 1.定义: <mime-m</div> </li> <li><a href="/article/1499.htm" title="互联网开放平台(1)" target="_blank">互联网开放平台(1)</a> <span class="text-muted">Bill_chen</span> <a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a><a class="tag" taget="_blank" href="/search/qq/1.htm">qq</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A/1.htm">新浪微博</a><a class="tag" taget="_blank" href="/search/%E7%99%BE%E5%BA%A6/1.htm">百度</a><a class="tag" taget="_blank" href="/search/%E8%85%BE%E8%AE%AF/1.htm">腾讯</a> <div>现在各互联网公司都推出了自己的开放平台供用户创造自己的应用,互联网的开放技术欣欣向荣,自己总结如下: 1.淘宝开放平台(TOP) 网址:http://open.taobao.com/ 依赖淘宝强大的电子商务数据,将淘宝内部业务数据作为API开放出去,同时将外部ISV的应用引入进来。 目前TOP的三条主线: TOP访问网站:open.taobao.com ISV后台:my.open.ta</div> </li> <li><a href="/article/1626.htm" title="【MongoDB学习笔记九】MongoDB索引" target="_blank">【MongoDB学习笔记九】MongoDB索引</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a> <div>索引 可以在任意列上建立索引 索引的构造和使用与传统关系型数据库几乎一样,适用于Oracle的索引优化技巧也适用于Mongodb 使用索引可以加快查询,但同时会降低修改,插入等的性能 内嵌文档照样可以建立使用索引 测试数据     var p1 = { "name":"Jack", "age&q</div> </li> <li><a href="/article/1753.htm" title="JDBC常用API之外的总结" target="_blank">JDBC常用API之外的总结</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/jdbc/1.htm">jdbc</a> <div> 做JAVA的人玩JDBC肯定已经很熟练了,像DriverManager、Connection、ResultSet、Statement这些基本类大家肯定很常用啦,我不赘述那些诸如注册JDBC驱动、创建连接、获取数据集的API了,在这我介绍一些写框架时常用的API,大家共同学习吧。     ResultSetMetaData获取ResultSet对象的元数据信息 </div> </li> <li><a href="/article/1880.htm" title="apache VelocityEngine使用记录" target="_blank">apache VelocityEngine使用记录</a> <span class="text-muted">bozch</span> <a class="tag" taget="_blank" href="/search/VelocityEngine/1.htm">VelocityEngine</a> <div>VelocityEngine是一个模板引擎,能够基于模板生成指定的文件代码。   使用方法如下:     VelocityEngine engine = new VelocityEngine();// 定义模板引擎     Properties properties = new Properties();// 模板引擎属</div> </li> <li><a href="/article/2007.htm" title="编程之美-快速找出故障机器" target="_blank">编程之美-快速找出故障机器</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a> <div> package beautyOfCoding; import java.util.Arrays; public class TheLostID { /*编程之美 假设一个机器仅存储一个标号为ID的记录,假设机器总量在10亿以下且ID是小于10亿的整数,假设每份数据保存两个备份,这样就有两个机器存储了同样的数据。 1.假设在某个时间得到一个数据文件ID的列表,是</div> </li> <li><a href="/article/2134.htm" title="关于Java中redirect与forward的区别" target="_blank">关于Java中redirect与forward的区别</a> <span class="text-muted">chenbowen00</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>在Servlet中两种实现: forward方式:request.getRequestDispatcher(“/somePage.jsp”).forward(request, response); redirect方式:response.sendRedirect(“/somePage.jsp”); forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知</div> </li> <li><a href="/article/2261.htm" title="[信号与系统]人体最关键的两个信号节点" target="_blank">[信号与系统]人体最关键的两个信号节点</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F/1.htm">系统</a> <div>         如果把人体看做是一个带生物磁场的导体,那么这个导体有两个很重要的节点,第一个在头部,中医的名称叫做 百汇穴, 另外一个节点在腰部,中医的名称叫做 命门         如果要保护自己的脑部磁场不受到外界有害信号的攻击,最简单的</div> </li> <li><a href="/article/2388.htm" title="oracle 存储过程执行权限" target="_blank">oracle 存储过程执行权限</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B/1.htm">存储过程</a><a class="tag" taget="_blank" href="/search/%E6%9D%83%E9%99%90/1.htm">权限</a><a class="tag" taget="_blank" href="/search/%E6%89%A7%E8%A1%8C%E8%80%85/1.htm">执行者</a><a class="tag" taget="_blank" href="/search/%E8%B0%83%E7%94%A8%E8%80%85/1.htm">调用者</a> <div>在数据库系统中存储过程是必不可少的利器,存储过程是预先编译好的为实现一个复杂功能的一段Sql语句集合。它的优点我就不多说了,说一下我碰到的问题吧。我在项目开发的过程中需要用存储过程来实现一个功能,其中涉及到判断一张表是否已经建立,没有建立就由存储过程来建立这张表。 CREATE OR REPLACE PROCEDURE TestProc  IS    fla</div> </li> <li><a href="/article/2515.htm" title="为mysql数据库建立索引" target="_blank">为mysql数据库建立索引</a> <span class="text-muted">dengkane</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD/1.htm">性能</a><a class="tag" taget="_blank" href="/search/%E7%B4%A2%E5%BC%95/1.htm">索引</a> <div>前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过一些开发,但却对如何为数据库建立适当的索引所知较少,因此我起了写一篇相关文章的念头。  最普通的情况,是为出现在where子句的字段建一个索引。为方便讲述,我们先建立一个如下的表。</div> </li> <li><a href="/article/2642.htm" title="学习C语言常见误区 如何看懂一个程序 如何掌握一个程序以及几个小题目示例" target="_blank">学习C语言常见误区 如何看懂一个程序 如何掌握一个程序以及几个小题目示例</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>如果看懂一个程序,分三步   1、流程   2、每个语句的功能   3、试数   如何学习一些小算法的程序 尝试自己去编程解决它,大部分人都自己无法解决 如果解决不了就看答案 关键是把答案看懂,这个是要花很大的精力,也是我们学习的重点 看懂之后尝试自己去修改程序,并且知道修改之后程序的不同输出结果的含义 照着答案去敲 调试错误 </div> </li> <li><a href="/article/2769.htm" title="centos6.3安装php5.4报错" target="_blank">centos6.3安装php5.4报错</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/centos6/1.htm">centos6</a> <div>报错内容如下: Resolving Dependencies --> Running transaction check ---> Package php54w.x86_64 0:5.4.38-1.w6 will be installed --> Processing Dependency: php54w-common(x86-64) = 5.4.38-1.w6 for </div> </li> <li><a href="/article/2896.htm" title="JSONP请求" target="_blank">JSONP请求</a> <span class="text-muted">flyer0126</span> <a class="tag" taget="_blank" href="/search/jsonp/1.htm">jsonp</a> <div>      使用jsonp不能发起POST请求。 It is not possible to make a JSONP POST request. JSONP works by creating a <script> tag that executes Javascript from a different domain; it is not pos</div> </li> <li><a href="/article/3023.htm" title="Spring Security(03)——核心类简介" target="_blank">Spring Security(03)——核心类简介</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/Authentication/1.htm">Authentication</a> <div>核心类简介 目录 1.1     Authentication 1.2     SecurityContextHolder 1.3     AuthenticationManager和AuthenticationProvider 1.3.1  &nb</div> </li> <li><a href="/article/3150.htm" title="在CentOS上部署JAVA服务" target="_blank">在CentOS上部署JAVA服务</a> <span class="text-muted">java--hhf</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/Java%E6%9C%8D%E5%8A%A1/1.htm">Java服务</a> <div>    本文将介绍如何在CentOS上运行Java Web服务,其中将包括如何搭建JAVA运行环境、如何开启端口号、如何使得服务在命令执行窗口关闭后依旧运行     第一步:卸载旧Linux自带的JDK ①查看本机JDK版本 java -version    结果如下 java version "1.6.0"</div> </li> <li><a href="/article/3277.htm" title="oracle、sqlserver、mysql常用函数对比[to_char、to_number、to_date]" target="_blank">oracle、sqlserver、mysql常用函数对比[to_char、to_number、to_date]</a> <span class="text-muted">ldzyz007</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a> <div>oracle                                &n</div> </li> <li><a href="/article/3404.htm" title="记Protocol Oriented Programming in Swift of WWDC 2015" target="_blank">记Protocol Oriented Programming in Swift of WWDC 2015</a> <span class="text-muted">ningandjin</span> <a class="tag" taget="_blank" href="/search/protocol/1.htm">protocol</a><a class="tag" taget="_blank" href="/search/WWDC+2015/1.htm">WWDC 2015</a><a class="tag" taget="_blank" href="/search/Swift2.0/1.htm">Swift2.0</a> <div>其实最先朋友让我就这个题目写篇文章的时候,我是拒绝的,因为觉得苹果就是在炒冷饭, 把已经流行了数十年的OOP中的“面向接口编程”还拿来讲,看完整个Session之后呢,虽然还是觉得在炒冷饭,但是毕竟还是加了蛋的,有些东西还是值得说说的。 通常谈到面向接口编程,其主要作用是把系统设计和具体实现分离开,让系统的每个部分都可以在不影响别的部分的情况下,改变自身的具体实现。接口的设计就反映了系统</div> </li> <li><a href="/article/3531.htm" title="搭建 CentOS 6 服务器(15) - Keepalived、HAProxy、LVS" target="_blank">搭建 CentOS 6 服务器(15) - Keepalived、HAProxy、LVS</a> <span class="text-muted">rensanning</span> <a class="tag" taget="_blank" href="/search/keepalived/1.htm">keepalived</a> <div>(一)Keepalived (1)安装 # cd /usr/local/src # wget http://www.keepalived.org/software/keepalived-1.2.15.tar.gz # tar zxvf keepalived-1.2.15.tar.gz # cd keepalived-1.2.15 # ./configure # make &a</div> </li> <li><a href="/article/3658.htm" title="ORACLE数据库SCN和时间的互相转换" target="_blank">ORACLE数据库SCN和时间的互相转换</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>SCN(System Change Number 简称 SCN)是当Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字,可以理解成ORACLE数据库的时间戳,从ORACLE 10G开始,提供了函数可以实现SCN和时间进行相互转换;    用途:在进行数据库的还原和利用数据库的闪回功能时,进行SCN和时间的转换就变的非常必要了;    操作方法:   1、通过dbms_f</div> </li> <li><a href="/article/3785.htm" title="Spring MVC 方法注解拦截器" target="_blank">Spring MVC 方法注解拦截器</a> <span class="text-muted">xp9802</span> <a class="tag" taget="_blank" href="/search/spring+mvc/1.htm">spring mvc</a> <div>应用场景,在方法级别对本次调用进行鉴权,如api接口中有个用户唯一标示accessToken,对于有accessToken的每次请求可以在方法加一个拦截器,获得本次请求的用户,存放到request或者session域。 python中,之前在python flask中可以使用装饰器来对方法进行预处理,进行权限处理 先看一个实例,使用@access_required拦截: ? </div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>