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/1948008797381390336.htm" title="Unity与VS2015协同调试C#脚本实战指南" target="_blank">Unity与VS2015协同调试C#脚本实战指南</a> <span class="text-muted">带你玩遍北海道</span> <div>本文还有配套的精品资源,点击获取简介:Unity是广受青睐的跨平台游戏引擎,C#是其主要编程语言。VisualStudio2015作为一个强大的IDE,支持对Unity项目中的C#代码进行深入调试。本文将指导你如何设置VisualStudio2015作为Unity项目的官方外部脚本编辑器,并详细说明如何在VS2015中进行代码调试,包括断点设置、启动调试、调试操作和性能优化等步骤。了解这些调试技巧</div> </li> <li><a href="/article/1948008419294244864.htm" title="深入浅出理解 IOC(控制反转)与 DI(依赖注入)" target="_blank">深入浅出理解 IOC(控制反转)与 DI(依赖注入)</a> <span class="text-muted">snowfoootball</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E5%90%8E%E7%AB%AF/1.htm">前后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</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/spring/1.htm">spring</a> <div>深入浅出理解IOC(控制反转)与DI(依赖注入)深入理解Spring框架中的IoC与DI在学习Spring框架时,控制反转(IoC)和依赖注入(DI)是不可回避的核心概念。它们不仅是设计模式的体现,更是实现高内聚、低耦合架构的关键。本文将从“为何需要”与“如何实现”两个维度,深入剖析这两个概念。一、为何需要IoC与DI:面向对象设计的挑战考虑以下传统的Java代码示例:publicclassOrd</div> </li> <li><a href="/article/1948008292945031168.htm" title="初探贪心算法 -- 使用最少纸币组成指定金额" target="_blank">初探贪心算法 -- 使用最少纸币组成指定金额</a> <span class="text-muted">是小V呀</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/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/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>python实现:#对于任意钱数,求最少张数n=int(input("money:"))#输入钱数bills=[100,50,20,10,5,2,1]#纸币面额种类total=0forbinbills:count=n//b#整除面额求用的纸币张数ifcount>0:print(f"{b}纸币张数{count}")n-=count*b#更新剩余金额total+=count#累加纸币数量print(f</div> </li> <li><a href="/article/1948008172325236736.htm" title="感知数学:差距在哪里" target="_blank">感知数学:差距在哪里</a> <span class="text-muted">政坤奶奶</span> <div>昨天下午,这孩子回来说,“什么是和倍?我似懂非懂。”这孩子说话有个特点,成语随口而出。有些词用的还很恰当。比如这个似懂非懂。定心一想,我也说不清楚什么是和倍。如果说他是似懂非懂,我则是一点也不摸头绪。今天上午,他上学后,我打开他昨天带回来的书。关于和倍问题是这样解释的:已知两个数的和与两个数之间的倍数关系,求这两个数分别是多少,像这样的应用题,通常叫作“和倍问题。”解决和倍问题,一般是要找出两个数</div> </li> <li><a href="/article/1948007662734077952.htm" title="Kubernetes 配置管理全解析:ConfigMap 与 Secret 核心机制" target="_blank">Kubernetes 配置管理全解析:ConfigMap 与 Secret 核心机制</a> <span class="text-muted"></span> <div>在Kubernetes中管理应用配置和敏感信息是核心需求。ConfigMap用于存储非敏感配置数据(如环境变量、配置文件),而Secret专用于存储敏感信息(如密码、密钥),两者都通过键值对形式存储数据,并支持挂载为环境变量或文件供Pod使用。一、核心概念对比特性ConfigMapSecret数据类型非敏感配置(如环境变量、配置文件)敏感数据(密码、密钥、Token)存储格式明文存储(YAML/J</div> </li> <li><a href="/article/1948007536380669952.htm" title="数据结构与算法-09贪心算法&动态规划" target="_blank">数据结构与算法-09贪心算法&动态规划</a> <span class="text-muted">阿诚学java</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/1.htm">数据结构与算法</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/1.htm">学习记录</a><a class="tag" taget="_blank" href="/search/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/1.htm">贪心算法</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/1.htm">动态规划</a><a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a> <div>贪心算法&动态规划1贪心算法介绍贪心算法(GreedyAlgorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪心算法通常用于解决优化问题,如最小化成本、最大化收益等。然而,贪心算法并不总是能够得到全局最优解,但它具有直观、高效、易于实现等优点,因此在许多实际问题中得到了广泛应用。基本思想贪心算法总是从问题的某一个初始解出发。</div> </li> <li><a href="/article/1948007535395008512.htm" title="内卷的劳动节" target="_blank">内卷的劳动节</a> <span class="text-muted">喵喵小世界</span> <div>最初创业的时候,因为生意刚起步,一年三百六十五天,全年无休,没有节假日,更没有时间和机会带孩子东游西逛,增广见闻。五一劳动节,就感觉与自己无关,别人休息的时候,却是我们最忙的时候。如果说非要和这个节日扯上点关系的话,那就是每天都在不停劳动,劳动最光荣,劳动强身健体,相当于运动了。最近几年因为转了行业,终于能和孩子们一同休息,也能奢侈的体验一把各种节假日休息的幸福。没事带孩子去找景拍照,我最喜欢的就</div> </li> <li><a href="/article/1948007535906713600.htm" title="Kubernetes 核心命令速查手册:运维与开发必备" target="_blank">Kubernetes 核心命令速查手册:运维与开发必备</a> <span class="text-muted">liux3528</span> <a class="tag" taget="_blank" href="/search/k8s/1.htm">k8s</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a> <div>本文整理了Kubernetes集群运维的实用命令集锦,涵盖8大核心场景:1)集群基础信息查看;2)Pod生命周期管理;3)服务与网络配置;4)存储与配置管理;5)故障排查方法;6)性能监控优化;7)高级运维技巧;8)命令行效率工具。重点包括节点状态查询、Pod调试、日志分析、网络连通性测试、资源监控等高频操作,并提供了批量处理、安全审计、集群维护等进阶技巧。每个命令均标注适用场景,可作为K8s运维</div> </li> <li><a href="/article/1948006527742832640.htm" title="Eureka 和 Nacos" target="_blank">Eureka 和 Nacos</a> <span class="text-muted">简单程序猿</span> <a class="tag" taget="_blank" href="/search/eureka/1.htm">eureka</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>一、基本介绍EurekaEureka是Netflix公司开发的一款基于REST风格的服务注册与发现组件,专为分布式系统设计。它遵循AP原则(可用性、分区容错性优先),强调在网络分区等异常情况下的服务可用性,是SpringCloudNetflix生态中的核心组件之一。NacosNacos(DynamicNamingandConfigurationService)是阿里巴巴开源的一站式服务发现、配置管</div> </li> <li><a href="/article/1948005141982539776.htm" title="7、开启C与Unity 3D的编程之旅" target="_blank">7、开启C与Unity 3D的编程之旅</a> <span class="text-muted">珊珊333333</span> <a class="tag" taget="_blank" href="/search/Unity/1.htm">Unity</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/Unity/1.htm">Unity</a><a class="tag" taget="_blank" href="/search/3D/1.htm">3D</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80/1.htm">编程基础</a> <div>开启C#与Unity3D的编程之旅1.前期准备在进行每一个教程之前,都有一个名为Scene的场景文件。在整个学习过程中,教程通常从下载项目中的Scene文件开始。打开场景的方法有两种:-直接在项目面板的Assets目录下双击场景图标。-选择File→OpenScene来打开项目中的任何场景。2.学习回顾与要点创建并将新的C#文件分配给对象并不复杂,在Unity3D编辑器中有多种方法可以实现。添加代</div> </li> <li><a href="/article/1948004359514157056.htm" title="Life Chapter 1" target="_blank">Life Chapter 1</a> <span class="text-muted">罗慕清</span> <div>从悲伤到幸福,或许只是一瞬间的事呢。最近忙忙碌碌的,身不由己,莫名总是觉得压抑委屈,看起来过得十分充实,自己心里却没有底,仿佛一直被什么东西追赶着,我必须跑,必须跑,必须跑,身后是恐惧,身前是黑暗。做出的事情也不尽如人意,自己一度成为了自己最讨厌的那种人,说真的,如果不是朋友的信任与陪伴,如果不是觉得不应该让世界上那么多和我息息相关的人为我感到些许难过,如果不是觉得我还有很多事情没有经历过,很多地</div> </li> <li><a href="/article/1948003127089229824.htm" title="数据结构与算法----贪心" target="_blank">数据结构与算法----贪心</a> <span class="text-muted">王嘉俊925</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/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/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/1.htm">贪心算法</a> <div>##贪心算法1.核心思想贪心算法通过每一步的局部最优选择,逐步推导出全局最优解。它的特点是不回溯,即一旦做出选择,就不再修改。2.适用条件贪心算法适用于满足以下两个条件的问题:贪心选择性质:每一步的局部最优选择能够导致全局最优解。最优子结构:问题的最优解包含子问题的最优解。3.贪心算法的证明方法贪心算法的正确性通常需要通过以下方法证明:归纳法:证明每一步的贪心选择都能导致全局最优。交换论证:假设存</div> </li> <li><a href="/article/1948002623248461824.htm" title="Jenkins 不同节点间文件传递:跨 Job 与 同 Job 的实现方法" target="_blank">Jenkins 不同节点间文件传递:跨 Job 与 同 Job 的实现方法</a> <span class="text-muted"></span> <div>在日常的DevOps运维实践中,Jenkins通常被用于串联多个自动化流程,而这些流程往往需要在不同的构建节点(agent)上执行。例如,在以下场景中:场景需求描述(实际问题)最近在一次部署任务中,我遇到这样一个需求:Jenkins的a节点执行某些命令或脚本,生成一个临时文件或构建产物;然后需要b节点获取这个文件,并继续执行后续处理(如压缩、上传、部署等);a节点与b节点不直接通信,它们都只能与J</div> </li> <li><a href="/article/1948002496429486080.htm" title="零基础数据结构与算法——第五章:高级算法-贪心算法-基础&示例" target="_blank">零基础数据结构与算法——第五章:高级算法-贪心算法-基础&示例</a> <span class="text-muted"></span> <div>5.2贪心算法(GreedyAlgorithm)5.2.1贪心算法的基本概念什么是贪心算法?贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是最好或最优的算法。生活例子:想象你在超市购物,手里有100元钱,想买尽可能多的零食。如果你采用贪心策略,你会怎么做?你可能会先选择最便宜的零食,然后是第二便宜的,以此类推,直到钱用完。这就是一种贪心策略——每次都选择当前看起来最</div> </li> <li><a href="/article/1948002496878276608.htm" title="【Python】Gym 库:于开发和比较强化学习(Reinforcement Learning, RL)算法" target="_blank">【Python】Gym 库:于开发和比较强化学习(Reinforcement Learning, RL)算法</a> <span class="text-muted">彬彬侠</span> <a class="tag" taget="_blank" href="/search/Python%E5%9F%BA%E7%A1%80/1.htm">Python基础</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/Gym/1.htm">Gym</a><a class="tag" taget="_blank" href="/search/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0/1.htm">强化学习</a><a class="tag" taget="_blank" href="/search/RL/1.htm">RL</a><a class="tag" taget="_blank" href="/search/Gymnasium/1.htm">Gymnasium</a> <div>Gym是Python中一个广泛使用的开源库,用于开发和比较强化学习(ReinforcementLearning,RL)算法。它最初由OpenAI开发,提供标准化的环境接口,允许开发者在各种任务(如游戏、机器人控制、模拟物理系统)中测试RL算法。Gym的设计简单且灵活,适合学术研究和工业应用。2022年,Gym被整合到Gymnasium(由FaramaFoundation维护)中,成为主流的强化学习</div> </li> <li><a href="/article/1948001956756779008.htm" title="夜夜施肥盼果来,颗颗甜香不负君「芭芭农场喜提鲜果」" target="_blank">夜夜施肥盼果来,颗颗甜香不负君「芭芭农场喜提鲜果」</a> <span class="text-muted">小石头JS</span> <div>前几日见友友Athena的《我有一个“种菜梦”,如今它终于成真了》文章,刚好也是我家芭芭农场收获之时,一直想写篇文章记录一下,但因忙碌一直推到现在,实在不该。与A君合种芭芭农场已有半年有余,如今收获12枚黄心猕猴桃,真是不负众望啊。收获当天过于忙碌,黄心猕猴桃带回家就摞在一堆快递上了,今日忽然想起,立马拆开查看,并试吃一颗。摸起来不太软的黄心猕猴桃,削了皮是金灿灿的黄心,细小的黑色籽粒均匀分布在两</div> </li> <li><a href="/article/1948001575364521984.htm" title="今日计划与复盘2019.7.6" target="_blank">今日计划与复盘2019.7.6</a> <span class="text-muted">河北凤凰高飞</span> <div>今日计划与复盘2019.7.61.早起:6点前达标2.写字一篇3.跑步五公里复盘:今天是妈妈生日,给妈妈买了生日蛋糕。说来惭愧,不是爸爸提醒,我差点忘了妈妈生日,还不如我儿子晚上从衡水一中打来电话,祝他奶奶生日快乐。今天以休息为主,很放松。打卡也很随意,晚上快11点才打了部分卡。</div> </li> <li><a href="/article/1948001444523208704.htm" title="2019-03-31" target="_blank">2019-03-31</a> <span class="text-muted">frank_you</span> <div>1.付出不亚于任何人的努力2.要谦虚,不要骄傲3.要每天反省4.活着,就要感谢5.积善行,思利他6.不要有感性的烦恼今日分享:活着,就要感谢!周六,销售小梁电话询问客户急用钱是否能做押车,与财务沟通后得知小额可以放款,于是回复小梁可以马上操作,当小梁发来行驶证后,发现就是周五抵押还没撤销的那个客户,将情况与小梁沟通后,小梁回复客户表示周一来支行办理业务,感谢她在休息天还在努力询单,感谢财务ZL、Z</div> </li> <li><a href="/article/1948001187617894400.htm" title="黄河,我的母亲——教读《黄河颂》有感" target="_blank">黄河,我的母亲——教读《黄河颂》有感</a> <span class="text-muted">山城居士</span> <div>黄河,你是巍巍昆仑孕育的女儿是生我,养我的母亲你如同黄沙般普通又朴实每天重复着同样的事——哺育我成长你伸出千万条柔弱的手臂,揽着我给我温暖与安全你是摇篮,我就是你摇篮里的婴孩你经历无数的狂风暴雨始终不变奔向黄海的志向把坚强融进了血脉这是你赋予我的期盼——博大胸怀这是你教会我的人生——坚强勇敢</div> </li> <li><a href="/article/1948000733634818048.htm" title="Java内存模型深度解析:栈、堆、方法区详解" target="_blank">Java内存模型深度解析:栈、堆、方法区详解</a> <span class="text-muted">wsj__WSJ</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>本文通过生动比喻和实战案例,帮你彻底掌握Java内存结构中栈内存、堆内存和方法区的核心原理与协作方式。一、为什么要区分三种内存?Java划分栈、堆、方法区是为了提高内存使用效率,不同数据有不同的生命周期和访问频率:数据类型类比场景存储位置生命周期临时数据(方法参数)便签纸栈内存方法执行期间对象实例常用文件夹堆内存对象存在期间类定义信息公司制度手册方法区程序运行期间就像高效的办公桌管理:栈内存:临时</div> </li> <li><a href="/article/1948000732909203456.htm" title="Python 虚拟环境完全指南" target="_blank">Python 虚拟环境完全指南</a> <span class="text-muted">wsj__WSJ</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><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>为何离不开虚拟环境?在Python开发领域,虚拟环境堪称管理项目依赖的不二利器,其重要性体现在多个关键层面:项目隔离独立运行环境构建:为每一个项目量身打造专属的Python运行环境,使各个项目之间相互隔离,互不干扰。化解依赖版本冲突:有效解决不同项目对同一依赖包的版本需求不一致的难题。例如,项目A基于Django3.2进行开发,而项目B需要Django4.0才能正常运作,通过虚拟环境,两者可并行不</div> </li> <li><a href="/article/1948000553300717568.htm" title="双12 没了,淘宝回应取消双 12 :「改名为年终好价节" target="_blank">双12 没了,淘宝回应取消双 12 :「改名为年终好价节</a> <span class="text-muted">高省爱氧惠</span> <div>2023年双十二活动并没有取消。双十二购物狂欢节是每年12月12日的一个大型购物节,消费者可以在这一天享受到各种优惠活动和促销。氧惠APP(带货领导者)——是与以往完全不同的抖客+淘客app!2023全新模式,我的直推也会放到你下面。主打:带货高补贴,深受各位带货团队长喜爱(每天出单带货几十万单)。注册即可享受高补贴+0撸+捡漏等带货新体验。送万元推广大礼包,教你如何1年做到百万团队。双十二购物节</div> </li> <li><a href="/article/1948000551983706112.htm" title="2019年5月8日“情绪管理与正向沟通亲子教养践行21天”艳梅Day20" target="_blank">2019年5月8日“情绪管理与正向沟通亲子教养践行21天”艳梅Day20</a> <span class="text-muted">艳梅_8375</span> <div>一开始的时候总觉得21天践行打卡,而且是每天都必须要做,好难,也许我做不到,也许我会忘,也许我会没有时间,好多的借口和理由。但是当真正的用心去践行,用心去做的时候才发现,其实也没有那么的难。从2019年1月16日的艳梅随笔开始,每天都在不断的践行当中,当自己是发自内心的想去做的时候,才发现完全没有压力,没有任何人的监督和管理,我依然可以坚持到现在。1月16日开始,马上就5个月的时间了,我每天都在做</div> </li> <li><a href="/article/1947999280514002944.htm" title="不和旁人生气,不和家人生气,不和自己生气" target="_blank">不和旁人生气,不和家人生气,不和自己生气</a> <span class="text-muted">如兰</span> <div>放眼过去,那些取得成就的人,都懂得控制好自己的脾气。因为他们会判断怎样对自己有益,而不是凭着自己的性子做事。情绪人人都有,将它爆发出来是本能,而妥善控制好则是一种本领。情绪若不加以控制,任其肆意发展,就会变成洪水猛兽,吞噬掉所有美好与幸福。</div> </li> <li><a href="/article/1947999023755489280.htm" title="小红书博主如何赚钱" target="_blank">小红书博主如何赚钱</a> <span class="text-muted">配音新手圈</span> <div>做了小红书账号一年了,现在做到万粉了,有资格来说说小红书账号怎么赚钱,兼职副业推荐公众号,配音新手圈,声优配音圈,新配音兼职圈,配音就业圈,鼎音副业,有声新手圈,每天更新各种远程工作与在线兼职,职位包括:写手、程序开发、剪辑、设计、翻译、配音、无门槛、插画、翻译、等等。。。每日更新兼职。怎么接推广,接通告。无论做什么,其实都需要你做过小红书的账号,也就是说你是小红书的博主,素人(也就是说几十几百的</div> </li> <li><a href="/article/1947994056307044352.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/%E5%AD%A6%E4%B9%A0/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>以下是基于2025年最新技术趋势的Python学习路线,综合多个权威资源整理而成,涵盖从零基础到进阶应用的全流程,适合不同学习目标(如Web开发、数据分析、人工智能等)的学习者。路线分为基础、进阶、实战、高级、方向拓展五个阶段,并附学习资源推荐:一、基础阶段(1-2个月)目标:掌握Python核心语法与编程思维,熟悉开发环境。环境搭建安装Python3.10+,配置PyCharm或VSCode开发</div> </li> <li><a href="/article/1947993424741330944.htm" title="小白带你部署LNMP分布式部署" target="_blank">小白带你部署LNMP分布式部署</a> <span class="text-muted">刘俊涛liu</span> <a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>目录前言一、概述二、LNMP环境部署三、配置nginx1、yum安装2、编译安装四、安装1、编译安装nginx2、网络源3、稍作优化4、修改配置文件vim/usr/local/nginx/conf/nginx.conf5、书写测试页面五、部署应用前言LNMP平台指的是将Linux、Nginx、MySQL和PHP(或者其他的编程语言,如Python、Perl等)集成在一起的一种Web服务器环境。它是</div> </li> <li><a href="/article/1947992541873893376.htm" title="AI Agent开发学习系列 - langchain之示例选择器2:相关性与多样性兼得-MaxMarginalRelevanceExampleSelector在LangChain中的用法" target="_blank">AI Agent开发学习系列 - langchain之示例选择器2:相关性与多样性兼得-MaxMarginalRelevanceExampleSelector在LangChain中的用法</a> <span class="text-muted">alex100</span> <a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/Agent/1.htm">Agent</a><a class="tag" taget="_blank" href="/search/%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/langchain/1.htm">langchain</a><a class="tag" taget="_blank" href="/search/prompt/1.htm">prompt</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">语言模型</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>MaxMarginalRelevanceExampleSelectorMaxMarginalRelevanceExampleSelector是LangChain中用于Few-ShotPrompt的一种智能示例选择器。它的作用是:在众多示例中,自动选择与当前输入最相关、同时彼此多样性最大的示例,插入到prompt里。主要特点相关性优先:优先选择与用户输入最相似的示例。多样性保证:避免选到内容高度重复</div> </li> <li><a href="/article/1947992429344911360.htm" title="复盘日志㈡" target="_blank">复盘日志㈡</a> <span class="text-muted">李怡芳</span> <div>Part11,从本单元中我学到的最重要的理念(精读和视听说分别总结)精读:拥有一个真心朋友是人生的幸事,一定要珍惜与朋友之间的友谊,及时与朋友联系。视听说:用不同的方式去休闲娱乐,在电影中放松自我,在音乐中感受欢乐,让自己身心愉悦。2,我在本片文章/音频/视频中学到的怦然心动的单词(精读和视听说分别总结)精读:available,orsomething,goahead,byheart,kindof</div> </li> <li><a href="/article/1947992302182002688.htm" title="Visio软件下载安装包免费破解版迅雷夸克百度网盘资源免费地址安装教程" target="_blank">Visio软件下载安装包免费破解版迅雷夸克百度网盘资源免费地址安装教程</a> <span class="text-muted">心墙</span> <div>Visio软件下载安装包免费破解版迅雷夸克百度网盘资源免费地址安装教程链接:https://pan.baidu.com/s/15Y_eSDqdMR42T1TNIuQyQg?pwd=1234提取码:1234(手机用户长按复制打开)复制这段内容后打开百度网盘手机App,操作更方便哦关于office与Visio共存问题的安装提示:同一电脑下,若要office和visio共存(一起安装到电脑上),需使用相</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>