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/1901337509695123456.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/%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> <div>Python面向对象编程原则1.基本概面向对象编程(Object-OrientedProgramming,OOP)是一种编程范式,它使用"对象"来表示现实世界中的事物和它们之间的关系。在Python中,面向对象编程遵循以下原则:封装(Encapsulation):封装是将数据(属性)和操作数据的方法(函数)包装在一个类(Class)中的过程。这隐藏了对象内部的实现细节,只暴露出有限的接口供外部访问</div> </li> <li><a href="/article/1901336609664593920.htm" title="对接马来西亚和印度股票数据API:从实时行情到历史数据的完整指南" target="_blank">对接马来西亚和印度股票数据API:从实时行情到历史数据的完整指南</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E9%87%91%E8%9E%8D%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">金融数据库</a> <div>摘要:本文将详细介绍如何通过StockTVAPI对接马来西亚和印度股票市场的实时行情数据,涵盖从API申请、接口调用到数据解析的完整流程,并提供Python代码示例。一、为什么选择StockTVAPI?StockTVAPI提供全球多个国家的金融市场数据,其中马来西亚和印度市场数据尤为全面。以下是选择StockTVAPI的几大理由:覆盖全面:支持马来西亚Bursa和印度NSE、BSE交易所实时性强:</div> </li> <li><a href="/article/1901335220183953408.htm" title="数据库查询优化:提升性能的关键实践" target="_blank">数据库查询优化:提升性能的关键实践</a> <span class="text-muted"></span> <div>title:数据库查询优化:提升性能的关键实践date:2025/1/30updated:2025/1/30author:cmdragonexcerpt:在当今数据驱动的商业环境中,数据库的性能直接影响着应用程序的响应速度和用户体验。查询优化是性能调优的重要组成部分,通过对SQL查询的分析与改进,减少查询执行时间和资源消耗,从而提升整体系统效率。categories:前端开发tags:查询优化数据</div> </li> <li><a href="/article/1901334105388281856.htm" title="Linux 命令学习记录" target="_blank">Linux 命令学习记录</a> <span class="text-muted">hxung</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E5%AD%A6%E4%B9%A0%E4%BD%BF%E7%94%A8/1.htm">面试学习使用</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>Linux命令详解与进阶指南Linux是一种广泛使用的开源操作系统,掌握Linux命令是开发者和系统管理员的必备技能。本文将详细介绍Linux的常用命令,并涵盖一些高级进阶技巧,帮助你更高效地使用Linux。目录基础命令文件与目录操作文本处理系统信息权限管理进阶命令进程管理网络操作磁盘管理Shell脚本高级技巧管道与重定向正则表达式任务调度性能监控案例实战日志分析自动化部署服务器监控基础命令文件与</div> </li> <li><a href="/article/1901333851653861376.htm" title="C++耦合:代码设计的“黏合剂”与模块化架构的解耦艺术" target="_blank">C++耦合:代码设计的“黏合剂”与模块化架构的解耦艺术</a> <span class="text-muted">福鸦</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/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>C++耦合:代码设计的“黏合剂”与模块化架构的解耦艺术开篇故事:乐高城堡的“模块化危机”想象你正在用乐高积木搭建一座宏伟的城堡:高耦合设计:所有积木用强力胶水粘死,一旦想更换一扇窗户,必须拆毁整面墙。低耦合设计:积木通过标准接口拼接,可随时替换任意部件,甚至将城堡改装成太空站。软件工程中的**耦合(Coupling)**正如同这些积木的连接方式——它决定了代码模块之间的依赖程度。本文将深入探讨耦合</div> </li> <li><a href="/article/1901332592678989824.htm" title="Python——正则表达式与re模块" target="_blank">Python——正则表达式与re模块</a> <span class="text-muted">fw9521</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>目录1.正则表达式2.re模块函数-findall3.re模块函数-search4.re函数模块-sub总结1.正则表达式正则:为了匹配一个符合规则的字符串1.精确匹配:abc:匹配abc的子串2.选择性匹配:red|blue|green:匹配red或blue或green3.中括号[]:一个[]只匹配1位,[^]:排除[0-9]:匹配0-9之间的一个数字[^0-9]:排除0-9[a-z]:小写字母</div> </li> <li><a href="/article/1901331710289702912.htm" title="Python依赖管理工具分析" target="_blank">Python依赖管理工具分析</a> <span class="text-muted">xdpcxq1029</span> <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发展早期对于依赖管理的重视程度不足,缺乏从一开始就进行统一规划和设计的意识社区的分散性:Python社区庞大且分散,众多开发者和团队各自为政,根据自己的需求和偏好开发工具,缺乏统一的协调和整合机制多样化的使用场景:Python应用场景广泛,从Web开发到数据科学、机器学习、系统管理脚本等。不同场景对依赖管理有着不</div> </li> <li><a href="/article/1901331565527494656.htm" title="92.HarmonyOS NEXT开发学习路径与最佳实践总结:构建高质量应用" target="_blank">92.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基础知识阶段阶段重点内容相关教程学习目标入门基础开发环境、基本语法01-03搭建环境,理解基础概念组件开发UI组件、生命周期04-06掌握组件开发和状态管理数据处理状态管理</div> </li> <li><a href="/article/1901331438414917632.htm" title="89.HarmonyOS NEXT 应用安全与隐私保护指南:构建安全可靠的应用" target="_blank">89.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安全威胁分析威胁类型风险级别防护措施实现方式数据泄露高加密存储数据加密网络攻击高HTTPS/SSL安全传输代码注入中输入验证参数检查未授权访问高权限控制访问控制1.2安全配</div> </li> <li><a href="/article/1901331059425996800.htm" title="Windows 下 MySQL 命令行操作全指南:端口修改、服务管理与实用技巧" target="_blank">Windows 下 MySQL 命令行操作全指南:端口修改、服务管理与实用技巧</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/mysql%E5%90%8E%E7%AB%AF%E5%91%BD%E4%BB%A4%E8%A1%8C/1.htm">mysql后端命令行</a> <div>引言MySQL作为最流行的关系型数据库之一,在Windows环境下的配置与管理是开发者必备技能。本文将以命令行操作为核心,详解如何通过命令修改MySQL端口号、启停服务、自定义服务名等实用操作,并结合常见问题解决方案,帮助用户快速掌握MySQL在Windows中的高效管理方法。一、MySQL服务启停1.通过命令行启停启动MySQL服务:netstartmysql8#根据实际服务名调整(如mysql</div> </li> <li><a href="/article/1901329821254873088.htm" title="uv:颠覆你的Python项目管理,速度提升10-100倍" target="_blank">uv:颠覆你的Python项目管理,速度提升10-100倍</a> <span class="text-muted">强化学习曾小健2</span> <a class="tag" taget="_blank" href="/search/uv/1.htm">uv</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>uv:颠覆你的Python项目管理,速度提升10-100倍原创工业开源好项目工业开源好项目2025年01月05日00:01湖南Python生态系统繁荣的同时,也带来了一些挑战:繁多的包管理工具、缓慢的依赖安装速度、以及复杂的虚拟环境管理。面对这些问题,uv应运而生。它是一个用Rust编写的高性能Python包和项目管理器,旨在以更快的速度、更简洁的方式,解决Python开发中的诸多痛点。本文将详细</div> </li> <li><a href="/article/1901329065646813184.htm" title="【深度C++】之“运行时类型识别RTTI”" target="_blank">【深度C++】之“运行时类型识别RTTI”</a> <span class="text-muted">Jinxk8</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1C%2B%2B/1.htm">面向对象C++</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/1.htm">编程语言</a> <div>0.什么是RTTI运行时类型识别(run-timetypeidentification,RTTI)功能可以获得某类型在运行时的具体动态类型,进而使用该类型的功能。动态类型指的是程序在运行时才可知的类型,与静态类型相对应。静态类型指的是编译时已知的类型。出现静态类型和动态类型定义的原因主要是面向对象的多态。当我们使用父类的指针或引用指向或引用子类对象时,表面上看使用的都是父类的函数,实际上在程序运行</div> </li> <li><a href="/article/1901327554384556032.htm" title="Python正则表达式(re模块)" target="_blank">Python正则表达式(re模块)</a> <span class="text-muted">qq742234984</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>Python正则表达式(re模块)概述正则表达式Python正则表达式re模块re.match方法常用的匹配规则-匹配字符常用的匹配规则-匹配字符数量常用的匹配规则-原生字符串常用的匹配规则-匹配开头结尾常用的匹配规则-分组匹配re.compile方法re.search方法re.findall方法re.sub方法re.split方法贪婪模式与非贪婪模式概述案例概述正则表达式英文名为RegularE</div> </li> <li><a href="/article/1901327553927376896.htm" title="pip install和conda install的区别" target="_blank">pip install和conda install的区别</a> <span class="text-muted">莫聽穿林打叶聲</span> <a class="tag" taget="_blank" href="/search/pip/1.htm">pip</a><a class="tag" taget="_blank" href="/search/conda/1.htm">conda</a> <div>这里写目录标题一、什么是Python依赖(PythonDependencies)?1.依赖的作用2.如何管理Python依赖3.依赖管理问题4.依赖锁定总结二、使用pip安装包+venv隔离环境方法1:使用venv(推荐)创建虚拟环境激活环境安装包冻结(导出)环境退出环境删除环境方法2:使用virtualenv(适用于Python2)安装virtualenv创建环境方法3:使用pipenv(自动管</div> </li> <li><a href="/article/1901324277047685120.htm" title="json 数据格式的转换" target="_blank">json 数据格式的转换</a> <span class="text-muted">amd2015</span> <a class="tag" taget="_blank" href="/search/json/1.htm">json</a> <div>json与对象的互相转换以下为整理内容1前台//将JSON转为字符串varaToStr=JSON.stringify(a);//将字符串转为JSON格式varbToObj=JSON.parse(b);//将字符串转为JSON格式vardataObj=eval("("+data+")");//得到json$.get(url,[data],[callback],"json")2后台第一种:json-l</div> </li> <li><a href="/article/1901322007623036928.htm" title="ES6回顾:闭包->(优点:实现工厂函数、记忆化和异步实现)、(应用场景:Promise的then与catch的回调、async/await、柯里化函数)" target="_blank">ES6回顾:闭包->(优点:实现工厂函数、记忆化和异步实现)、(应用场景:Promise的then与catch的回调、async/await、柯里化函数)</a> <span class="text-muted">2501_91133322</span> <a class="tag" taget="_blank" href="/search/es6/1.htm">es6</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>写在前面:兄弟们,我手里有个长期项目,考虑接私活的可以看看我GitHub!https://github.com/ccy-233/coder2retire1.闭包(Closure)定义:由函数及其引用的外部词法环境变量组成,即使外部函数执行完毕,内部函数仍能访问这些变量。作用:延长外部函数变量的生命周期,使外部可操作内部数据(如模块化封装)。避免全局变量污染,实现私有变量。缺点:不当使用会导致内存泄</div> </li> <li><a href="/article/1901321125917421568.htm" title="Python—JSON格式标签转换为TXT格式标签详细教程2(附完整代码)" target="_blank">Python—JSON格式标签转换为TXT格式标签详细教程2(附完整代码)</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%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/1.htm">图像处理</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>这个代码主要是解析一个json文件转换成多个txt文件使用的,尤其是便于yolo训练decode_json函数中的convert函数确实是用于将坐标缩放到0-1之间的。但是,您在调用decode_json函数时设置了is_convert=False,这意味着坐标缩放功能被关闭了代码详解数字规范化的会将坐标缩放至(0—1)区间主要是修改这两个地方即可,话不多说,咱们直接附代码#下面是将`is_con</div> </li> <li><a href="/article/1901319236773539840.htm" title="3月16日中场五大联赛+德乙赛果预测与临场策略部分公推" target="_blank">3月16日中场五大联赛+德乙赛果预测与临场策略部分公推</a> <span class="text-muted">weixin_66725336</span> <a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>【007前进之鹰vs威廉二世】前进之鹰主场强势全取三分【阵容动态】前进之鹰21岁前锋米兰·斯梅茨连续两轮首发出战,上轮贡献关键进球扩大比分,本场将继续担任锋线主力。进攻核心安治文状态爆棚,近两轮打入3球成为队内头号得分手,需重点盯防。威廉二世虽迎回伤愈中卫汤米·雅各布改踢三中卫体系,但防守仍漏洞百出。预计左翼卫施古德松将回撤担任左后卫强化边路防守。【伤停名单】前进之鹰:坦斯迪治(中场)、斯图卡斯(</div> </li> <li><a href="/article/1901318856459218944.htm" title="【Agent】OpenManus 项目架构分析" target="_blank">【Agent】OpenManus 项目架构分析</a> <span class="text-muted">非晓为骁</span> <a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/openManus/1.htm">openManus</a><a class="tag" taget="_blank" href="/search/Manus/1.htm">Manus</a><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/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/agi/1.htm">agi</a> <div>这是我录制的一个视频,主要是描述我理解的OpenManus的思维逻辑,通过这个小的思维逻辑的复现,为后面要再分析其他Agent的实现做一个准备。1.项目概述OpenManus是一个基于大语言模型的智能体框架,旨在提供一个无需邀请码的创意实现平台。项目由MetaGPT社区的贡献者开发,采用Python语言实现。2.系统架构2.1核心组件2.1.1入口层main.py:主程序入口,提供命令行交互界面r</div> </li> <li><a href="/article/1901317090866950144.htm" title="《我的Python觉醒之路》之转型Python(十四)——控制流" target="_blank">《我的Python觉醒之路》之转型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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>以下是2025年3月份学习的核心内容,接下来我再练习一段例子,为后续做准备了!!**`第一章节的核心内容就是下面的了`**1.启动IDLE,打开的带有>>>提示符的界面便是Python的交互式解释器2.表达式(Expression)是Python中能产生一个值的代码片段,由**操作数**(如变量、常量)和运算符(如加减乘除、逻辑判断符)组合而成.3.表达式包含“值”(例如2)和“操作符”(例如+)</div> </li> <li><a href="/article/1901316964786171904.htm" title="RocketMQ 集群架构与部署实践(二)" target="_blank">RocketMQ 集群架构与部署实践(二)</a> <span class="text-muted">计算机毕设定制辅导-无忧学长</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/RocketMQ/1.htm">RocketMQ</a><a class="tag" taget="_blank" href="/search/rocketmq/1.htm">rocketmq</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>RocketMQ部署实践前期准备要充分在进行RocketMQ的部署之前,我们需要做好一系列的准备工作,确保部署过程的顺利进行。环境要求:操作系统:推荐使用64位的Linux或Unix系统,如CentOS7+、Ubuntu16.04+等,这些系统在稳定性和性能方面表现出色,能够为RocketMQ的运行提供良好的基础。JDK:需要安装64位的JDK1.8及以上版本,RocketMQ是基于Java开发的</div> </li> <li><a href="/article/1901314697198628864.htm" title="在卫星通信网络中的TCP/IP 协议适应性研究" target="_blank">在卫星通信网络中的TCP/IP 协议适应性研究</a> <span class="text-muted">欣傅</span> <a class="tag" taget="_blank" href="/search/php/1.htm">php</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/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>目录引言卫星通信网络的特点高延迟特性高误码率带宽受限与动态变化TCP/IP协议在卫星通信网络中面临的挑战拥塞控制机制失效重传机制效率低下协议开销过大TCP/IP协议在卫星通信网络中的适应性改进优化拥塞控制机制改进重传机制降低协议开销结论引言卫星通信网络凭借其覆盖范围广、不受地理条件限制等优势,在全球通信领域发挥着愈发重要的作用。从偏远地区的通信保障到海上船只的网络连接,卫星通信填补了地面通信网络的</div> </li> <li><a href="/article/1901314067021230080.htm" title="附下载 | 2024 OWASP Top 10 基础设施安全风险.pdf" target="_blank">附下载 | 2024 OWASP Top 10 基础设施安全风险.pdf</a> <span class="text-muted">安全方案</span> <a class="tag" taget="_blank" href="/search/OWASP/1.htm">OWASP</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E5%AE%89%E5%85%A8/1.htm">基础设施安全</a> <div>《2024OWASPTop10基础设施安全风险》报告,由OWASP(开放网络应用安全项目)发布,旨在提升企业和组织对基础设施安全风险、威胁与漏洞的意识,并提供高质量的信息和最佳实践建议。报告列出了2024年最重要的10大基础设施安全风险,并通过案例分析展示了这些风险的实际影响。一、报告背景与目的背景:2024企业信息安全峰会以“直面信息安全挑战,创造最佳实践”为主题,聚焦信息安全技术与实践,致力于</div> </li> <li><a href="/article/1901313058182066176.htm" title="Python实现大麦网抢票的四大关键技术点解析" target="_blank">Python实现大麦网抢票的四大关键技术点解析</a> <span class="text-muted">小白学大数据</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BF%E7%89%9B%E4%BA%91%E4%BB%A3%E7%90%86/1.htm">亿牛云代理</a><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><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/1.htm">数据挖掘</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/1.htm">程序人生</a> <div>前言随着互联网的普及和发展,线上购票已经成为人们生活中不可或缺的一部分。然而,在抢购热门演出门票时,往往会遇到抢票难、抢票快的问题,有时候一秒钟的延迟就意味着与心仪的演出擦肩而过。为了解决这个问题,技术爱好者们开始探索利用Python多线程技术来提高抢票效率。本文将介绍Python实现大麦网抢票的四大关键技术点,帮助读者了解抢票脚本的核心原理,并通过示例代码详细说明实现过程。1.网页解析技术大麦网</div> </li> <li><a href="/article/1901312679776153600.htm" title="Python开发合并多个PDF文件" target="_blank">Python开发合并多个PDF文件</a> <span class="text-muted">互联网搬砖老肖</span> <a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E5%8E%9F%E5%8A%9B%E8%AE%A1%E5%88%92/1.htm">原力计划</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>前言在我们的工作中,可能有以下场景需要用到合并多个PDF:文档归档:在企业或组织中,常常需要将相关的文档(如合同、报告、发票等)合并为一个PDF文件,以便于归档和管理。报告生成:在学术研究或项目管理中,研究人员或项目经理可能需要将多个研究报告、数据分析或项目进展文档合并为一个完整的报告,以便于分享和展示。电子书制作:作者或出版商在制作电子书时,可能需要将多个章节或部分合并为一个PDF文件,以便于读</div> </li> <li><a href="/article/1901311794832535552.htm" title="Python个人学习笔记(2):编程入门知识与基础语法介绍" target="_blank">Python个人学习笔记(2):编程入门知识与基础语法介绍</a> <span class="text-muted">NEET_LH</span> <a class="tag" taget="_blank" href="/search/%E6%A8%B5%E5%A4%AB%E8%80%81%E5%B8%88Python%E9%9B%B6%E5%9F%BA%E7%A1%80%E8%AF%BE%E7%A8%8B/1.htm">樵夫老师Python零基础课程</a><a class="tag" taget="_blank" href="/search/%E4%B8%AA%E4%BA%BA%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">个人学习笔记</a><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/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>一、注释(一)作用1.对代码进行解释和说明避免自己忘了写的代码是做什么的——写给人看的,机器不运行不要去注释你代码做了什么,而要去注释我的代码为什么要这么做。用于记录思路、实现方法、代码功能注释很重要,大厂很重视,尤其日企2.调试代码报错的一篇代码,从下到上一句一句加#,依次运行,如果某行代码加了#后,程序运行成功,那么就是这行有问题,但这个方法不好。(二)注释方法1.单行注释==句子前加#快捷键</div> </li> <li><a href="/article/1901311795700756480.htm" title="C# 项目常用库" target="_blank">C# 项目常用库</a> <span class="text-muted">OSwich</span> <a class="tag" taget="_blank" href="/search/wpf/1.htm">wpf</a> <div>1.MVVM框架(CommunityToolkit.Mvvm)平台和运行时库相独立-.NET2.0标准和.NET5(与UI框架无关)简单易用-在程序结构和编码范式上没有严格要求,即使用灵活自由组件-自由选择要使用的组件参考实现-精炼且性能好,提供了基础库的接口实现,但缺乏直接使用它们的具体类型这个包针对是.NET标准的,所以它能应用于任何平台:UWP,WinForms,WPF,Xamarin,Un</div> </li> <li><a href="/article/1901311288282247168.htm" title="如何撰写一份清晰专业的软件功能测试报告?看这篇就够了!" target="_blank">如何撰写一份清晰专业的软件功能测试报告?看这篇就够了!</a> <span class="text-muted">软件测试君</span> <a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/1.htm">自动化测试</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/1.htm">软件测试</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E7%BB%8F%E9%AA%8C/1.htm">职场经验</a><a class="tag" taget="_blank" href="/search/%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/1.htm">功能测试</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/1.htm">软件测试</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/1.htm">自动化测试</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E7%BB%8F%E9%AA%8C/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/%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A/1.htm">功能测试报告</a> <div>面试求职:「面试试题小程序」,内容涵盖测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)职场经验干货:软件测试工程师简历上如何编写个人信息(一周8个面试)软件测试工程师简历上如何编写专业技能(一周8个面试)软件测</div> </li> <li><a href="/article/1901310657672835072.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/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/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><a class="tag" taget="_blank" href="/search/beautifulsoup/1.htm">beautifulsoup</a> <div>一、引言在现代交通系统中,交通数据是进行智能交通管理、交通流量预测和交通规划的重要依据。高德地图(Amap)作为国内最权威的地理和交通信息平台之一,提供了丰富的开放API,允许开发者访问包括实时交通路况、路线规划、地理编码等各种数据。本教程将使用Python构建一个完整的爬虫程序,调用高德地图API,解析和存储交通数据,并通过数据分析和可视化深入挖掘交通流量特征。二、高德地图API简介2.1高德地</div> </li> <li><a href="/article/1901308135600091136.htm" title="最短路算法" target="_blank">最短路算法</a> <span class="text-muted">Emplace</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E8%AE%BA/1.htm">图论</a><a class="tag" taget="_blank" href="/search/%E6%9C%80%E7%9F%AD%E8%B7%AF/1.htm">最短路</a> <div>算法介绍最短路是一种在一个有权图中求任意两点间的最短路径。算法描述最短路有很多的形式:单源最短路:就是固定起点的最短路。多源最短路:就是不固定起点的最短路。其中Floyd就是求多源最短路的。Floyd算法流程首先我们可以先枚举中间节点kkk,然后再枚举经过这个中间节点的起点和终点。最后对于每对起点和终点我们假设它们为(i,j),那么从i到j的距离就应该是a(i,k)+a(k,j)与a(i,j)的最</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>