分布式爬虫:使用Scrapy抓取数据

Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

  • 官方主页: http://www.scrapy.org/
  • 中文文档:Scrapy 0.22 文档
  • GitHub项目主页:https://github.com/scrapy/scrapy

Scrapy 使用了 Twisted 异步网络库来处理网络通讯。整体架构大致如下(注:图片来自互联网):

分布式爬虫:使用Scrapy抓取数据_第1张图片

Scrapy主要包括了以下组件:

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

使用Scrapy可以很方便的完成网上数据的采集工作,它为我们完成了大量的工作,而不需要自己费大力气去开发。

1. 安装

安装 python

Scrapy 目前最新版本为0.22.2,该版本需要 python 2.7,故需要先安装 python 2.7。这里我使用 centos 服务器来做测试,因为系统自带了 python ,需要先检查 python 版本。

查看python版本:

$ python -V
Python 2.6.6

升级版本到2.7:

$ Python 2.7.6:
$ wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz
$ tar xf Python-2.7.6.tar.xz
$ cd Python-2.7.6
$ ./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
$ make && make altinstall

建立软连接,使系统默认的 python指向 python2.7

$ mv /usr/bin/python /usr/bin/python2.6.6 
$ ln -s /usr/local/bin/python2.7 /usr/bin/python 

再次查看python版本:

$ python -V
Python 2.7.6

安装

这里使用 wget 的方式来安装 setuptools :

$ wget https://bootstrap.pypa.io/ez_setup.py -O - | python

安装 zope.interface

$ easy_install zope.interface

安装 twisted

Scrapy 使用了 Twisted 异步网络库来处理网络通讯,故需要安装 twisted。

安装 twisted 前,需要先安装 gcc:

$ yum install gcc -y

然后,再通过 easy_install 安装 twisted:

$ easy_install twisted

如果出现下面错误:

$ easy_install twisted
Searching for twisted
Reading https://pypi.python.org/simple/twisted/
Best match: Twisted 14.0.0
Downloading https://pypi.python.org/packages/source/T/Twisted/Twisted-14.0.0.tar.bz2#md5=9625c094e0a18da77faa4627b98c9815
Processing Twisted-14.0.0.tar.bz2
Writing /tmp/easy_install-kYHKjn/Twisted-14.0.0/setup.cfg
Running Twisted-14.0.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-kYHKjn/Twisted-14.0.0/egg-dist-tmp-vu1n6Y
twisted/runner/portmap.c:10:20: error: Python.h: No such file or directory
twisted/runner/portmap.c:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
twisted/runner/portmap.c:31: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
twisted/runner/portmap.c:45: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘PortmapMethods’
twisted/runner/portmap.c: In function ‘initportmap’:
twisted/runner/portmap.c:55: warning: implicit declaration of function ‘Py_InitModule’
twisted/runner/portmap.c:55: error: ‘PortmapMethods’ undeclared (first use in this function)
twisted/runner/portmap.c:55: error: (Each undeclared identifier is reported only once
twisted/runner/portmap.c:55: error: for each function it appears in.)

请安装 python-devel 然后再次运行:

$ yum install python-devel -y
$ easy_install twisted

如果出现下面异常:

error: Not a recognized archive type: /tmp/easy_install-tVwC5O/Twisted-14.0.0.tar.bz2

请手动下载然后安装,下载地址在这里

$ wget https://pypi.python.org/packages/source/T/Twisted/Twisted-14.0.0.tar.bz2#md5=9625c094e0a18da77faa4627b98c9815
$ tar -vxjf Twisted-14.0.0.tar.bz2
$ cd Twisted-14.0.0
$ python setup.py install

安装 pyOpenSSL

先安装一些依赖:

$ yum install libffi libffi-devel openssl-devel -y

然后,再通过 easy_install 安装 pyOpenSSL:

$ easy_install pyOpenSSL

安装 Scrapy

先安装一些依赖:

$ yum install libxml2 libxslt libxslt-devel -y

最后再来安装 Scrapy :

$ easy_install scrapy

2. 使用 Scrapy

在安装成功之后,你可以了解一些 Scrapy 的基本概念和使用方法,并学习 Scrapy 项目的例子 dirbot 。

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

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

新建工程

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

$ scrapy startproject tutorial

这个命令会在当前目录下创建一个新目录 tutorial,它的结构如下:

.
├── scrapy.cfg
└── tutorial
    ├── __init__.py
    ├── items.py
    ├── pipelines.py
    ├── settings.py
    └── spiders
        └── __init__.py

这些文件主要是:

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

定义Item

Items是将要装载抓取的数据的容器,它工作方式像 python 里面的字典,但它提供更多的保护,比如对未定义的字段填充以防止拼写错误。

它通过创建一个 scrapy.item.Item 类来声明,定义它的属性为 scrpy.item.Field 对象,就像是一个对象关系映射(ORM).
我们通过将需要的item模型化,来控制从 dmoz.org 获得的站点数据,比如我们要获得站点的名字,url 和网站描述,我们定义这三种属性的域。要做到这点,我们编辑在 tutorial 目录下的 items.py 文件,我们的 Item 类将会是这样

from scrapy.item import Item, Field 
class DmozItem(Item):
    title = Field()
    link = Field()
    desc = Field()

刚开始看起来可能会有些困惑,但是定义这些 item 能让你用其他 Scrapy 组件的时候知道你的 items 到底是什么。

编写爬虫(Spider)

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

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

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

这个方法负责解析返回的数据、匹配抓取的数据(解析为 item )并跟踪更多的 URL。

在 tutorial/spiders 目录下创建 DmozSpider.py

from scrapy.spider import BaseSpider

class DmozSpider(BaseSpider):
    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)

运行项目

$ scrapy crawl dmoz

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

xpath选择器

Scrapy 使用一种叫做 XPath selectors 的机制,它基于 XPath 表达式。如果你想了解更多selectors和其他机制你可以查阅资料。

这是一些XPath表达式的例子和他们的含义:

  • /html/head/title: 选择HTML文档  元素下面的 </code> 标签。</li> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">/html/head/title/text()</code>: 选择前面提到的<code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);"><title></code> 元素下面的文本内容</li> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">//td</code>: 选择所有 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);"><td></code> 元素</li> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">//div[@class="mine"]</code>: 选择所有包含 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">class="mine"</code> 属性的div 标签元素</li> </ul> <p>这只是几个使用 XPath 的简单例子,但是实际上 XPath 非常强大。如果你想了解更多 XPATH 的内容,我们向你推荐这个XPath 教程</p> <p>为了方便使用 XPaths,Scrapy 提供 Selector 类, 有三种方法</p> <ul> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">xpath()</code>:返回selectors列表, 每一个select表示一个xpath参数表达式选择的节点.</li> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">extract()</code>:返回一个unicode字符串,该字符串为XPath选择器返回的数据</li> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">re()</code>: 返回unicode字符串列表,字符串作为参数由正则表达式提取出来</li> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">css()</code></li> </ul> <h2 id="articleHeader13" style="font-family:inherit;line-height:1.2;color:inherit;font-size:1.42857em;border-bottom-width:1px;border-bottom-style:dotted;border-bottom-color:rgb(204,204,204);"> 提取数据</h2> <p>我们可以通过如下命令选择每个在网站中的 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);"><li></code> 元素:</p> <pre class="hljs bash" style="overflow:auto;font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;line-height:1.3;color:#000000;border:none;background:rgb(246,246,246);"><code class="lang-python" style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:1em;color:inherit;">sel.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'//ul/li'</span>) </code></pre> <p>然后是网站描述:</p> <pre class="hljs bash" style="overflow:auto;font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;line-height:1.3;color:#000000;border:none;background:rgb(246,246,246);"><code class="lang-python" style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:1em;color:inherit;">sel.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'//ul/li/text()'</span>).extract() </code></pre> <p>网站标题:</p> <pre class="hljs bash" style="overflow:auto;font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;line-height:1.3;color:#000000;border:none;background:rgb(246,246,246);"><code class="lang-python" style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:1em;color:inherit;">sel.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'//ul/li/a/text()'</span>).extract() </code></pre> <p>网站链接:</p> <pre class="hljs bash" style="overflow:auto;font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;line-height:1.3;color:#000000;border:none;background:rgb(246,246,246);"><code class="lang-python" style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:1em;color:inherit;">sel.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'//ul/li/a/@href'</span>).extract() </code></pre> <p>如前所述,每个 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">xpath()</code> 调用返回一个 selectors 列表,所以我们可以结合 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">xpath()</code> 去挖掘更深的节点。我们将会用到这些特性,所以:</p> <pre class="hljs perl" style="overflow:auto;font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;line-height:1.3;color:#000000;border:none;background:rgb(246,246,246);"><code class="lang-python" style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:1em;color:inherit;">sites = sel.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'//ul/li'</span>) <span class="hljs-keyword" style="font-weight:bold;">for</span> site in sites: title = site.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'a/text()'</span>).extract() <span class="hljs-keyword" style="font-weight:bold;">link</span> = site.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'a/@href'</span>).extract() desc = site.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'text()'</span>).extract() <span class="hljs-keyword" style="font-weight:bold;">print</span> title, <span class="hljs-keyword" style="font-weight:bold;">link</span>, desc </code></pre> <h2 id="articleHeader14" style="font-family:inherit;line-height:1.2;color:inherit;font-size:1.42857em;border-bottom-width:1px;border-bottom-style:dotted;border-bottom-color:rgb(204,204,204);"> 使用Item</h2> <p><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">scrapy.item.Item</code> 的调用接口类似于 python 的 dict ,Item 包含多个 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">scrapy.item.Field</code>。这跟 django 的 Model 与</p> <p>Item 通常是在 Spider 的 parse 方法里使用,它用来保存解析到的数据。</p> <p>最后修改爬虫类,使用 Item 来保存数据,代码如下:</p> <pre><code class="language-python"><code class="lang-python" style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:1em;color:inherit;"><span class="hljs-keyword" style="font-weight:bold;">from</span> scrapy.spider <span class="hljs-keyword" style="font-weight:bold;">import</span> Spider <span class="hljs-keyword" style="font-weight:bold;">from</span> scrapy.selector <span class="hljs-keyword" style="font-weight:bold;">import</span> Selector <span class="hljs-keyword" style="font-weight:bold;">from</span> dirbot.items <span class="hljs-keyword" style="font-weight:bold;">import</span> Website <span class="hljs-class"><span class="hljs-keyword" style="font-weight:bold;">class</span> <span class="hljs-title" style="color:rgb(136,0,0);font-weight:bold;">DmozSpider</span><span class="hljs-params">(Spider)</span>:</span> name = <span class="hljs-string" style="color:rgb(136,0,0);">"dmoz"</span> allowed_domains = [<span class="hljs-string" style="color:rgb(136,0,0);">"dmoz.org"</span>] start_urls = [ <span class="hljs-string" style="color:rgb(136,0,0);">"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"</span>, <span class="hljs-string" style="color:rgb(136,0,0);">"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"</span>, ] <span class="hljs-function"><span class="hljs-keyword" style="font-weight:bold;">def</span> <span class="hljs-title" style="color:rgb(136,0,0);font-weight:bold;">parse</span><span class="hljs-params">(self, response)</span>:</span> <span class="hljs-string" style="color:rgb(136,0,0);">""" The lines below is a spider contract. For more info see: http://doc.scrapy.org/en/latest/topics/contracts.html @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/ @scrapes name """</span> sel = Selector(response) sites = sel.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'//ul[@class="directory-url"]/li'</span>) items = [] <span class="hljs-keyword" style="font-weight:bold;">for</span> site <span class="hljs-keyword" style="font-weight:bold;">in</span> sites: item = Website() item[<span class="hljs-string" style="color:rgb(136,0,0);">'name'</span>] = site.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'a/text()'</span>).extract() item[<span class="hljs-string" style="color:rgb(136,0,0);">'url'</span>] = site.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'a/@href'</span>).extract() item[<span class="hljs-string" style="color:rgb(136,0,0);">'description'</span>] = site.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'text()'</span>).re(<span class="hljs-string" style="color:rgb(136,0,0);">'-\s([^\n]*?)\\n'</span>) items.append(item) <span class="hljs-keyword" style="font-weight:bold;">return</span> items </code></code></pre> <p>现在,可以再次运行该项目查看运行结果:</p> <pre><code class="language-ruby"><code class="lang-bash" style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:1em;color:inherit;"><span class="hljs-variable">$ </span>scrapy crawl dmoz </code></code></pre> <h2 id="articleHeader15" style="font-family:inherit;line-height:1.2;color:inherit;font-size:1.42857em;border-bottom-width:1px;border-bottom-style:dotted;border-bottom-color:rgb(204,204,204);"> 使用Item Pipeline</h2> <p>在 settings.py 中设置 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">ITEM_PIPELINES</code>,其默认为<code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">[]</code>,与 django 的 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">MIDDLEWARE_CLASSES</code> 等相似。<br> 从 Spider 的 parse 返回的 Item 数据将依次被 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">ITEM_PIPELINES</code> 列表中的 Pipeline 类处理。</p> <p>一个 Item Pipeline 类必须实现以下方法:</p> <ul> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">process_item(item, spider)</code> 为每个 item pipeline 组件调用,并且需要返回一个 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">scrapy.item.Item</code> 实例对象或者抛出一个 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">scrapy.exceptions.DropItem</code> 异常。当抛出异常后该 item 将不会被之后的 pipeline 处理。参数:<br> <ul> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">item (Item object)</code> – 由 parse 方法返回的 Item 对象</li> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">spider (BaseSpider object)</code> – 抓取到这个 Item 对象对应的爬虫对象</li> </ul></li> </ul> <p>也可额外的实现以下两个方法:</p> <ul> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">open_spider(spider)</code> 当爬虫打开之后被调用。参数: <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">spider (BaseSpider object)</code> – 已经运行的爬虫</li> <li><code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">close_spider(spider)</code> 当爬虫关闭之后被调用。参数: <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">spider (BaseSpider object)</code> – 已经关闭的爬虫</li> </ul> <h2 id="articleHeader16" style="font-family:inherit;line-height:1.2;color:inherit;font-size:1.42857em;border-bottom-width:1px;border-bottom-style:dotted;border-bottom-color:rgb(204,204,204);"> 保存抓取的数据</h2> <p>保存信息的最简单的方法是通过 Feed exports,命令如下:</p> <pre><code class="language-ruby"><code class="lang-bash" style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:1em;color:inherit;"><span class="hljs-variable">$ </span>scrapy crawl dmoz -o items.json -t json </code></code></pre> <p>除了 json 格式之外,还支持 JSON lines、CSV、XML格式,你也可以通过接口扩展一些格式。</p> <p>对于小项目用这种方法也足够了。如果是比较复杂的数据的话可能就需要编写一个 Item Pipeline 进行处理了。</p> <p>所有抓取的 items 将以 JSON 格式被保存在新生成的 items.json 文件中</p> <h2 id="articleHeader17" style="font-family:inherit;line-height:1.2;color:inherit;font-size:1.42857em;border-bottom-width:1px;border-bottom-style:dotted;border-bottom-color:rgb(204,204,204);"> 总结</h2> <p>上面描述了如何创建一个爬虫项目的过程,你可以参照上面过程联系一遍。作为学习的例子,你还可以参考这篇文章:scrapy 中文教程(爬cnbeta实例) 。</p> <p>这篇文章中的爬虫类代码如下:</p> <pre><code class="language-python"><code class="lang-python" style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:1em;color:inherit;"><span class="hljs-keyword" style="font-weight:bold;">from</span> scrapy.contrib.spiders <span class="hljs-keyword" style="font-weight:bold;">import</span> CrawlSpider, Rule <span class="hljs-keyword" style="font-weight:bold;">from</span> scrapy.contrib.linkextractors.sgml <span class="hljs-keyword" style="font-weight:bold;">import</span> SgmlLinkExtractor <span class="hljs-keyword" style="font-weight:bold;">from</span> scrapy.selector <span class="hljs-keyword" style="font-weight:bold;">import</span> Selector <span class="hljs-keyword" style="font-weight:bold;">from</span> cnbeta.items <span class="hljs-keyword" style="font-weight:bold;">import</span> CnbetaItem <span class="hljs-class"><span class="hljs-keyword" style="font-weight:bold;">class</span> <span class="hljs-title" style="color:rgb(136,0,0);font-weight:bold;">CBSpider</span><span class="hljs-params">(CrawlSpider)</span>:</span> name = <span class="hljs-string" style="color:rgb(136,0,0);">'cnbeta'</span> allowed_domains = [<span class="hljs-string" style="color:rgb(136,0,0);">'cnbeta.com'</span>] start_urls = [<span class="hljs-string" style="color:rgb(136,0,0);">'http://www.cnbeta.com'</span>] rules = ( Rule(SgmlLinkExtractor(allow=(<span class="hljs-string" style="color:rgb(136,0,0);">'/articles/.*\.htm'</span>, )), callback=<span class="hljs-string" style="color:rgb(136,0,0);">'parse_page'</span>, follow=<span class="hljs-keyword" style="font-weight:bold;">True</span>), ) <span class="hljs-function"><span class="hljs-keyword" style="font-weight:bold;">def</span> <span class="hljs-title" style="color:rgb(136,0,0);font-weight:bold;">parse_page</span><span class="hljs-params">(self, response)</span>:</span> item = CnbetaItem() sel = Selector(response) item[<span class="hljs-string" style="color:rgb(136,0,0);">'title'</span>] = sel.xpath(<span class="hljs-string" style="color:rgb(136,0,0);">'//title/text()'</span>).extract() item[<span class="hljs-string" style="color:rgb(136,0,0);">'url'</span>] = response.url <span class="hljs-keyword" style="font-weight:bold;">return</span> item </code></code></pre> <p>需要说明的是:</p> <ul> <li>该爬虫类继承的是 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">CrawlSpider</code> 类,并且定义规则,rules指定了含有 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">/articles/.*\.htm</code> 的链接都会被匹配。</li> <li>该类并没有实现parse方法,并且规则中定义了回调函数 <code style="font-family:Consolas, Menlo, Monaco, 'Courier New', monospace;font-size:.92857em;color:rgb(199,37,78);">parse_page</code>,你可以参考更多资料了解 CrawlSpider 的用法</li> </ul> <h1 id="articleHeader18" style="font-size:1.71429em;font-family:inherit;line-height:1.2;color:inherit;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:rgb(221,221,221);"> 3. 学习资料</h1> <p>接触 Scrapy,是因为想爬取一些知乎的数据,最开始的时候搜索了一些相关的资料和别人的实现方式。</p> <p>Github 上已经有人或多或少的实现了对知乎数据的爬取,我搜索到的有以下几个仓库:</p> <ul> <li>https://github.com/KeithYue/Zhihu_Spider 实现先通过用户名和密码登陆再爬取数据,代码见 zhihu_spider.py。</li> <li>https://github.com/immzz/zhihu-scrapy 使用 selenium 下载和执行 javascript 代码。</li> <li>https://github.com/tangerinewhite32/zhihu-stat-py</li> <li>https://github.com/Zcc/zhihu 主要是爬指定话题的topanswers,还有用户个人资料,添加了登录代码。</li> <li>https://github.com/pelick/VerticleSearchEngine 基于爬取的学术资源,提供搜索、推荐、可视化、分享四块。使用了 Scrapy、MongoDB、Apache Lucene/Solr、Apache Tika等技术。</li> <li>https://github.com/geekan/scrapy-examples scrapy的一些例子,包括获取豆瓣数据、linkedin、腾讯招聘数据等例子。</li> <li>https://github.com/owengbs/deeplearning 实现分页获取话题。</li> <li>https://github.com/gnemoug/distribute_crawler 使用scrapy、redis、mongodb、graphite实现的一个分布式网络爬虫,底层存储mongodb集群,分布式使用redis实现,爬虫状态显示使用graphite实现</li> <li>https://github.com/weizetao/spider-roach 一个分布式定向抓取集群的简单实现。</li> </ul> <p>其他资料:</p> <ul> <li>http://www.52ml.net/tags/Scrapy 收集了很多关于 Scrapy 的文章,<span>推荐阅读</span></li> <li>用Python Requests抓取知乎用户信息</li> <li>使用scrapy框架爬取自己的博文</li> <li>Scrapy 深入一点点</li> <li>使用python,scrapy写(定制)爬虫的经验,资料,杂。</li> <li>Scrapy 轻松定制网络爬虫</li> <li>在scrapy中怎么让Spider自动去抓取豆瓣小组页面</li> </ul> <p>scrapy 和 javascript 交互例子:</p> <ul> <li>用scrapy框架爬取js交互式表格数据</li> <li>scrapy + selenium 解析javascript 实例</li> </ul> <p>还有一些待整理的知识点:</p> <ul> <li><span>如何先登陆再爬数据</span></li> <li><span>如何使用规则做过滤</span></li> <li><span>如何递归爬取数据</span></li> <li><span>scrapy的参数设置和优化</span></li> <li><span>如何实现分布式爬取</span></li> </ul> <h1 id="articleHeader19" style="font-size:1.71429em;font-family:inherit;line-height:1.2;color:inherit;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:rgb(221,221,221);"> 4. 总结</h1> <p>以上就是最近几天学习 Scrapy 的一个笔记和知识整理,参考了一些网上的文章才写成此文,对此表示感谢,也希望这篇文章能够对你有所帮助。如果你有什么想法,欢迎留言;如果喜欢此文,请帮忙分享,谢谢!</p> <p><span style="line-height:22.3999996185303px;">原文发表于:</span>http://blog.javachen.com/2014/05/24/using-scrapy-to-cralw-data/</p> </div> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1275238086510395392"></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">你可能感兴趣的:(分布式采集)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835514307744460800.htm" title="QQ群采集助手,精准引流必备神器" target="_blank">QQ群采集助手,精准引流必备神器</a> <span class="text-muted">2401_87347160</span> <a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96/1.htm">其他</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>功能概述微信群查找与筛选工具是一款专为微信用户设计的辅助工具,它通过关键词搜索功能,帮助用户快速找到相关的微信群,并提供筛选是否需要验证的群组的功能。主要功能关键词搜索:用户可以输入关键词,工具将自动查找包含该关键词的微信群。筛选功能:工具提供筛选机制,用户可以选择是否只显示需要验证或不需要验证的群组。精准引流:通过上述功能,用户可以更精准地找到目标群组,进行有效的引流操作。3.设备需求该工具可以</div> </li> <li><a href="/article/1835496402042580992.htm" title="GitHub上克隆项目" target="_blank">GitHub上克隆项目</a> <span class="text-muted">bigbig猩猩</span> <a class="tag" taget="_blank" href="/search/github/1.htm">github</a> <div>从GitHub上克隆项目是一个简单且直接的过程,它允许你将远程仓库中的项目复制到你的本地计算机上,以便进行进一步的开发、测试或学习。以下是一个详细的步骤指南,帮助你从GitHub上克隆项目。一、准备工作1.安装Git在克隆GitHub项目之前,你需要在你的计算机上安装Git工具。Git是一个开源的分布式版本控制系统,用于跟踪和管理代码变更。你可以从Git的官方网站(https://git-scm.</div> </li> <li><a href="/article/1835490218409553920.htm" title="01-Git初识" target="_blank">01-Git初识</a> <span class="text-muted">Meereen</span> <a class="tag" taget="_blank" href="/search/Git/1.htm">Git</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a> <div>01-Git初识概念:一个免费开源,分布式的代码版本控制系统,帮助开发团队维护代码作用:记录代码内容。切换代码版本,多人开发时高效合并代码内容如何学:个人本机使用:Git基础命令和概念多人共享使用:团队开发同一个项目的代码版本管理Git配置用户信息配置:用户名和邮箱,应用在每次提交代码版本时表明自己的身份命令:查看git版本号git-v配置用户名gitconfig--globaluser.name</div> </li> <li><a href="/article/1835483159630802944.htm" title="nosql数据库技术与应用知识点" target="_blank">nosql数据库技术与应用知识点</a> <span class="text-muted">皆过客,揽星河</span> <a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a><a class="tag" taget="_blank" href="/search/nosql/1.htm">nosql</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/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E9%9D%9E%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">非关系型数据库</a> <div>Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)</div> </li> <li><a href="/article/1835475972120473600.htm" title="TDengine 签约前晨汽车,解锁智能出行的无限潜力" target="_blank">TDengine 签约前晨汽车,解锁智能出行的无限潜力</a> <span class="text-muted">涛思数据(TDengine)</span> <a class="tag" taget="_blank" href="/search/tdengine/1.htm">tdengine</a><a class="tag" taget="_blank" href="/search/%E6%B1%BD%E8%BD%A6/1.htm">汽车</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a> <div>在全球汽车产业转型升级的背景下,智能网联和新能源技术正迅速成为商用车行业的重要发展方向。随着市场对环保和智能化需求的日益增强,企业必须在技术创新和数据管理上不断突破,以满足客户对高效、安全和智能出行的期待。在这一背景下,前晨汽车凭借其在新能源智能商用车领域的前瞻性布局和技术实力,成为行业中的佼佼者。前晨汽车采用整车数据采集和全车数据打通策略,能够实时将数据推送至APP端客户。然而,这导致整体写入和</div> </li> <li><a href="/article/1835456308095053824.htm" title="Kafka是如何保证数据的安全性、可靠性和分区的" target="_blank">Kafka是如何保证数据的安全性、可靠性和分区的</a> <span class="text-muted">喜欢猪猪</span> <a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>Kafka作为一个高性能、可扩展的分布式流处理平台,通过多种机制来确保数据的安全性、可靠性和分区的有效管理。以下是关于Kafka如何保证数据安全性、可靠性和分区的详细解析:一、数据安全性SSL/TLS加密:Kafka支持SSL/TLS协议,通过配置SSL证书和密钥来加密数据传输,确保数据在传输过程中不会被窃取或篡改。这一机制有效防止了中间人攻击,保护了数据的安全性。SASL认证:Kafka支持多种</div> </li> <li><a href="/article/1835455048277127168.htm" title="Python神器!WEB自动化测试集成工具 DrissionPage" target="_blank">Python神器!WEB自动化测试集成工具 DrissionPage</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%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一、前言用requests做数据采集面对要登录的网站时,要分析数据包、JS源码,构造复杂的请求,往往还要应付验证码、JS混淆、签名参数等反爬手段,门槛较高。若数据是由JS计算生成的,还须重现计算过程,体验不好,开发效率不高。使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。因此,这个库设计初衷,是将它们合而为一,能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率</div> </li> <li><a href="/article/1835446595966038016.htm" title="基于STM32与Qt的自动平衡机器人:从控制到人机交互的的详细设计流程" target="_blank">基于STM32与Qt的自动平衡机器人:从控制到人机交互的的详细设计流程</a> <span class="text-muted">极客小张</span> <a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E4%BA%BA/1.htm">机器人</a><a class="tag" taget="_blank" href="/search/%E7%89%A9%E8%81%94%E7%BD%91/1.htm">物联网</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E6%9C%BA%E4%BA%A4%E4%BA%92/1.htm">人机交互</a><a class="tag" taget="_blank" href="/search/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/1.htm">毕业设计</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>一、项目概述目标和用途本项目旨在开发一款基于STM32控制的自动平衡机器人,结合步进电机和陀螺仪传感器,实现对平衡机器人的精确控制。该机器人可以用于教育、科研、娱乐等多个领域,帮助用户了解自动控制、机器人运动学等相关知识。技术栈关键词STM32单片机步进电机陀螺仪传感器AD采集电路Qt人机界面实时数据监控二、系统架构系统架构设计本项目的系统架构设计包括以下主要组件:控制单元:STM32单片机传感器</div> </li> <li><a href="/article/1835438028009598976.htm" title="WebMagic:强大的Java爬虫框架解析与实战" target="_blank">WebMagic:强大的Java爬虫框架解析与实战</a> <span class="text-muted">Aaron_945</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><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> <div>文章目录引言官网链接WebMagic原理概述基础使用1.添加依赖2.编写PageProcessor高级使用1.自定义Pipeline2.分布式抓取优点结论引言在大数据时代,网络爬虫作为数据收集的重要工具,扮演着不可或缺的角色。Java作为一门广泛使用的编程语言,在爬虫开发领域也有其独特的优势。WebMagic是一个开源的Java爬虫框架,它提供了简单灵活的API,支持多线程、分布式抓取,以及丰富的</div> </li> <li><a href="/article/1835420501065953280.htm" title="华为云分布式缓存服务DCS 8月新特性发布" target="_blank">华为云分布式缓存服务DCS 8月新特性发布</a> <span class="text-muted">华为云PaaS服务小智</span> <a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA%E4%BA%91/1.htm">华为云</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>分布式缓存服务(DistributedCacheService,简称DCS)是华为云提供的一款兼容Redis的高速内存数据处理引擎,为您提供即开即用、安全可靠、弹性扩容、便捷管理的在线分布式缓存能力,满足用户高并发及数据快速访问的业务诉求。此次为大家带来DCS8月的特性更新内容,一起来看看吧!</div> </li> <li><a href="/article/1835415206004617216.htm" title="浅谈MapReduce" target="_blank">浅谈MapReduce</a> <span class="text-muted">Android路上的人</span> <a class="tag" taget="_blank" href="/search/Hadoop/1.htm">Hadoop</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%A1%E7%AE%97/1.htm">分布式计算</a><a class="tag" taget="_blank" href="/search/mapreduce/1.htm">mapreduce</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>从今天开始,本人将会开始对另一项技术的学习,就是当下炙手可热的Hadoop分布式就算技术。目前国内外的诸多公司因为业务发展的需要,都纷纷用了此平台。国内的比如BAT啦,国外的在这方面走的更加的前面,就不一一列举了。但是Hadoop作为Apache的一个开源项目,在下面有非常多的子项目,比如HDFS,HBase,Hive,Pig,等等,要先彻底学习整个Hadoop,仅仅凭借一个的力量,是远远不够的。</div> </li> <li><a href="/article/1835386072499056640.htm" title="童年 九 上" target="_blank">童年 九 上</a> <span class="text-muted">Y于生</span> <div>我把自己的童年时代比喻成蜂巢,形形色色平凡又普通的人们如同蜜蜂,把各自采集到的生活和知识的蜂蜜源源不断地输送给我,为我的成长提供丰富的养料。尽管这养料又脏又苦,但只要是知识,它就是蜂蜜,虽苦犹甜。自从“好极了”离开后,我又跟彼得大叔成了好朋友。他长得很像外公,瘦削、利落,收拾得干干净净,只是整个人都比外公小一号。他就像一个专门为逗人乐而装扮成老头儿的调皮孩子,他的脸像由无数根细条编成的鸟笼子,在这</div> </li> <li><a href="/article/1835362513961709568.htm" title="KVM+GFS分布式存储系统构建KVM高可用" target="_blank">KVM+GFS分布式存储系统构建KVM高可用</a> <span class="text-muted">henan程序媛</span> <a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/GFS/1.htm">GFS</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%8F%AF%E7%94%A8/1.htm">高可用</a><a class="tag" taget="_blank" href="/search/KVM/1.htm">KVM</a> <div>一、案列分析1.1案列概述本章案例主要使用之前章节所学的KVM及GlusterFs技术,结合起来从而实现KVM高可用。利用GlusterFs分布式复制卷,对KVM虚拟机文件进行分布存储和冗余。分布式复制卷主要用于需要冗余的情况下把一个文件存放在两个或两个以上的节点,当其中一个节点数据丢失或者损坏之后,KVM仍然能够通过卷组找到另一节点上存储的虚拟机文件,以保证虚拟机正常运行。当节点修复之后,Glu</div> </li> <li><a href="/article/1835357725761040384.htm" title="Hadoop" target="_blank">Hadoop</a> <span class="text-muted">傲雪凌霜,松柏长青</span> <a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>ApacheHadoop是一个开源的分布式计算框架,主要用于处理海量数据集。它具有高度的可扩展性、容错性和高效的分布式存储与计算能力。Hadoop核心由四个主要模块组成,分别是HDFS(分布式文件系统)、MapReduce(分布式计算框架)、YARN(资源管理)和HadoopCommon(公共工具和库)。1.HDFS(HadoopDistributedFileSystem)HDFS是Hadoop生</div> </li> <li><a href="/article/1835350535818014720.htm" title="如何建设数据中台(五)——数据汇集—打破企业数据孤岛" target="_blank">如何建设数据中台(五)——数据汇集—打破企业数据孤岛</a> <span class="text-muted">weixin_47088026</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95%E5%92%8C%E6%80%BB%E7%BB%93/1.htm">学习记录和总结</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E5%8F%B0/1.htm">中台</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E4%B8%AD%E5%8F%B0/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><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>数据汇集——打破企业数据孤岛要构建企业级数据中台,第一步就是将企业内部各个业务系统的数据实现互通互联,打破数据孤岛,主要通过数据汇聚和交换来实现。企业采集的数据可以是线上采集、线下数据采集、互联网数据采集、内部数据采集等。线上数据采集主要载体分为互联网和移动互联网两种,对应有系统平台、网页、H5、小程序、App等,可以采用前端或后端埋点方式采集数据。线下数据采集主要是通过硬件来采集,例如:WiFi</div> </li> <li><a href="/article/1835347005522669568.htm" title="大模型训练数据库Common Crawl" target="_blank">大模型训练数据库Common Crawl</a> <span class="text-muted">WindyChanChan</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E9%9B%86/1.htm">数据集</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/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>CommonCrawl介绍‌‌CommonCrawl是一个非营利组织,致力于通过大规模分布式爬虫系统定期抓取整个Web并将其存储在一个可公开访问的数据库中。CommonCrawl的数据收集和处理过程包括使用Python开源爬虫工具收集全球范围内的网站数据,并将其上传到‌CommonCrawl基金会的数据仓库中。该项目从2008年开始,至今已经积累了大量的原始网页数据、元数据和文本提取数据。这些数据</div> </li> <li><a href="/article/1835343852542717952.htm" title="慢速连接攻击是什么?慢速连接攻击怎么防护?" target="_blank">慢速连接攻击是什么?慢速连接攻击怎么防护?</a> <span class="text-muted">快快小毛毛</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/ddos/1.htm">ddos</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>慢速连接攻击(SlowConnectionAttack),又称慢速攻击(SlowlorisAttack),是一种网络攻击技术,旨在通过占用服务器上的所有可用连接资源来使其无法响应正常请求。与传统的拒绝服务(DoS)和分布式拒绝服务(DDoS)攻击不同,慢速攻击并不依赖于发送大量数据包来消耗带宽,而是利用HTTP、TCP或SSL等协议的特性,通过发送大量不完整的请求或缓慢发送数据来占用服务器资源,使</div> </li> <li><a href="/article/1835343473629294592.htm" title="分布式锁和spring事务管理" target="_blank">分布式锁和spring事务管理</a> <span class="text-muted">暴躁的鱼</span> <a class="tag" taget="_blank" href="/search/%E9%94%81%E5%8F%8A%E4%BA%8B%E5%8A%A1/1.htm">锁及事务</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>最近开发一个小程序遇到一个需求需要实现分布式事务管理业务需求用户在使用小程序的过程中可以查看景点,对景点地区或者城市标记是否想去,那么需要统计一个地点被标记的人数,以及记录某个用户对某个地点是否标记为想去,用两个表存储数据,一个地点表记录改地点被标记的次数,一个用户意向表记录某个用户对某个地点是否标记为想去。由于可能有多个用户同时标记一个地点,每个用户在前端点击想去按钮之后,后台接收到请求,从数据</div> </li> <li><a href="/article/1835321295861018624.htm" title="Gobelieve 架构" target="_blank">Gobelieve 架构</a> <span class="text-muted">weixin_34099526</span> <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/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a> <div>Gobelievegithub地址声明:转简书JackieF的文章,为了自己方便copy了一份,加一些自己的东西.链接:https://www.jianshu.com/p/8121d6e85282IMCore主要分三大块:im客户连接服务器(可分布式部署,暂无负载均衡模块)imr路由查询服务器(主要解决im分布式部署的问题)ims存储服务器(主从部署)基础模块1.数据包协议包:header(12)</div> </li> <li><a href="/article/1835319487742701568.htm" title="音视频知识图谱 2022.04" target="_blank">音视频知识图谱 2022.04</a> <span class="text-muted">关键帧Keyframe</span> <div>前些时间,我在知识星球上创建了一个音视频技术社群:关键帧的音视频开发圈,在这里群友们会一起做一些打卡任务。比如:周期性地整理音视频相关的面试题,汇集一份音视频面试题集锦,你可以看看《音视频面试题集锦2022.04》。再比如:循序渐进地归纳总结音视频技术知识,绘制一幅音视频知识图谱。下面是2022.04月知识图谱新增的内容节选:1)图谱路径:**采集/音频采集/声音三要素/响度******主观计量响</div> </li> <li><a href="/article/1835294885297614848.htm" title="Kafka详细解析与应用分析" target="_blank">Kafka详细解析与应用分析</a> <span class="text-muted">芊言芊语</span> <a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>Kafka是一个开源的分布式事件流平台(EventStreamingPlatform),由LinkedIn公司最初采用Scala语言开发,并基于ZooKeeper协调管理。如今,Kafka已经被Apache基金会纳入其项目体系,广泛应用于大数据实时处理领域。Kafka凭借其高吞吐量、持久化、分布式和可靠性的特点,成为构建实时流数据管道和流处理应用程序的重要工具。Kafka架构Kafka的架构主要由</div> </li> <li><a href="/article/1835288964056051712.htm" title="分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 spark大数据毕设项目(源码、调试、LW、开题、PPT)" target="_blank">分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 spark大数据毕设项目(源码、调试、LW、开题、PPT)</a> <span class="text-muted">计算机源码社</span> <a class="tag" taget="_blank" href="/search/Python%E9%A1%B9%E7%9B%AE/1.htm">Python项目</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E9%80%89%E9%A2%98/1.htm">计算机毕业设计选题</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E6%BA%90%E7%A0%81/1.htm">计算机毕业设计源码</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/spark%E6%AF%95%E8%AE%BE/1.htm">spark毕设</a> <div>作者:计算机源码社个人简介:本人八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!学习资料、程序开发、技术解答、文档报告如需要源码,可以扫取文章下方二维码联系咨询Java项目微信小程序项目Android项目Python项目PHP项目ASP.NET项目Node.js项目选题推荐项目实战|p</div> </li> <li><a href="/article/1835278630389903360.htm" title="linux挂载文件夹" target="_blank">linux挂载文件夹</a> <span class="text-muted">小码快撩</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>1.使用NFS(NetworkFileSystem)NFS是一种分布式文件系统协议,允许一个系统将其文件系统的一部分共享给其他系统。检查是否安装NFSrpm-qa|grepnfs2.启动和启用NFS服务假设服务名称为nfs-server.service,你可以使用以下命令启动和启用它:sudosystemctlstartnfs-server.servicesudosystemctlenablenf</div> </li> <li><a href="/article/1835274724960202752.htm" title="Kafka 基础与架构理解" target="_blank">Kafka 基础与架构理解</a> <span class="text-muted">StaticKing</span> <a class="tag" taget="_blank" href="/search/KAFKA/1.htm">KAFKA</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a> <div>目录前言Kafka基础概念消息队列简介:Kafka与传统消息队列(如RabbitMQ、ActiveMQ)的对比Kafka的组件Kafka的工作原理:消息的生产、分发、消费流程Kafka系统架构Kafka的分布式架构设计Leader-Follower机制与数据复制Log-basedStorage和持久化Broker间通信协议Zookeeper在Kafka中的角色总结前言Kafka是一个分布式的消息系</div> </li> <li><a href="/article/1835272961909682176.htm" title="Rides实现分布式锁,保障数据一致性,Redisson分布式事务处理" target="_blank">Rides实现分布式锁,保障数据一致性,Redisson分布式事务处理</a> <span class="text-muted">朱杰jjj</span> <a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>分布式环境下分布式锁有三种方式:基于数据库分布式锁基于Redis分布式锁基于zk分布式锁本帖只介绍Redis分布式锁为什么需要用到分布式锁?在单机环境下一个服务中多个线程对同一个事物或数据资源进行操作时,可以通过添加加锁方式(synchronized和lock)来解决数据一致性的问题。但是如果出现多个服务的情况下,这时候我们在通过synchronized和lock的方式来加锁会出现问题,因为多个服</div> </li> <li><a href="/article/1835266404060852224.htm" title="机电综合管理系统架构" target="_blank">机电综合管理系统架构</a> <span class="text-muted">小熊coder</span> <a class="tag" taget="_blank" href="/search/%E6%9C%BA%E8%BD%BD%E7%B3%BB%E7%BB%9F/1.htm">机载系统</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a> <div>文章目录一、机电综合管理系统架构1.系统概述2.架构层次3.核心组件二、余度管理1.余度概述2.硬件冗余3.软件冗余4.通信冗余三、总线架构1.MIL-STD-1553B总线2.ARINC429总线3.ARINC629总线4.AFDX/ARINC664总线四、未来发展趋势1.分布式架构2.高速网络3.智能化与自动化结语机电综合管理系统(ElectromechanicalManagementSyst</div> </li> <li><a href="/article/1835260726516740096.htm" title="华为云分布式缓存服务DCS与开源服务差异对比" target="_blank">华为云分布式缓存服务DCS与开源服务差异对比</a> <span class="text-muted">hcinfo_18</span> <a class="tag" taget="_blank" href="/search/redis%E4%BD%BF%E7%94%A8/1.htm">redis使用</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA%E4%BA%91/1.htm">华为云</a><a class="tag" taget="_blank" href="/search/Redis5.0/1.htm">Redis5.0</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F%E7%BC%93%E5%AD%98%E6%9C%8D%E5%8A%A1/1.htm">分布式缓存服务</a><a class="tag" taget="_blank" href="/search/Redis%E5%AE%A2%E6%88%B7%E7%AB%AF/1.htm">Redis客户端</a> <div>分布式缓存服务DCS提供单机、主备、集群等丰富的实例类型,满足用户高读写性能及快速数据访问的业务诉求。支持丰富的实例管理操作,帮助用户省去运维烦恼。用户可以聚焦于业务逻辑本身,而无需过多考虑部署、监控、扩容、安全、故障恢复等方面的问题。DCS基于开源Redis、Memcached向用户提供一定程度定制化的缓存服务,因此,除了拥有开源服务缓存数据库的优秀特性,DCS提供更多实用功能。一、与开源Red</div> </li> <li><a href="/article/1835250143142703104.htm" title="tushare库获取金融股票数据" target="_blank">tushare库获取金融股票数据</a> <span class="text-muted">罔闻_spider</span> <a class="tag" taget="_blank" href="/search/python%E8%BF%9B%E9%98%B6/1.htm">python进阶</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>定义:Tushare是一个为金融量化分析师和数据爱好者设计的开源工具,提供从数据采集、清洗加工到数据存储的全流程服务。它能够实时抓取沪深两市的股票和期货市场数据,包括交易价格、成交量、市值、市盈率等关键指标,同时也提供历史数据的采集。Tushare的数据采集功能是其核心优势之一,它支持多种数据类型,包括日K线数据和分钟级数据,满足不同分析需求。Tushare的数据清洗与加工功能提供了强大的工具集,</div> </li> <li><a href="/article/1835241190807662592.htm" title="【STM32系统】基于STM32设计的锂电池电量/电压检测报警器系统——文末完整资料下载(程序源码/电路原理图/电路PCB/设计文档/模块资料/元器件清单/实物图/答辩问题技巧/PPT模版等)" target="_blank">【STM32系统】基于STM32设计的锂电池电量/电压检测报警器系统——文末完整资料下载(程序源码/电路原理图/电路PCB/设计文档/模块资料/元器件清单/实物图/答辩问题技巧/PPT模版等)</a> <span class="text-muted">阿齐Archie</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA%E5%B5%8C%E5%85%A5%E5%BC%8F%E9%A1%B9%E7%9B%AE/1.htm">单片机嵌入式项目</a><a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a> <div>基于STM32设计的锂电池电量/电压检测报警器系统系统视频:摘要:本设计旨在研究一个基于STM32F103C8T6微控制器的锂电池电量/电压检测报警器系统,应用于便携式电子设备电池管理。系统通过STM32的ADC模块对锂电池电压进行采集,利用LCD1602显示模块实时显示电池电压,当检测到电池电量不足或电压异常时,蜂鸣器报警模块会发出警报提醒用户。系统采用简单的硬件结构和优化的软件架构,通过对实际</div> </li> <li><a href="/article/1835234007260950528.htm" title="Dubbo架构概览:服务注册与发现、远程调用、监控与管理" target="_blank">Dubbo架构概览:服务注册与发现、远程调用、监控与管理</a> <span class="text-muted">木南曌</span> <a class="tag" taget="_blank" href="/search/dubbo/1.htm">dubbo</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>Dubbo是一个成熟的、高性能的、基于Java的微服务开发框架,它主要用于解决分布式系统中的服务治理问题,包括服务的注册与发现、远程过程调用(RPC)、服务监控与管理等多个关键环节。以下是Dubbo架构概览的详细介绍:服务注册与发现Dubbo的服务注册与发现机制是其核心功能之一,它依赖于注册中心来管理服务的生命周期和定位服务提供者。1.服务提供者(Provider)服务提供者是实际提供服务的节点,</div> </li> <li><a href="/article/84.htm" title="继之前的线程循环加到窗口中运行" target="_blank">继之前的线程循环加到窗口中运行</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/JFrame/1.htm">JFrame</a><a class="tag" taget="_blank" href="/search/JPanel/1.htm">JPanel</a> <div>之前写了有关java线程的循环执行和结束,因为想制作成exe文件,想把执行的效果加到窗口上,所以就结合了JFrame和JPanel写了这个程序,这里直接贴出代码,在窗口上运行的效果下面有附图。 package thread; import java.awt.Graphics; import java.text.SimpleDateFormat; import java.util</div> </li> <li><a href="/article/211.htm" title="linux 常用命令" target="_blank">linux 常用命令</a> <span class="text-muted">BlueSkator</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%91%BD%E4%BB%A4/1.htm">命令</a> <div>1.grep 相信这个命令可以说是大家最常用的命令之一了。尤其是查询生产环境的日志,这个命令绝对是必不可少的。 但之前总是习惯于使用 (grep -n 关键字 文件名 )查出关键字以及该关键字所在的行数,然后再用 (sed -n  '100,200p' 文件名),去查出该关键字之后的日志内容。 但其实还有更简便的办法,就是用(grep  -B n、-A n、-C n 关键</div> </li> <li><a href="/article/338.htm" title="php heredoc原文档和nowdoc语法" target="_blank">php heredoc原文档和nowdoc语法</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/heredoc/1.htm">heredoc</a><a class="tag" taget="_blank" href="/search/nowdoc/1.htm">nowdoc</a> <div><!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Current To-Do List</title> </head> <body> <?</div> </li> <li><a href="/article/465.htm" title="overflow的属性" target="_blank">overflow的属性</a> <span class="text-muted">周华华</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&q</div> </li> <li><a href="/article/592.htm" title="《我所了解的Java》——总体目录" target="_blank">《我所了解的Java》——总体目录</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>        准备用一年左右时间写一个系列的文章《我所了解的Java》,目录及内容会不断完善及调整。         在编写相关内容时难免出现笔误、代码无法执行、名词理解错误等,请大家及时指出,我会第一时间更正。    &n</div> </li> <li><a href="/article/719.htm" title="[简单]docx4j常用方法小结" target="_blank">[简单]docx4j常用方法小结</a> <span class="text-muted">53873039oycg</span> <a class="tag" taget="_blank" href="/search/docx/1.htm">docx</a> <div>        本代码基于docx4j-3.2.0,在office word 2007上测试通过。代码如下:         import java.io.File; import java.io.FileInputStream; import ja</div> </li> <li><a href="/article/846.htm" title="Spring配置学习" target="_blank">Spring配置学习</a> <span class="text-muted">云端月影</span> <a class="tag" taget="_blank" href="/search/spring%E9%85%8D%E7%BD%AE/1.htm">spring配置</a> <div> 首先来看一个标准的Spring配置文件 applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&q</div> </li> <li><a href="/article/973.htm" title="Java新手入门的30个基本概念三" target="_blank">Java新手入门的30个基本概念三</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E6%89%8B/1.htm">新手</a><a class="tag" taget="_blank" href="/search/java+%E5%85%A5%E9%97%A8/1.htm">java 入门</a> <div>17.Java中的每一个类都是从Object类扩展而来的。  18.object类中的equal和toString方法。  equal用于测试一个对象是否同另一个对象相等。  toString返回一个代表该对象的字符串,几乎每一个类都会重载该方法,以便返回当前状态的正确表示.(toString 方法是一个很重要的方法)   19.通用编程:任何类类型的所有值都可以同object类性的变量来代替。 </div> </li> <li><a href="/article/1100.htm" title="《2008 IBM Rational 软件开发高峰论坛会议》小记" target="_blank">《2008 IBM Rational 软件开发高峰论坛会议》小记</a> <span class="text-muted">antonyup_2006</span> <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/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91/1.htm">敏捷开发</a><a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/1.htm">项目管理</a><a class="tag" taget="_blank" href="/search/IBM/1.htm">IBM</a><a class="tag" taget="_blank" href="/search/%E6%B4%BB%E5%8A%A8/1.htm">活动</a> <div>我一直想写些总结,用于交流和备忘,然都没提笔,今以一篇参加活动的感受小记开个头,呵呵! 其实参加《2008 IBM Rational 软件开发高峰论坛会议》是9月4号,那天刚好调休.但接着项目颇为忙,所以今天在中秋佳节的假期里整理了下. 参加这次活动是一个朋友给的一个邀请书,才知道有这样的一个活动,虽然现在项目暂时没用到IBM的解决方案,但觉的参与这样一个活动可以拓宽下视野和相关知识.</div> </li> <li><a href="/article/1227.htm" title="PL/SQL的过程编程,异常,声明变量,PL/SQL块" target="_blank">PL/SQL的过程编程,异常,声明变量,PL/SQL块</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/PL%2FSQL%E7%9A%84%E8%BF%87%E7%A8%8B%E7%BC%96%E7%A8%8B/1.htm">PL/SQL的过程编程</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E5%B8%B8/1.htm">异常</a><a class="tag" taget="_blank" href="/search/PL%2FSQL%E5%9D%97/1.htm">PL/SQL块</a><a class="tag" taget="_blank" href="/search/%E5%A3%B0%E6%98%8E%E5%8F%98%E9%87%8F/1.htm">声明变量</a> <div>PL/SQL;    过程; 符号; 变量; PL/SQL块; 输出; 异常;     PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言PL/SQL 是对 SQL 的扩展,sql的执行时每次都要写操作</div> </li> <li><a href="/article/1354.htm" title="Mockito(三)--完整功能介绍" target="_blank">Mockito(三)--完整功能介绍</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/1.htm">持续集成</a><a class="tag" taget="_blank" href="/search/mockito/1.htm">mockito</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a> <div>        mockito官网:http://code.google.com/p/mockito/,打开documentation可以看到官方最新的文档资料。 一.使用mockito验证行为 //首先要import Mockito import static org.mockito.Mockito.*; //mo</div> </li> <li><a href="/article/1481.htm" title="精通Oracle10编程SQL(8)使用复合数据类型" target="_blank">精通Oracle10编程SQL(8)使用复合数据类型</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</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/plsql/1.htm">plsql</a> <div>/* *使用复合数据类型 */ --PL/SQL记录 --定义PL/SQL记录 --自定义PL/SQL记录 DECLARE TYPE emp_record_type IS RECORD( name emp.ename%TYPE, salary emp.sal%TYPE, dno emp.deptno%TYPE ); emp_</div> </li> <li><a href="/article/1608.htm" title="【Linux常用命令一】grep命令" target="_blank">【Linux常用命令一】grep命令</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/1.htm">Linux常用命令</a> <div>grep命令格式   grep [option] pattern [file-list]     grep命令用于在指定的文件(一个或者多个,file-list)中查找包含模式串(pattern)的行,[option]用于控制grep命令的查找方式。   pattern可以是普通字符串,也可以是正则表达式,当查找的字符串包含正则表达式字符或者特</div> </li> <li><a href="/article/1735.htm" title="mybatis3入门学习笔记" target="_blank">mybatis3入门学习笔记</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a><a class="tag" taget="_blank" href="/search/qq/1.htm">qq</a><a class="tag" taget="_blank" href="/search/jdbc/1.htm">jdbc</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/1.htm">配置管理</a> <div>MyBatis 的前身就是iBatis,是一个数据持久层(ORM)框架。  MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis对JDBC进行了一次很浅的封装。   以前也学过iBatis,因为MyBatis是iBatis的升级版本,最初以为改动应该不大,实际结果是MyBatis对配置文件进行了一些大的改动,使整个框架更加方便人性化。</div> </li> <li><a href="/article/1862.htm" title="Linux 命令神器:lsof 入门" target="_blank">Linux 命令神器:lsof 入门</a> <span class="text-muted">ronin47</span> <a class="tag" taget="_blank" href="/search/lsof/1.htm">lsof</a> <div>       lsof是系统管理/安全的尤伯工具。我大多数时候用它来从系统获得与网络连接相关的信息,但那只是这个强大而又鲜为人知的应用的第一步。将这个工具称之为lsof真实名副其实,因为它是指“列出打开文件(lists openfiles)”。而有一点要切记,在Unix中一切(包括网络套接口)都是文件。 有趣的是,lsof也是有着最多</div> </li> <li><a href="/article/1989.htm" title="java实现两个大数相加,可能存在溢出。" target="_blank">java实现两个大数相加,可能存在溢出。</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java%E5%AE%9E%E7%8E%B0/1.htm">java实现</a> <div> import java.math.BigInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; public class BigIntegerAddition { /** * 题目:java实现两个大数相加,可能存在溢出。 * 如123456789 + 987654321</div> </li> <li><a href="/article/2116.htm" title="Kettle学习资料分享,附大神用Kettle的一套流程完成对整个数据库迁移方法" target="_blank">Kettle学习资料分享,附大神用Kettle的一套流程完成对整个数据库迁移方法</a> <span class="text-muted">Kai_Ge</span> <a class="tag" taget="_blank" href="/search/Kettle/1.htm">Kettle</a> <div>Kettle学习资料分享   Kettle 3.2 使用说明书 目录 概述..........................................................................................................................................7 1.Kettle 资源库管</div> </li> <li><a href="/article/2243.htm" title="[货币与金融]钢之炼金术士" target="_blank">[货币与金融]钢之炼金术士</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E9%87%91%E8%9E%8D/1.htm">金融</a> <div>        自古以来,都有一些人在从事炼金术的工作.........但是很少有成功的        那么随着人类在理论物理和工程物理上面取得的一些突破性进展......        炼金术这个古老</div> </li> <li><a href="/article/2370.htm" title="Toast原来也可以多样化" target="_blank">Toast原来也可以多样化</a> <span class="text-muted">dai_lm</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/toast/1.htm">toast</a> <div>Style 1: 默认 Toast def = Toast.makeText(this, "default", Toast.LENGTH_SHORT); def.show(); Style 2: 顶部显示 Toast top = Toast.makeText(this, "top", Toast.LENGTH_SHORT); t</div> </li> <li><a href="/article/2497.htm" title="java数据计算的几种解决方法3" target="_blank">java数据计算的几种解决方法3</a> <span class="text-muted">datamachine</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a><a class="tag" taget="_blank" href="/search/r-langue/1.htm">r-langue</a><a class="tag" taget="_blank" href="/search/r/1.htm">r</a> <div>4、iBatis     简单敏捷因此强大的数据计算层。和Hibernate不同,它鼓励写SQL,所以学习成本最低。同时它用最小的代价实现了计算脚本和JAVA代码的解耦,只用20%的代价就实现了hibernate 80%的功能,没实现的20%是计算脚本和数据库的解耦。     复杂计算环境是它的弱项,比如:分布式计算、复杂计算、非数据</div> </li> <li><a href="/article/2624.htm" title="向网页中插入透明Flash的方法和技巧" target="_blank">向网页中插入透明Flash的方法和技巧</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/Flash/1.htm">Flash</a> <div>将 Flash 作品插入网页的时候,我们有时候会需要将它设为透明,有时候我们需要在Flash的背面插入一些漂亮的图片,搭配出漂亮的效果……下面我们介绍一些将Flash插入网页中的一些透明的设置技巧。   一、Swf透明、无坐标控制  首先教大家最简单的插入Flash的代码,透明,无坐标控制:   注意wmode="transparent"是控制Flash是否透明</div> </li> <li><a href="/article/2751.htm" title="ios UICollectionView的使用" target="_blank">ios UICollectionView的使用</a> <span class="text-muted">dcj3sjt126com</span> <div>UICollectionView的使用有两种方法,一种是继承UICollectionViewController,这个Controller会自带一个UICollectionView;另外一种是作为一个视图放在普通的UIViewController里面。 个人更喜欢第二种。下面采用第二种方式简单介绍一下UICollectionView的使用。 1.UIViewController实现委托,代码如</div> </li> <li><a href="/article/2878.htm" title="Eos平台java公共逻辑" target="_blank">Eos平台java公共逻辑</a> <span class="text-muted">蕃薯耀</span> <a class="tag" taget="_blank" href="/search/Eos%E5%B9%B3%E5%8F%B0java%E5%85%AC%E5%85%B1%E9%80%BB%E8%BE%91/1.htm">Eos平台java公共逻辑</a><a class="tag" taget="_blank" href="/search/Eos%E5%B9%B3%E5%8F%B0/1.htm">Eos平台</a><a class="tag" taget="_blank" href="/search/java%E5%85%AC%E5%85%B1%E9%80%BB%E8%BE%91/1.htm">java公共逻辑</a> <div> Eos平台java公共逻辑 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 蕃薯耀 2015年6月1日 17:20:4</div> </li> <li><a href="/article/3005.htm" title="SpringMVC4零配置--Web上下文配置【MvcConfig】" target="_blank">SpringMVC4零配置--Web上下文配置【MvcConfig】</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/springmvc4/1.htm">springmvc4</a> <div>与SpringSecurity的配置类似,spring同样为我们提供了一个实现类WebMvcConfigurationSupport和一个注解@EnableWebMvc以帮助我们减少bean的声明。   applicationContext-MvcConfig.xml <!-- 启用注解,并定义组件查找规则 ,mvc层只负责扫描@Controller --> <</div> </li> <li><a href="/article/3132.htm" title="解决ie和其他浏览器poi下载excel文件名乱码" target="_blank">解决ie和其他浏览器poi下载excel文件名乱码</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/Excel/1.htm">Excel</a> <div>   使用poi,做传统的excel导出,然后想在浏览器中,让用户选择另存为,保存用户下载的xls文件,这个时候,可能的是在ie下出现乱码(ie,9,10,11),但在firefox,chrome下没乱码, 因此必须综合判断,编写一个工具类:      /** * * @Title: pro</div> </li> <li><a href="/article/3259.htm" title="挥洒泪水的青春" target="_blank">挥洒泪水的青春</a> <span class="text-muted">lampcy</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a> <div>2015年2月28日,我辞职了,离开了相处一年的触控,转过身--挥洒掉泪水,毅然来到了兄弟连,背负着许多的不解、质疑——”你一个零基础、脑子又不聪明的人,还敢跨行业,选择Unity3D?“,”真是不自量力••••••“,”真是初生牛犊不怕虎•••••“,••••••我只是淡淡一笑,拎着行李----坐上了通向挥洒泪水的青春之地——兄弟连! 这就是我青春的分割线,不后悔,只会去用泪水浇灌——已经来到</div> </li> <li><a href="/article/3386.htm" title="稳增长之中国股市两点意见-----严控做空,建立涨跌停版停牌重组机制" target="_blank">稳增长之中国股市两点意见-----严控做空,建立涨跌停版停牌重组机制</a> <span class="text-muted">nannan408</span> <div>   对于股市,我们国家的监管还是有点拼的,但始终拼不过飞流直下的恐慌,为什么呢?    笔者首先支持股市的监管。对于股市越管越荡的现象,笔者认为首先是做空力量超过了股市自身的升力,并且对于跌停停牌重组的快速反应还没建立好,上市公司对于股价下跌没有很好的利好支撑。    我们来看美国和香港是怎么应对股灾的。美国是靠禁止重要股票做空,在</div> </li> <li><a href="/article/3513.htm" title="动态设置iframe高度(iframe高度自适应)" target="_blank">动态设置iframe高度(iframe高度自适应)</a> <span class="text-muted">Rainbow702</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/iframe/1.htm">iframe</a><a class="tag" taget="_blank" href="/search/contentDocument/1.htm">contentDocument</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%BA%A6%E8%87%AA%E9%80%82%E5%BA%94/1.htm">高度自适应</a><a class="tag" taget="_blank" href="/search/%E5%B1%80%E9%83%A8%E5%88%B7%E6%96%B0/1.htm">局部刷新</a> <div>如果需要对画面中的部分区域作局部刷新,大家可能都会想到使用ajax。 但有些情况下,须使用在页面中嵌入一个iframe来作局部刷新。 对于使用iframe的情况,发现有一个问题,就是iframe中的页面的高度可能会很高,但是外面页面并不会被iframe内部页面给撑开,如下面的结构: <div id="content"> <div id=&quo</div> </li> <li><a href="/article/3640.htm" title="用Rapael做图表" target="_blank">用Rapael做图表</a> <span class="text-muted">tntxia</span> <a class="tag" taget="_blank" href="/search/rap/1.htm">rap</a> <div>function drawReport(paper,attr,data){          var width = attr.width;     var height = attr.height;          var max = 0;   &nbs</div> </li> <li><a href="/article/3767.htm" title="HTML5 bootstrap2网页兼容(支持IE10以下)" target="_blank">HTML5 bootstrap2网页兼容(支持IE10以下)</a> <span class="text-muted">xiaoluode</span> <a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/bootstrap/1.htm">bootstrap</a> <div><!DOCTYPE html> <html> <head lang="zh-CN"> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"></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>