python爬虫智能解析库详解

文章很长 请耐心阅读

什么是爬虫

爬虫是做什么的?是帮助我们来快速获取有效信息的。然而做过爬虫的人都知道,解析是个麻烦事。比如一篇新闻吧,链接是这个:
https://news.ifeng.com/c/7kQcQG2peWU,页面预览图如下:

我们需要从页面中提取出标题、发布人、发布时间、发布内容、图片等内容。一般情况下我们需要怎么办?写规则。

那么规则都有什么呢?怼正则,怼 CSS 选择器,怼 XPath。我们需要对标题、发布时间、来源等内容做规则匹配,更有甚者再需要正则表达式来辅助一下。我们可能就需要用 re、BeautifulSoup、pyquery 等库来实现内容的提取和解析。

但如果我们有成千上万个不同样式的页面怎么办呢?它们来自成千上万个站点,难道我们还需要对他们一一写规则来匹配吗?这得要多大的工作量啊。另外这些万一弄不好还会解析有问题。比如正则表达式在某些情况下匹配不了了,CSS、XPath 选择器选错位了也会出现问题。

想必大家可能见过现在的浏览器有阅读模式,比如我们把这个页面用 Safari 浏览器打开,然后开启阅读模式,看看什么效果:

页面一下子变得非常清爽,只保留了标题和需要读的内容。原先页面多余的导航栏、侧栏、评论等等的统统都被去除了。它怎么做到的?难道是有人在里面写好规则了?那当然不可能的事。其实,这里面就用到了智能化解析了。那么本篇文章,我们就来了解一下页面的智能化解析的相关知识。

智能化解析

所谓爬虫的智能化解析,顾名思义就是不再需要我们针对某一些页面来专门写提取规则了,我们可以利用一些算法来计算出来页面特定元素的位置和提取路径。比如一个页面中的一篇文章,我们可以通过算法计算出来,它的标题应该是什么,正文应该是哪部分区域,发布时间是什么等等。

其实智能化解析是非常难的一项任务,比如说你给人看一个网页的一篇文章,人可以迅速找到这篇文章的标题是什么,发布时间是什么,正文是哪一块,或者哪一块是广告位,哪一块是导航栏。但给机器来识别的话,它面临的是什么?仅仅是一系列的 HTML 代码而已。那究竟机器是怎么做到智能化提取的呢?其实这里面融合了多方面的信息。

比如标题。一般它的字号是比较大的,而且长度不长,位置一般都在页面上方,而且大部分情况下它应该和 title 标签里的内容是一致的。

比如正文。它的内容一般是最多的,而且会包含多个段落 p 或者图片 img 标签,另外它的宽度一般可能会占用到页面的三分之二区域,并且密度(字数除以标签数量)会比较大。

比如时间。不同语言的页面可能不同,但时间的格式是有限的,如 2019-02-20 或者 2019/02/20 等等,也有的可能是美式的记法,顺序不同,这些也有特定的模式可以识别。

比如广告。它的标签一般可能会带有 ads 这样的字样,另外大多数可能会处于文章底部、页面侧栏,并可能包含一些特定的外链内容。

另外还有一些特点就不再一一赘述了,这其中包含了区块位置、区块大小、区块标签、区块内容、区块疏密度等等多种特征,另外很多情况下还需要借助于视觉的特征,所以说这里面其实结合了算法计算、视觉处理、自然语言处理等各个方面的内容。如果能把这些特征综合运用起来,再经过大量的数据训练,是可以得到一个非常不错的效果的。

目前来说,智能文本提取可以分为三类:

  • 基于网页文档内容的提取方法
  • 基于 DOM 结构信息的提取方法
  • 基于视觉信息的提取方法
业界进展

未来的话,页面也会越来越多,页面的渲染方式也会发生很大的变化,爬虫也会越来越难做,智能化爬虫也将会变得越来越重要。

目前工业界,其实已经有落地的算法应用了。经过我的一番调研,目前发现有这么几种算法或者服务对页面的智能化解析做的比较好:

  • Diffbot,国外的一家专门来做智能化解析服务的公司,https://www.diffbot.com

  • Boilerpipe,Java 语言编写的一个页面解析算法,https://github.com/kohlschutter/boilerpipe

  • Embedly,提供页面解析服务的公司,https://embed.ly/extract

  • Readability,是一个页面解析算法,但现在官方的服务已经关闭了,https://www.readability.com/

  • Mercury,Readability 的替代品,https://mercury.postlight.com/

  • Goose,Java 语音编写的页面解析算法,https://github.com/GravityLabs/goose

那么这几种算法或者服务到底哪些好呢,Driffbot 官方曾做过一个对比评测,使用 Google 新闻的一些文章,使用不同的算法依次摘出其中的标题和文本,然后与真实标注的内容进行比较,比较的指标就是文字的准确率和召回率,以及根据二者计算出的 F1 分数。

其结果对比如下:
python爬虫智能解析库详解_第1张图片
经过对比我们可以发现,Diffbot 的准确率和召回率都独占鳌头,其中的 F1 值达到了 0.97,可以说准确率非常高了。另外接下来比较厉害的就是 Boilerpipe 和 Readability,Goose 的表现则非常差,F1 跟其他的算法差了一大截。下面是几个算法的 F1 分数对比情况:
python爬虫智能解析库详解_第2张图片
有人可能好奇为什么 Diffbot 这么厉害?我也查询了一番。Diffbot 自 2010 年以来就致力于提取 Web 页面数据,并提供许多 API 来自动解析各种页面。其中他们的算法依赖于自然语言技术、机器学习、计算机视觉、标记检查等多种算法,并且所有的页面都会考虑到当前页面的样式以及可视化布局,另外还会分析其中包含的图像内容、CSS 甚至 Ajax 请求。另外在计算一个区块的置信度时还考虑到了和其他区块的关联关系,基于周围的标记来计算每个区块的置信度。

总之,Diffbot 也是一直致力于这一方面的服务,整个 Diffbot 就是页面解析起家的,现在也一直专注于页面解析服务,准确率高也就不足为怪了。

但它们的算法开源了吗?很遗憾,并没有,而且我也没有找到相关的论文介绍它们自己的具体算法。

所以,如果想实现这么好的效果,那就使用它们家的服务就好了。

Diffbot 页面解析

首先我们需要注册一个账号,它有 15 天的免费试用,注册之后会获得一个 Developer Token,这就是使用 Diffbot 接口服务的凭证。

接下来切换到它的测试页面中,链接为:https://www.diffbot.com/dev/home/,我们来测试一下它的解析效果到底是怎样的。

这里我们选择的测试页面就是上文所述的页面,链接为:https://news.ifeng.com/c/7kQcQG2peWU,API 类型选择 Article API,然后点击 Test Drive 按钮,接下来它就会出现当前页面的解析结果:
python爬虫智能解析库详解_第3张图片
这时候我们可以看到,它帮我们提取出来了标题、发布时间、发布机构、发布机构链接、正文内容等等各种结果。而且目前来看都十分正确,时间也自动识别之后做了转码,是一个标准的时间格式。

接下来我们继续下滑,查看还有什么其他的字段,这里我们还可以看到有 html 字段,它和 text 不同的是,它包含了文章内容的真实 HTML 代码,因此图片也会包含在里面,如图所示:
python爬虫智能解析库详解_第4张图片
另外最后面还有 images 字段,他以列表形式返回了文章套图及每一张图的链接,另外还有文章的站点名称、页面所用语言等等结果,如图所示:
python爬虫智能解析库详解_第5张图片
当然我们也可以选择 JSON 格式的返回结果,其内容会更加丰富,例如图片还返回了其宽度、高度、图片描述等等内容,另外还有各种其他的结果如面包屑导航等等结果,如图所示:

python爬虫智能解析库详解_第6张图片
经过手工核对,发现其返回的结果都是完全正确的,准确率相当之高!

所以说,如果你对准确率要求没有那么非常非常严苛的情况下,使用 Diffbot 的服务可以帮助我们快速地提取页面中所需的结果,省去了我们绝大多数的手工劳动,可以说是非常赞了。

但是,我们也不能总在网页上这么试吧。其实 Diffbot 也提供了官方的 API 文档,让我们来一探究竟。

Diffbot API

Driffbot 提供了多种 API,如 Analyze API、Article API、Disscussion API 等。

下面我们以 Article API 为例来说明一下它的用法,其官方文档地址为:https://www.diffbot.com/dev/docs/article/,API 调用地址为:

https://api.diffbot.com/v3/article

我们可以用 GET 方式来进行请求,其中的 Token 和 URL 都可以以参数形式传递给这个 API,其必备的参数有:

  • token:即 Developer Token

  • url:即要解析的 URL 链接

另外它还有几个可选参数:

  • fields:用来指定返回哪些字段,默认已经有了一些固定字段,这个参数可以指定还可以额外返回哪些可选字段

  • paging:如果是多页文章的话,如果将这个参数设置为 false 则可以禁止多页内容拼接

  • maxTags:可以设置返回的 Tag 最大数量,默认是 10 个

  • tagConfidence:设置置信度的阈值,超过这个值的 Tag 才会被返回,默认是 0.5

  • discussion:如果将这个参数设置为 false,那么就不会解析评论内容

  • timeout:在解析的时候等待的最长时间,默认是 30 秒

  • callback:为 JSONP 类型的请求而设计的回调

这里大家可能关注的就是 fields 字段了,在这里我专门做了一下梳理,首先是一些固定字段:

  • type:文本的类型,这里就是 article 了

  • title:文章的标题

  • text:文章的纯文本内容,如果是分段内容,那么其中会以换行符来分隔

  • html:提取结果的 HTML 内容

  • date:文章的发布时间,其格式为 RFC 1123

  • estimatedDate:如果日期时间不太明确,会返回一个预估的时间,如果文章超过两天或者没有发布日期,那么这个字段就不会返回

  • author:作者

  • authorUrl:作者的链接

  • discussion:评论内容,和 Disscussion API 返回结果一样

  • humanLanguage:语言类型,如英文还是中文等

  • numPages:如果文章是多页的,这个参数会控制最大的翻页拼接数目

  • nextPages:如果文章是多页的,这个参数可以指定文章后续链接

  • siteName:站点名称

  • publisherRegion:文章发布地区

  • publisherCountry:文章发布国家

  • pageUrl:文章链接

  • resolvedPageUrl:如果文章是从 pageUrl 重定向过来的,则返回此内容

  • tags:文章的标签或者文章包含的实体,根据自然语言处理技术和 DBpedia 计算生成,是一个列表,里面又包含了子字段:

  • label:标签名

  • count:标签出现的次数

  • score:标签置信度

  • rdfTypes:如果实体可以由多个资源表示,那么则返回相关的 URL

  • type:类型

  • uri:Diffbot Knowledge Graph 中的实体链接

  • images:文章中包含的图片

  • videos:文章中包含的视频

  • breadcrumb:面包屑导航信息

  • diffbotUri:Diffbot 内部的 URL 链接

以上的预定字段就是如果可以返回那就会返回的字段,是不能定制化配置的,另外我们还可以通过 fields 参数来指定扩展如下可选字段:

  • quotes:引用信息

  • sentiment:文章的情感值,-1 到 1 之间

  • links:所有超链接的顶级链接

  • querystring:请求的参数列表

好,以上便是这个 API 的用法,大家可以申请之后使用这个 API 来做智能化解析了。

下面我们用一个实例来看一下这个 API 的用法,代码如下:

import requests, json

url = 'https://api.diffbot.com/v3/article'
params = {
    'token': '77b41f6fbb24495113d52836528fa',
    'url': 'https://news.ifeng.com/c/7kQcQG2peWU',
    'fields': 'meta' 
}
response = requests.get(url, params=params)
print(json.dumps(response.json(), indent=2, ensure_ascii=False))

这里首先定义了 API 的链接,然后指定了 params 参数,即 GET 请求参数。

参数中包含了必选的 token、url 字段,也设置了可选的 fields 字段,其中 fields 为可选的扩展字段 meta 标签。

我们来看下运行结果,结果如下:

{
  "request": {
    "pageUrl": "https://news.ifeng.com/c/7kQcQG2peWU",
    "api": "article",
    "fields": "sentiment, meta",
    "version": 3
  },
  "objects": [
    {
      "date": "Wed, 20 Feb 2019 02:26:00 GMT",
      "images": [
        {
          "naturalHeight": 460,
          "width": 640,
          "diffbotUri": "image|3|-1139316034",
          "url": "http://e0.ifengimg.com/02/2019/0219/1731DC8A29EB2219C7F2773CF9CF319B3503D0A1_size382_w690_h460.png",
          "naturalWidth": 690,
          "primary": true,
          "height": 426
        },
        // ...
      ],
      "author": "中国新闻网",
      "estimatedDate": "Wed, 20 Feb 2019 06:47:52 GMT",
      "diffbotUri": "article|3|1591137208",
      "siteName": "ifeng.com",
      "type": "article",
      "title": "故宫,你低调点!故宫:不,实力已不允许我继续低调",
      "breadcrumb": [
        {
          "link": "https://news.ifeng.com/",
          "name": "资讯"
        },
        {
          "link": "https://news.ifeng.com/shanklist/3-35197-/",
          "name": "大陆"
        }
      ],
      "humanLanguage": "zh",
      "meta": {
        "og": {
          "og:time ": "2019-02-20 02:26:00",
          "og:image": "https://e0.ifengimg.com/02/2019/0219/1731DC8A29EB2219C7F2773CF9CF319B3503D0A1_size382_w690_h460.png",
          "og:category ": "凤凰资讯",
          "og: webtype": "news",
          "og:title": "故宫,你低调点!故宫:不,实力已不允许我继续低调",
          "og:url": "https://news.ifeng.com/c/7kQcQG2peWU",
          "og:description": "  “我的名字叫紫禁城,快要600岁了,这上元的夜啊,总是让我沉醉,这么久了却从未停止。”   “重"
        },
        "referrer": "always",
        "description": "  “我的名字叫紫禁城,快要600岁了,这上元的夜啊,总是让我沉醉,这么久了却从未停止。”   “重",
        "keywords": "故宫 紫禁城 故宫博物院 灯光 元宵节 博物馆 一票难求 元之 中新社 午门 杜洋 藏品 文化 皇帝 清明上河图 元宵 千里江山图卷 中英北京条约 中法北京条约 天津条约",
        "title": "故宫,你低调点!故宫:不,实力已不允许我继续低调_凤凰资讯"
      },
      "authorUrl": "https://feng.ifeng.com/author/308904",
      "pageUrl": "https://news.ifeng.com/c/7kQcQG2peWU",
      "html": "

“我的名字叫紫禁城,快要600岁了,这上元的夜啊,总是让我沉醉,这么久了却从未停止。... ", "text": "“我的名字叫紫禁城,快要600岁了,这上元的夜啊,总是让我沉醉,这么久了却从未停止。”\n“...", "authors": [ { "name": "中国新闻网", "link": "https://feng.ifeng.com/author/308904" } ] } ] }

可见其返回了如上的内容,是一个完整的 JSON 格式,其中包含了标题、正文、发布时间等等各种内容。

可见,不需要我们配置任何提取规则,我们就可以完成页面的分析和抓取,得来全不费功夫。

下面我们来介绍两个比较基础的开源工具包 Readability 和 Newspaper 的用法,这两个包经我测试其实准确率并不是很好,主要是让大家大致对智能解析有初步的理解。后面还会介绍一些更加强大的智能化解析算法。

Readability

Readability 实际上是一个算法,并不是一个针对某个语言的库。其主要原理就是计算了 DOM 的文本密度,另外根据一些常见的 DOM 属性如 id、class 等计算了一些 DOM 的权重,最后分析得到了对应的 DOM 区块,进而提取出具体的文本内容。

现在搜索 Readability 其实已经找不到了,取而代之的是一个 JavaScript 工具包,叫做 mercury-parser,据我所知应该是 Readability 不维护了,换成了 mercury-parser。后者现在也做成了一个 Chrome 插件,大家可以下载使用一下。

回归正题,这次主要介绍的是 Python 的 Readability 实现,现在其实有很多开源版本,本文选取的是 https://github.com/buriy/python-readability,是基于最早的 Python 版本的 Readability 库 https://github.com/timbertson/python-readability 二次开发的,现在已经发布到了 PyPi,大家可以直接下载安装使用。

安装很简单,通过 pip 安装即可:

pip3 install readability-lxml

安装好了之后便可以通过导入 readability 使用了,下面我们随便从网上找一个新闻页面,比如:https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html,其页面截图如下:

python爬虫智能解析库详解_第7张图片
我们的目的就是它的正文、标题等内容。下面我们用 Readability 试一下,示例如下:

import requests
from readability import Document

url = 'https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html'
html = requests.get(url).content
doc = Document(html)
print('title:', doc.title())
print('content:', doc.summary(html_partial=True))

在这里我们直接用 requests 库对网页进行了请求,获取了其 HTML 页面内容,赋值为 html。

然后引入了 readability 里的 Document 类,使用 html 变量对其进行初始化,然后我们分别调用了 title 方法和 summary 方法获得了其标题和正文内容。

这里 title 方法就是获取文章标题的,summary 就是获取文章正文的,但是它获取的正文可能包含一些 HTML 标签。这个 summary 方法可以接收一个 html_partial 参数,如果设置为 True,返回的结果则不会再带有标签。
看下运行结果:

title: 今年iPhone只有小改进?分析师:还有其他亮点_网易科技
content: <div><div class="post_text" id="endText">           
                    <p class="otitle">
                        (原标题:Apple Bets More Cameras Can Keep iPhone Humming)
                    </p>
                    <p class="f_center"><img alt="今年iPhone只有小改进?分析师:还有其他亮点" src="http://cms-bucket.ws.126.net/2019/09/09/d65ba32672934045a5bfadd27f704bc1.jpeg"/><span>图示:苹果首席执行官蒂姆·库克(Tim Cook)6月份举行的苹果全球开发者大会上。</span></p><p>网易科技讯 99日消息,据国外媒体报道,和过去的12个年头一样,新款
... 中间省略 ...
                    <p>苹果还即将推出包括电视节目和视频游戏等内容的新订阅服务。分析师表示,该公司最早可能在本周宣布TV+和Arcade等服务的价格和上线时间。</p><p>Strategy Analytics的尼尔·莫斯顿(Neil Mawston)表示,可穿戴设备和服务的结合将是苹果业务超越iPhone的关键。他说,上一家手机巨头诺基亚公司在试图进行类似业务转型时就陷入了困境之中。(辰辰)</p><p><b>相关报道:</b></p><p><a href="https://tech.163.com/19/0908/09/EOHS53RK000999LD.html" target="_self" urlmacroreplace="false">iPhone 11背部苹果Logo改为居中:为反向无线充电</a></p><p><a href="https://tech.163.com/19/0907/08/EOF60CBC00097U7S.html" target="_self" urlmacroreplace="false">2019年新iPhone传言汇总,你觉得哪些能成真</a>  </p><p/>
                        <p/>
                        <div class="ep-source cDGray">
                            <span class="left"><a href="http://tech.163.com/"><img src="https://static.ws.126.net/cnews/css13/img/end_tech.png" alt="王凤枝" class="icon"/></a> 本文来源:网易科技报道  </span>
                            <span class="ep-editor">责任编辑:王凤枝_NT2541</span>
                        </div>
                </div> 
</div>

可以看到,标题提取是正确的。正文其实也是正确的,不过这里还包含了一些 HTML 标签,比如

等,我们可以进一步通过一些解析库来解析。
看下源码吧,比如提取标题的方法:

def normalize_entities(cur_title):
    entities = {
        u'\u2014':'-',
        u'\u2013':'-',
        u'—': '-',
        u'–': '-',
        u'\u00A0': ' ',
        u'\u00AB': '"',
        u'\u00BB': '"',
        u'"': '"',
    }
    for c, r in entities.items():
        if c in cur_title:
            cur_title = cur_title.replace(c, r)

    return cur_title

def norm_title(title):
    return normalize_entities(normalize_spaces(title))

def get_title(doc):
    title = doc.find('.//title')
    if title is None or title.text is None or len(title.text) == 0:
        return '[no-title]'

    return norm_title(title.text)

 def title(self):
    """Returns document title"""
    return get_title(self._html(True))

title方法实际上就是调用了一个 get_title 方法,它怎么做的?实际上就是用了一个 XPath 只解析了</code>标签里面的内容,别的没了。如果没有,那就返回 <code>[no-title]</code>。</p> <pre><code class="prism language-py"><span class="token keyword">def</span> <span class="token function">summary</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> html_partial<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">)</span><span class="token punctuation">:</span> ruthless <span class="token operator">=</span> <span class="token boolean">True</span> <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span> self<span class="token punctuation">.</span>_html<span class="token punctuation">(</span><span class="token boolean">True</span><span class="token punctuation">)</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> self<span class="token punctuation">.</span>tags<span class="token punctuation">(</span>self<span class="token punctuation">.</span>html<span class="token punctuation">,</span> <span class="token string">'script'</span><span class="token punctuation">,</span> <span class="token string">'style'</span><span class="token punctuation">)</span><span class="token punctuation">:</span> i<span class="token punctuation">.</span>drop_tree<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> self<span class="token punctuation">.</span>tags<span class="token punctuation">(</span>self<span class="token punctuation">.</span>html<span class="token punctuation">,</span> <span class="token string">'body'</span><span class="token punctuation">)</span><span class="token punctuation">:</span> i<span class="token punctuation">.</span><span class="token builtin">set</span><span class="token punctuation">(</span><span class="token string">'id'</span><span class="token punctuation">,</span> <span class="token string">'readabilityBody'</span><span class="token punctuation">)</span> <span class="token keyword">if</span> ruthless<span class="token punctuation">:</span> self<span class="token punctuation">.</span>remove_unlikely_candidates<span class="token punctuation">(</span><span class="token punctuation">)</span> self<span class="token punctuation">.</span>transform_misused_divs_into_paragraphs<span class="token punctuation">(</span><span class="token punctuation">)</span> candidates <span class="token operator">=</span> self<span class="token punctuation">.</span>score_paragraphs<span class="token punctuation">(</span><span class="token punctuation">)</span> best_candidate <span class="token operator">=</span> self<span class="token punctuation">.</span>select_best_candidate<span class="token punctuation">(</span>candidates<span class="token punctuation">)</span> <span class="token keyword">if</span> best_candidate<span class="token punctuation">:</span> article <span class="token operator">=</span> self<span class="token punctuation">.</span>get_article<span class="token punctuation">(</span>candidates<span class="token punctuation">,</span> best_candidate<span class="token punctuation">,</span> html_partial<span class="token operator">=</span>html_partial<span class="token punctuation">)</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token keyword">if</span> ruthless<span class="token punctuation">:</span> ruthless <span class="token operator">=</span> <span class="token boolean">False</span> <span class="token keyword">continue</span> <span class="token keyword">else</span><span class="token punctuation">:</span> article <span class="token operator">=</span> self<span class="token punctuation">.</span>html<span class="token punctuation">.</span>find<span class="token punctuation">(</span><span class="token string">'body'</span><span class="token punctuation">)</span> <span class="token keyword">if</span> article <span class="token keyword">is</span> <span class="token boolean">None</span><span class="token punctuation">:</span> article <span class="token operator">=</span> self<span class="token punctuation">.</span>html cleaned_article <span class="token operator">=</span> self<span class="token punctuation">.</span>sanitize<span class="token punctuation">(</span>article<span class="token punctuation">,</span> candidates<span class="token punctuation">)</span> article_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>cleaned_article <span class="token operator">or</span> <span class="token string">''</span><span class="token punctuation">)</span> retry_length <span class="token operator">=</span> self<span class="token punctuation">.</span>retry_length of_acceptable_length <span class="token operator">=</span> article_length <span class="token operator">>=</span> retry_length <span class="token keyword">if</span> ruthless <span class="token operator">and</span> <span class="token operator">not</span> of_acceptable_length<span class="token punctuation">:</span> ruthless <span class="token operator">=</span> <span class="token boolean">False</span> <span class="token keyword">continue</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token keyword">return</span> cleaned_article </code></pre> <p>这里我删除了一些冗余的调试的代码,只保留了核心的代码,其核心实现就是先去除一些干扰内容,然后找出一些疑似正文的 candidates,然后再去寻找最佳匹配的 candidates 最后提取其内容返回即可。</p> <p>然后再找到获取 candidates 方法里面的 score_paragraphs 方法,又追踪到一个 score_node 方法,就是为每一个节点打分的,其实现如下:</p> <pre><code class="prism language-py"><span class="token keyword">def</span> <span class="token function">score_node</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> elem<span class="token punctuation">)</span><span class="token punctuation">:</span> content_score <span class="token operator">=</span> self<span class="token punctuation">.</span>class_weight<span class="token punctuation">(</span>elem<span class="token punctuation">)</span> name <span class="token operator">=</span> elem<span class="token punctuation">.</span>tag<span class="token punctuation">.</span>lower<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> name <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token string">"div"</span><span class="token punctuation">,</span> <span class="token string">"article"</span><span class="token punctuation">]</span><span class="token punctuation">:</span> content_score <span class="token operator">+=</span> <span class="token number">5</span> <span class="token keyword">elif</span> name <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token string">"pre"</span><span class="token punctuation">,</span> <span class="token string">"td"</span><span class="token punctuation">,</span> <span class="token string">"blockquote"</span><span class="token punctuation">]</span><span class="token punctuation">:</span> content_score <span class="token operator">+=</span> <span class="token number">3</span> <span class="token keyword">elif</span> name <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token string">"address"</span><span class="token punctuation">,</span> <span class="token string">"ol"</span><span class="token punctuation">,</span> <span class="token string">"ul"</span><span class="token punctuation">,</span> <span class="token string">"dl"</span><span class="token punctuation">,</span> <span class="token string">"dd"</span><span class="token punctuation">,</span> <span class="token string">"dt"</span><span class="token punctuation">,</span> <span class="token string">"li"</span><span class="token punctuation">,</span> <span class="token string">"form"</span><span class="token punctuation">,</span> <span class="token string">"aside"</span><span class="token punctuation">]</span><span class="token punctuation">:</span> content_score <span class="token operator">-=</span> <span class="token number">3</span> <span class="token keyword">elif</span> name <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token string">"h1"</span><span class="token punctuation">,</span> <span class="token string">"h2"</span><span class="token punctuation">,</span> <span class="token string">"h3"</span><span class="token punctuation">,</span> <span class="token string">"h4"</span><span class="token punctuation">,</span> <span class="token string">"h5"</span><span class="token punctuation">,</span> <span class="token string">"h6"</span><span class="token punctuation">,</span> <span class="token string">"th"</span><span class="token punctuation">,</span> <span class="token string">"header"</span><span class="token punctuation">,</span> <span class="token string">"footer"</span><span class="token punctuation">,</span> <span class="token string">"nav"</span><span class="token punctuation">]</span><span class="token punctuation">:</span> content_score <span class="token operator">-=</span> <span class="token number">5</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> <span class="token string">'content_score'</span><span class="token punctuation">:</span> content_score<span class="token punctuation">,</span> <span class="token string">'elem'</span><span class="token punctuation">:</span> elem <span class="token punctuation">}</span> </code></pre> <p>这什么意思呢?你看如果这个节点标签是 div 或者 article 等可能表征正文区块的话,就加 5 分,如果是 aside 等表示侧栏的内容就减 3 分。这些打分也没有什么非常标准的依据,可能是根据经验累积的规则。</p> <p>另外还有一些方法里面引用了一些正则匹配来进行打分或者替换,其定义如下:</p> <pre><code class="prism language-py">REGEXES <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">'unlikelyCandidatesRe'</span><span class="token punctuation">:</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span><span class="token string">'combx|comment|community|disqus|extra|foot|header|menu|remark|rss|shoutbox|sidebar|sponsor|ad-break|agegate|pagination|pager|popup|tweet|twitter'</span><span class="token punctuation">,</span> re<span class="token punctuation">.</span>I<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'okMaybeItsACandidateRe'</span><span class="token punctuation">:</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span><span class="token string">'and|article|body|column|main|shadow'</span><span class="token punctuation">,</span> re<span class="token punctuation">.</span>I<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'positiveRe'</span><span class="token punctuation">:</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span><span class="token string">'article|body|content|entry|hentry|main|page|pagination|post|text|blog|story'</span><span class="token punctuation">,</span> re<span class="token punctuation">.</span>I<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'negativeRe'</span><span class="token punctuation">:</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span><span class="token string">'combx|comment|com-|contact|foot|footer|footnote|masthead|media|meta|outbrain|promo|related|scroll|shoutbox|sidebar|sponsor|shopping|tags|tool|widget'</span><span class="token punctuation">,</span> re<span class="token punctuation">.</span>I<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'divToPElementsRe'</span><span class="token punctuation">:</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span><span class="token string">'<(a|blockquote|dl|div|img|ol|p|pre|table|ul)'</span><span class="token punctuation">,</span> re<span class="token punctuation">.</span>I<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">#'replaceBrsRe': re.compile('(<br[^>]*>[ \n\r\t]*){2,}',re.I),</span> <span class="token comment">#'replaceFontsRe': re.compile('<(\/?)font[^>]*>',re.I),</span> <span class="token comment">#'trimRe': re.compile('^\s+|\s+$/'),</span> <span class="token comment">#'normalizeRe': re.compile('\s{2,}/'),</span> <span class="token comment">#'killBreaksRe': re.compile('(<br\s*\/?>(\s| ?)*){1,}/'),</span> <span class="token string">'videoRe'</span><span class="token punctuation">:</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span><span class="token string">'https?:\/\/(www\.)?(youtube|vimeo)\.com'</span><span class="token punctuation">,</span> re<span class="token punctuation">.</span>I<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">#skipFootnoteLink: /^\s*(\[?[a-z0-9]{1,2}\]?|^|edit|citation needed)\s*$/i,</span> <span class="token punctuation">}</span> </code></pre> <p>比如这里定义了 unlikelyCandidatesRe,就是不像 candidates 的 pattern,比如 foot、comment 等等,碰到这样的标签或 pattern 的话,在计算分数的时候都会减分,另外还有其他的 positiveRe、negativeRe 也是一样的原理,分别对匹配到的内容进行加分或者减分。</p> <p>这就是 Readability 的原理,是基于一些规则匹配的打分模型,很多规则其实来源于经验的累积,分数的计算规则应该也是不断地调优得出来的。</p> <p>另外其他的就没了,Readability 并没有提供提取时间、作者的方法,另外此种方法的准确率也是有限的,但多少还是省去了一些人工成本。</p> <h5>Newspaper</h5> <p>另外还有一个智能解析的库,叫做 Newspaper,提供的功能更强一些,但是准确率上个人感觉和 Readability 差不太多。</p> <p>这个库分为 Python2 和 Python3 两个版本,Python2 下的版本叫做 newspaper,Python3 下的版本叫做 newspaper3k,这里我们使用 Python3 版本来进行测试。</p> <p>其 GitHub 地址是:https://github.com/codelucas/newspaper,官方文档地址是:https://newspaper.readthedocs.io。</p> <p>在安装之前需要安装一些依赖库,可以参考官方的说明:https://github.com/codelucas/newspaper#get-it-now。</p> <p>安装好必要的依赖库之后,就可以使用 pip 安装了:</p> <pre><code class="prism language-py">pip3 install newspaper3k </code></pre> <p>安装成功之后便可以导入使用了。</p> <p>下面我们先用官方提供的实例来过一遍它的用法,官方提供的示例是使用了这个链接:https://fox13now.com/2013/12/30/new-year-new-laws-obamacare-pot-guns-and-drones/,其页面截图如下:</p> <p><a href="http://img.e-com-net.com/image/info8/f57543cd56694cf7b610d80c77210bb9.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/f57543cd56694cf7b610d80c77210bb9.jpg" alt="python爬虫智能解析库详解_第8张图片" width="650" height="406" style="border:1px solid black;"></a><br> 下面用一个实例来感受一下:</p> <pre><code class="prism language-py"><span class="token keyword">from</span> newspaper <span class="token keyword">import</span> Article url <span class="token operator">=</span> <span class="token string">'https://fox13now.com/2013/12/30/new-year-new-laws-obamacare-pot-guns-and-drones/'</span> article <span class="token operator">=</span> Article<span class="token punctuation">(</span>url<span class="token punctuation">)</span> article<span class="token punctuation">.</span>download<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># print('html:', article.html)</span> article<span class="token punctuation">.</span>parse<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'authors:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>authors<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'date:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>publish_date<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'text:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>text<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'top image:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>top_image<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'movies:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>movies<span class="token punctuation">)</span> article<span class="token punctuation">.</span>nlp<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'keywords:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>keywords<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'summary:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>summary<span class="token punctuation">)</span> </code></pre> <p>这里从 newspaper 库里面先导入了 Article 这个类,然后直接传入 url 即可,首先需要调用它的 download 方法,将网页爬取下来,否则直接进行解析会抛出错误的。</p> <p>好的,然后我们再执行 parse 方法进行网页的智能解析,这个功能就比较全了,能解析 authors、publish_date、text 等等,除了正文还能解析作者、发布时间等等。</p> <p>另外这个库还提供了一些 NLP 的方法,比如获取关键词、获取文本摘要等等,在使用前需要先执行以下 nlp 方法。</p> <p>最后运行结果如下:</p> <pre><code class="prism language-py">authors<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'Cnn Wire'</span><span class="token punctuation">]</span> date<span class="token punctuation">:</span> <span class="token number">2013</span><span class="token operator">-</span><span class="token number">12</span><span class="token operator">-</span><span class="token number">30</span> <span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span> text<span class="token punctuation">:</span> By Leigh Ann Caldwell WASHINGTON <span class="token punctuation">(</span>CNN<span class="token punctuation">)</span> — Not everyone subscribes to a New Year’s resolution<span class="token punctuation">,</span> but Americans will be required to follow new laws <span class="token keyword">in</span> <span class="token number">2014</span><span class="token punctuation">.</span> Some <span class="token number">40</span><span class="token punctuation">,</span><span class="token number">000</span> measures taking effect <span class="token builtin">range</span> <span class="token keyword">from</span> sweeping<span class="token punctuation">,</span> national mandates under Obamacare to marijuana legalization <span class="token keyword">in</span> Colorado<span class="token punctuation">,</span> drone prohibition <span class="token keyword">in</span> Illinois <span class="token operator">and</span> transgender protections <span class="token keyword">in</span> California<span class="token punctuation">.</span> Although many new laws are controversial<span class="token punctuation">,</span> they made it through legislatures<span class="token punctuation">,</span> public referendum <span class="token operator">or</span> city councils <span class="token operator">and</span> represent the shifting composition of American beliefs<span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Colorado<span class="token punctuation">:</span> Marijuana becomes legal <span class="token keyword">in</span> the state <span class="token keyword">for</span> buyers over <span class="token number">21</span> at a licensed retail dispensary<span class="token punctuation">.</span> <span class="token punctuation">(</span>Sourcing<span class="token punctuation">:</span> much of this <span class="token builtin">list</span> was obtained <span class="token keyword">from</span> the National Conference of State Legislatures<span class="token punctuation">)</span><span class="token punctuation">.</span> top image<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token operator">//</span>localtvkstu<span class="token punctuation">.</span>files<span class="token punctuation">.</span>wordpress<span class="token punctuation">.</span>com<span class="token operator">/</span><span class="token number">2012</span><span class="token operator">/</span><span class="token number">04</span><span class="token operator">/</span>national<span class="token operator">-</span>news<span class="token operator">-</span>e1486938949489<span class="token punctuation">.</span>jpg?quality<span class="token operator">=</span><span class="token number">85</span><span class="token operator">&</span>strip<span class="token operator">=</span><span class="token builtin">all</span> movies<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> keywords<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'drones'</span><span class="token punctuation">,</span> <span class="token string">'national'</span><span class="token punctuation">,</span> <span class="token string">'guns'</span><span class="token punctuation">,</span> <span class="token string">'wage'</span><span class="token punctuation">,</span> <span class="token string">'law'</span><span class="token punctuation">,</span> <span class="token string">'pot'</span><span class="token punctuation">,</span> <span class="token string">'leave'</span><span class="token punctuation">,</span> <span class="token string">'family'</span><span class="token punctuation">,</span> <span class="token string">'states'</span><span class="token punctuation">,</span> <span class="token string">'state'</span><span class="token punctuation">,</span> <span class="token string">'latest'</span><span class="token punctuation">,</span> <span class="token string">'obamacare'</span><span class="token punctuation">,</span> <span class="token string">'minimum'</span><span class="token punctuation">,</span> <span class="token string">'laws'</span><span class="token punctuation">]</span> summary<span class="token punctuation">:</span> Oregon<span class="token punctuation">:</span> Family leave <span class="token keyword">in</span> Oregon has been expanded to allow eligible employees two weeks of paid leave to handle the death of a family member<span class="token punctuation">.</span> Arkansas<span class="token punctuation">:</span> The state becomes the latest state requiring voters show a picture ID at the voting booth<span class="token punctuation">.</span> Minimum wage <span class="token operator">and</span> former felon employmentWorkers <span class="token keyword">in</span> <span class="token number">13</span> states <span class="token operator">and</span> four cities will see increases to the minimum wage<span class="token punctuation">.</span> New Jersey residents voted to <span class="token keyword">raise</span> the state’s minimum wage by $<span class="token number">1</span> to $<span class="token number">8.25</span> per hour<span class="token punctuation">.</span> California <span class="token keyword">is</span> also raising its minimum wage to $<span class="token number">9</span> per hour<span class="token punctuation">,</span> but workers must wait until July to see the addition<span class="token punctuation">.</span> </code></pre> <p>这里省略了一些输出结果。</p> <p>可以看到作者、日期、正文、关键词、标签、缩略图等信息都被打印出来了,还算是不错的。</p> <p>但这个毕竟是官方的实例,肯定是好的,我们再测试一下刚才的例子,看看效果如何,网址还是:https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html,改写代码如下:</p> <pre><code class="prism language-py"><span class="token keyword">from</span> newspaper <span class="token keyword">import</span> Article url <span class="token operator">=</span> <span class="token string">'https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html'</span> article <span class="token operator">=</span> Article<span class="token punctuation">(</span>url<span class="token punctuation">,</span> language<span class="token operator">=</span><span class="token string">'zh'</span><span class="token punctuation">)</span> article<span class="token punctuation">.</span>download<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># print('html:', article.html)</span> article<span class="token punctuation">.</span>parse<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'authors:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>authors<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'title:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>title<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'date:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>publish_date<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'text:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>text<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'top image:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>top_image<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'movies:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>movies<span class="token punctuation">)</span> article<span class="token punctuation">.</span>nlp<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'keywords:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>keywords<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'summary:'</span><span class="token punctuation">,</span> article<span class="token punctuation">.</span>summary<span class="token punctuation">)</span> </code></pre> <p>这里我们将链接换成了新闻的链接,另外在 Article 初始化的时候还加了一个参数 language,其值为 zh,代表中文。</p> <p>然后我们看下运行结果:</p> <pre><code class="prism language-py">Building prefix <span class="token builtin">dict</span> <span class="token keyword">from</span> <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>lib<span class="token operator">/</span>python3<span class="token punctuation">.</span><span class="token number">7</span><span class="token operator">/</span>site<span class="token operator">-</span>packages<span class="token operator">/</span>jieba<span class="token operator">/</span><span class="token builtin">dict</span><span class="token punctuation">.</span>txt <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Dumping model to <span class="token builtin">file</span> cache <span class="token operator">/</span>var<span class="token operator">/</span>folders<span class="token operator">/</span>1g<span class="token operator">/</span>l2xlw12x6rncs2p9kh5swpmw0000gn<span class="token operator">/</span>T<span class="token operator">/</span>jieba<span class="token punctuation">.</span>cache Loading model cost <span class="token number">1.7178938388824463</span> seconds<span class="token punctuation">.</span> Prefix <span class="token builtin">dict</span> has been built succesfully<span class="token punctuation">.</span> authors<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> title<span class="token punctuation">:</span> 今年iPhone只有小改进?分析师:还有其他亮点 date<span class="token punctuation">:</span> <span class="token number">2019</span><span class="token operator">-</span><span class="token number">09</span><span class="token operator">-</span><span class="token number">09</span> <span class="token number">08</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">:</span><span class="token number">26</span><span class="token operator">+</span><span class="token number">08</span><span class="token punctuation">:</span><span class="token number">00</span> text<span class="token punctuation">:</span> (原标题:Apple Bets More Cameras Can Keep iPhone Humming) 图示:苹果首席执行官蒂姆·库克<span class="token punctuation">(</span>Tim Cook<span class="token punctuation">)</span>在<span class="token number">6</span>月份举行的苹果全球开发者大会上。 网易科技讯 <span class="token number">9</span>月<span class="token number">9</span>日消息,据国外媒体报道,和过去的<span class="token number">12</span>个年头一样,新款iPhone将成为苹果公司本周所举行年度宣传活动的主角。但人们的注意力正转向需要推动增长的其他苹果产品和服务。 <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Strategy Analytics的尼尔·莫斯顿<span class="token punctuation">(</span>Neil Mawston<span class="token punctuation">)</span>表示,可穿戴设备和服务的结合将是苹果业务超越iPhone的关键。他说,上一家手机巨头诺基亚公司在试图进行类似业务转型时就陷入了困境之中。(辰辰) 相关报道: iPhone <span class="token number">11</span>背部苹果Logo改为居中:为反向无线充电 <span class="token number">2019</span>年新iPhone传言汇总,你觉得哪些能成真 top image<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token operator">//</span>www<span class="token punctuation">.</span><span class="token number">163.</span>com<span class="token operator">/</span>favicon<span class="token punctuation">.</span>ico movies<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> keywords<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'trust高级投资组合经理丹摩根dan'</span><span class="token punctuation">,</span> <span class="token string">'iphone'</span><span class="token punctuation">,</span> <span class="token string">'mawston表示可穿戴设备和服务的结合将是苹果业务超越iphone的关键他说上一家手机巨头诺基亚公司在试图进行类似业务转型时就陷入了困境之中辰辰相关报道iphone'</span><span class="token punctuation">,</span> <span class="token string">'xs的销售疲软状况迫使苹果在1月份下调了业绩预期这是逾15年来的第一次据贸易公司susquehanna'</span><span class="token punctuation">,</span> <span class="token string">'xs机型发布后那种令人失望的业绩重演iphone'</span><span class="token punctuation">,</span> <span class="token string">'今年iphone只有小改进分析师还有其他亮点'</span><span class="token punctuation">,</span> <span class="token string">'more'</span><span class="token punctuation">,</span> <span class="token string">'xr和iphone'</span><span class="token punctuation">,</span> <span class="token string">'morgan说他们现在没有任何真正深入的进展只是想继续让iphone这款业务继续转下去他乐观地认为今年发布的新款手机将有足够多的新功能为一个非常成熟的产品增加额外的功能让火车继续前进这种仅限于此的态度说明了苹果自2007年发布首款iphone以来所面临的挑战iphone销售占苹果公司总营收的一半以上这让苹果陷入了一个尴尬的境地既要维持核心产品的销量另一方面又需要减少对它的依赖瑞银ubs今年5月份对8000名智能手机用户进行了相关调查其发布的年度全球调查报告显示最近iphone在人脸识别技术等方面的进步并没有引起一些消费者的共鸣他们基本上都认为苹果产品没有过去几年那么独特或者惊艳品牌也没有过去几年那么有吸引力很多人使用老款手机的时间更长自己认为也没有必要升级到平均售价949美元的新款iphone苹果需要在明年销售足够多的iphone以避免像去年9月份iphone'</span><span class="token punctuation">,</span> <span class="token string">'keep'</span><span class="token punctuation">,</span> <span class="token string">'原标题apple'</span><span class="token punctuation">]</span> summary<span class="token punctuation">:</span> (原标题:Apple Bets More Cameras Can Keep iPhone Humming)图示:苹果首席执行官蒂姆·库克<span class="token punctuation">(</span>Tim Cook<span class="token punctuation">)</span>在<span class="token number">6</span>月份举行的苹果全球开发者大会上。网易科技讯 <span class="token number">9</span>月<span class="token number">9</span>日消息,据国外媒体报道,和过去的<span class="token number">12</span>个年头一样,新款iPhone将成为苹果公司本周所举行<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>亚公司在试图进行类似业务转型时就陷入了困境之中。(辰辰)相关报道:iPhone <span class="token number">11</span>背部苹果Logo改为居中:为反向无线充电<span class="token number">2019</span>年新iPhone传言汇总,你觉得哪些能成真 </code></pre> <p>中间正文很长省略了一部分,可以看到运行时首先加载了一些中文的库包,比如 jieba 所依赖的词表等等。</p> <p>解析结果中,日期的确是解析对了,因为这个日期格式的的确比较规整,但这里还自动给我们加了东八区的时区,贴心了。作者没有提取出来,可能是没匹配到 来源 两个字吧,或者词库里面没有,标题、正文的提取还算比较正确,也或许这个案例的确是比较简单。</p> <p>以上便是 Readability 和 Newspaper 的介绍。</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1743481349232148480"></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">你可能感兴趣的:(爬虫(urllib),python爬虫,智能解析,Readability,Newspaper,Diffbot)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1902568988026662912.htm" title="CDN与RTC(实时通信)技术" target="_blank">CDN与RTC(实时通信)技术</a> <span class="text-muted">百态老人</span> <a class="tag" taget="_blank" href="/search/%E5%AE%9E%E6%97%B6%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">实时音视频</a> <div>CDN(内容分发网络)和RTC(实时通信技术)是两种在现代互联网应用中广泛使用的技术,它们各自具有独特的特点和应用场景。CDN的特点与应用CDN通过在全球范围内部署边缘节点,将内容缓存到用户附近的服务器上,从而减少网络延迟,提高访问速度和用户体验。其主要优势包括:加速静态和动态内容的加载:通过缓存机制和智能路由,CDN可以显著提升网站和应用的响应速度。优化用户体验:通过减轻源服务器的负载,CDN能</div> </li> <li><a href="/article/1902563317617061888.htm" title="AI数字人分身系统+deepseek深层技术刨析" target="_blank">AI数字人分身系统+deepseek深层技术刨析</a> <span class="text-muted">Yxh18137784554</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%97%E4%BA%BA/1.htm">数字人</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>#数字人分身系统##ai数字人#AI数字人分身系统:解码技术源头架构,重塑数字未来**在元宇宙加速渗透、人机交互边界持续突破的今天,AI数字人分身系统正从科幻概念演变为商业与社会的核心工具。其背后,一套融合顶尖AI技术与工程化思维的技术架构,正在重新定义“数字生命”的可能性。本文将从技术源头出发,深度解析AI数字人分身系统的核心架构设计,揭示其如何实现“形神兼备”的数字化身。---一、技术云罗数字</div> </li> <li><a href="/article/1902562058092736512.htm" title="智慧交通是什么,可以帮助我们解决什么问题?" target="_blank">智慧交通是什么,可以帮助我们解决什么问题?</a> <span class="text-muted">Guheyunyi</span> <a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/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/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>智慧交通是什么?智慧交通(SmartTransportation)是指利用物联网(IoT)、大数据、人工智能(AI)、云计算、5G通信等先进技术,对交通系统进行智能化管理和优化,以提高交通效率、减少拥堵、降低事故率、提升出行体验,并实现交通资源的合理配置和可持续发展。智慧交通的核心是通过数据采集、分析和应用,实现交通系统的智能化、自动化和协同化,从而构建一个高效、安全、绿色、便捷的交通生态系统。智</div> </li> <li><a href="/article/1902561428024389632.htm" title="火山云服务器在市场中的用户占有量" target="_blank">火山云服务器在市场中的用户占有量</a> <span class="text-muted">苹果企业签名分发</span> <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%81%AB%E5%B1%B1%E5%BC%95%E6%93%8E/1.htm">火山引擎</a> <div>火山云服务器(即字节跳动旗下的火山引擎云服务)作为云计算市场的新兴参与者,其用户占有量目前尚未进入行业前列,但凭借字节跳动的技术背景和资源支持,正在逐步扩大市场渗透。以下是综合市场现状的分析:---###**1.整体市场格局**-**中国云计算市场前三**:阿里云、华为云、腾讯云占据主导地位(合计超60%份额)。-**第二梯队**:天翼云、AWS中国、百度智能云、京东云等。-**火山引擎**:属于</div> </li> <li><a href="/article/1902549318204715008.htm" title="Python获取tiktok视频数据信息 api 爬虫" target="_blank">Python获取tiktok视频数据信息 api 爬虫</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>Tiktok通过ID爬取视频信息api采集页面如图:https://www.tiktok.com/@basketwithball2.0/video/7273119444522650912?q=irving&t=1706683319923请求APIhttp://api.xxxx.com/tt/video/info?video_id=7273119444522650912&token=test请求参数</div> </li> <li><a href="/article/1902547676755456000.htm" title="新手必看——ctf六大题型介绍及六大题型解析&举例解题" target="_blank">新手必看——ctf六大题型介绍及六大题型解析&举例解题</a> <span class="text-muted">沛哥网络安全</span> <a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/udp/1.htm">udp</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a> <div>CTF(CaptureTheFlag)介绍与六大题型解析一、什么是CTF?CTF(CaptureTheFlag),意为“夺旗赛”,是一种信息安全竞赛形式,广泛应用于网络安全领域。CTF竞赛通过模拟现实中的网络安全攻防战,让参赛者以攻防对抗的形式,利用各种信息安全技术进行解决一系列安全问题,最终获得“旗帜(Flag)”来获得积分。CTF赛事一般分为两种形式:Jeopardy(解题模式):参赛者通过解</div> </li> <li><a href="/article/1902544274784841728.htm" title="C#实战:使用ZXing.NET库轻松生成二维码与条形码" target="_blank">C#实战:使用ZXing.NET库轻松生成二维码与条形码</a> <span class="text-muted">墨瑾轩</span> <a class="tag" taget="_blank" href="/search/%E4%B8%80%E8%B5%B7%E5%AD%A6%E5%AD%A6C%23%E3%80%90%E4%B8%80%E3%80%91/1.htm">一起学学C#【一】</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</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#中用于生成二维码和条形码的库——ZXing.NET,并附带一份详细的代码示例,其中每行代码均配有注释以解释其功能。ZXing.NET是基于开源项目ZXing(ZebraCrossing)的.NET移植版,它提供了生成和解析多种一维条形码和二维二维码的功能。准备工作首先,确保您已通过NuGet包管理器在项目中安装了ZXing.NET库。在VisualStudio中,可以通过以下步</div> </li> <li><a href="/article/1902542383082434560.htm" title="Node.js 中使用 RabbitMQ" target="_blank">Node.js 中使用 RabbitMQ</a> <span class="text-muted">海上彼尚</span> <a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>目录一、RabbitMQ简介二、核心概念解析三、环境搭建(以Ubuntu为例)四、Node.js实战:生产者与消费者1.安装依赖2.生产者代码(发送消息)3.消费者代码(处理消息)五、高级配置与最佳实践六、常见问题与解决方案七、总结一、RabbitMQ简介RabbitMQ是一个基于AMQP协议的开源消息代理工具,专为分布式系统设计。它通过解耦生产者和消费者实现异步通信,支持流量削峰、任务队列、服务</div> </li> <li><a href="/article/1902542130287538176.htm" title="多机器人系统感知能力和控制体系结构综述" target="_blank">多机器人系统感知能力和控制体系结构综述</a> <span class="text-muted">罗伯特之技术屋</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E4%B8%8E%E6%99%BA%E8%83%BD%E7%B3%BB%E7%BB%9F%E4%B8%93%E6%A0%8F/1.htm">人工智能与智能系统专栏</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E4%BA%BA/1.htm">机器人</a> <div>摘要:为了促进多机器人系统(multirobotsystem,MRS)的智能化、无人化发展,并提升MRS在不同工作环境中的探测能力和系统的灵活性,本文从MRS的感知能力及其控制系统架构的角度出发,深度调研并分析了MRS相关的研究与工作,重点探讨了空中、地面、水面、水下4种应用环境下的MRS感知能力与控制系统架构,并对未来的研究方向进行展望。本文的结果可对于后续MRS在感知方法和控制系统的选用上提供</div> </li> <li><a href="/article/1902540161045032960.htm" title="量子密码学技术架构解析与程序员视角" target="_blank">量子密码学技术架构解析与程序员视角</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>量子计算威胁模型分析传统公钥密码体系(RSA/ECC)的安全假设基于:大数分解问题的计算复杂度(RSA)椭圆曲线离散对数问题(ECC)有限域离散对数问题(DSA)Shor算法的时间复杂度为O((logN)^3),当量子比特数达到阈值时:2048位RSA可在8小时内破解(理论值)ECC-256的破解时间将降至多项式级别Grover算法对对称密码的影响:AES-256的有效安全性降至2^128哈希函数</div> </li> <li><a href="/article/1902540107102089216.htm" title="在线视频创作平台(Vidnami)" target="_blank">在线视频创作平台(Vidnami)</a> <span class="text-muted">deepdata_cn</span> <a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E7%94%9F%E6%88%90/1.htm">视频生成</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%89%AA%E8%BE%91/1.htm">视频剪辑</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%88%9B%E4%BD%9C/1.htm">视频创作</a> <div>Vidnami是一款功能强大的在线视频创作平台,前身为ContentSamurai,于2015年推出,2020年更名为Vidnami。它运用人工智能技术,能够分析输入的文本,自动从大量素材中选取合适的图像和视频片段,将文字快速转化为具有专业外观的视频,无需用户具备视频编辑经验。该平台提供多种视频模板、全主题定制功能以及内置的免版权媒体库,包括3000万张图片和3万首音乐,还支持自动配音,用户可以录</div> </li> <li><a href="/article/1902535442436255744.htm" title="2023年中职网络安全——SQL注入测试(PL)解析" target="_blank">2023年中职网络安全——SQL注入测试(PL)解析</a> <span class="text-muted">旺仔Sec</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E8%81%8C%E4%B8%9A%E6%8A%80%E8%83%BD%E5%A4%A7%E8%B5%9B%E4%BB%BB%E5%8A%A1%E8%A7%A3%E6%9E%90/1.htm">网络安全职业技能大赛任务解析</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E8%B7%AF%E5%AE%89%E5%85%A8/1.htm">网路安全</a> <div>SQL注入测试(PL)任务环境说明:服务器场景:Server2312服务器场景操作系统:未知(关闭链接)已知靶机存在网站系统,使用Nmap工具扫描靶机端口,并将网站服务的端口号作为Flag(形式:Flag字符串)值提交。访问网站/admin/pinglun.asp页面,此页面存在SQL注入漏洞,使用排序语句进行列数猜测,将语句作为Flag(形式:URL无空格)值提交。页面没有返回任何有用信息,尝试</div> </li> <li><a href="/article/1902533982222872576.htm" title="智能费用审核平台:赋能千行百业,重塑财务审查新生态" target="_blank">智能费用审核平台:赋能千行百业,重塑财务审查新生态</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>在数字经济浪潮席卷全球的今天,企业财务管理正经历着前所未有的变革。传统费用审核模式已难以应对日益复杂的商业环境和海量数据处理需求,低效、高错、高风险成为制约企业发展的桎梏。北京中烟创新科技有限公司(简称:中烟创新)智能费用审核平台应运而生,以技术创新重塑财务审查生态,为企业开启智能化财务管理的新纪元。这不仅是一场技术革新,更是一次管理理念的跃迁——通过AI赋能,实现从"事后纠错"到"事前预防"、从</div> </li> <li><a href="/article/1902530649613463552.htm" title="OpenCV第1课OpenCV 介绍及其树莓派下环境的搭建" target="_blank">OpenCV第1课OpenCV 介绍及其树莓派下环境的搭建</a> <span class="text-muted">嵌入式老牛</span> <a class="tag" taget="_blank" href="/search/%E6%A0%91%E8%8E%93%E6%B4%BE%E4%B9%8BOpenCV/1.htm">树莓派之OpenCV</a><a class="tag" taget="_blank" href="/search/opencv/1.htm">opencv</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a> <div>1.机器是如何“看”的我们人类可以通过眼睛看到五颜六色的世界,是因为人眼的视觉细胞中存在分别对红、绿、蓝敏感的3种细胞。其中的光感色素根据光线的不同进行不同比例的分解,从而让我们识别到各种颜色。对人工智能而言,学会“看”也是非常关键的一步。那么机器人是如何看到这个世界的呢?这就涉及到人工智能方向重要的分支--机器视觉。机器视觉即用机器人代替人眼来做测量和判断,通过机器视觉产品(即图像摄取装置,分C</div> </li> <li><a href="/article/1902530651266019328.htm" title="指针中*的位置" target="_blank">指针中*的位置</a> <span class="text-muted">闯闯爱编程</span> <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/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>1.两种常见风格风格A(靠近类型)int*p;//*靠近类型,强调"p是一个int*类型"优点:强调指针是类型的一部分,逻辑上更直观。缺点:在多变量声明时可能引发歧义(例如int*a,b;中b不是指针)。风格B(靠近变量名)int*p;//*靠近变量名,强调"*p是一个int"优点:符合语法解析规则(*属于变量名),多变量声明更清晰(例如int*a,*b;)。缺点:类型与变量名的分离可能降低可读性</div> </li> <li><a href="/article/1902530523297804288.htm" title="有了大模型为何还需要Agent智能体" target="_blank">有了大模型为何还需要Agent智能体</a> <span class="text-muted">全栈你个大西瓜</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</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/Agent/1.htm">Agent</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E4%BD%93/1.htm">智能体</a><a class="tag" taget="_blank" href="/search/Agent/1.htm">Agent</a><a class="tag" taget="_blank" href="/search/%E5%8E%9F%E7%90%86/1.htm">原理</a> <div>一、什么是Agent?Agent(智能体)是一种能感知环境、自主决策、执行动作的智能实体,当它与大语言模型(如通义千问QWen、GPT)结合时,形成一种**“增强型AI系统”**。其核心架构如下:大脑(LLM):负责语言理解、逻辑推理、知识问答等认知任务。感官(工具链):通过API、传感器或数据库获取实时数据(如天气、股价)。手脚(执行器):调用外部工具完成任务(如发送邮件、控制智能家居)。记忆(</div> </li> <li><a href="/article/1902527876058640384.htm" title="Manus详细介绍" target="_blank">Manus详细介绍</a> <span class="text-muted">accurater</span> <a class="tag" taget="_blank" href="/search/c%2B%2B%E7%AE%97%E6%B3%95%E7%AC%94%E8%AE%B0/1.htm">c++算法笔记</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/1.htm">神经网络</a> <div>第一章Manus的技术背景与核心突破初识ManusAI1.1什么是Manus?Manus是由中国团队Monica.im于2025年3月推出的全球首款通用型AI智能体(AIAgent)。其名称源自拉丁语“MensetManus”,意为“手脑并用”,强调将大模型的逻辑推理能力转化为实际生产力。与传统的对话式AI(如ChatGPT、DeepSeek)不同,Manus的核心定位是“执行型助手”,能够自主完</div> </li> <li><a href="/article/1902524222085853184.htm" title="全面解析条形码、二维码与RFID技术的区别及应用场景" target="_blank">全面解析条形码、二维码与RFID技术的区别及应用场景</a> <span class="text-muted">爱码字的小印</span> <a class="tag" taget="_blank" href="/search/%E6%9D%A1%E5%BD%A2%E7%A0%81/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>在生活中,我们常见的条形码、二维码,甚至RFID技术,早已成了日常识别的小帮手。从超市结账到包裹追踪,再到门禁通行,它们无处不在。然而,看似都能识别信息,这三者的背后其实有着各自独特的工作原理和适用场景。到底条形码、二维码和RFID有什么不同?它们各自适用于哪些行业?今天,我们就来揭开这三种技术的奥秘,帮您找到最适合自己业务的识别方案!一、条形码技术:传统而稳定的识别方式条形码(Barcode)是</div> </li> <li><a href="/article/1902523970003988480.htm" title="python、JavaScript 、JAVA等实例代码演示教你如何免费获取股票数据(实时数据、历史数据、CDMA、KDJ等指标数据)配有股票数据API接口说明文档详解参数说明" target="_blank">python、JavaScript 、JAVA等实例代码演示教你如何免费获取股票数据(实时数据、历史数据、CDMA、KDJ等指标数据)配有股票数据API接口说明文档详解参数说明</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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%82%A1%E7%A5%A8%E6%95%B0%E6%8D%AE%E6%8E%A5%E5%8F%A3/1.htm">股票数据接口</a><a class="tag" taget="_blank" href="/search/api/1.htm">api</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据中挖掘出有价值的信息,为我们的投资策略提供有力的支持。在寻找数据的过程中,我尝试了多种途径,包括自编网易股票页面爬虫、申万行业数据爬虫,以及同花</div> </li> <li><a href="/article/1902512999751544832.htm" title="打造城市二手房分析与可视化系统+聚类分析+58爬虫+线性回归" target="_blank">打造城市二手房分析与可视化系统+聚类分析+58爬虫+线性回归</a> <span class="text-muted">OverlordDuke</span> <a class="tag" taget="_blank" href="/search/%E8%81%9A%E7%B1%BB%E7%AE%97%E6%B3%95/1.htm">聚类算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96/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/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/1.htm">线性回归</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>打造城市二手房分析与可视化系统+聚类分析+58爬虫+线性回归利用数据实现全面分析数据分析与可视化功能创新的聚类分析功能结语在如今房地产市场日益复杂的背景下,对于投资者、购房者和市场分析师来说,了解市场动态并做出明智的决策至关重要。基于此,我们开发了一款基于Python的城市二手房分析与可视化系统,为用户提供了强大的工具,帮助他们深入了解当地房地产市场。利用数据实现全面分析我们的系统利用爬取的58同</div> </li> <li><a href="/article/1902512493654241280.htm" title="Linux安装Anaconda和Jupyter" target="_blank">Linux安装Anaconda和Jupyter</a> <span class="text-muted">硬水果糖</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/jupyter/1.htm">jupyter</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>一、了解Anaconda和Jupyter引言:Anaconda是一个流行的开源数据科学平台,广泛用于数据分析、机器学习、人工智能等领域。它是一个集成了大量科学计算和数据科学工具的Python和R编程语言环境。Anaconda的主要目标是简化数据科学和机器学习的开发流程,提供一个易于安装和管理的环境。而预装了大量常用的Python和R库,这些库涵盖了数据科学的各个方面,包括:数据分析:Pandas、</div> </li> <li><a href="/article/1902511609775976448.htm" title="爬虫基础--request库详解" target="_blank">爬虫基础--request库详解</a> <span class="text-muted">amo的代码园_毕设</span> <a class="tag" taget="_blank" href="/search/Java%E5%9F%BA%E7%A1%80/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/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</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>爬虫基础–request库详解1.requests模块介绍request库中文文档:https://docs.python-requests.org/zh_CN/latest/user/quickstart.htmlrequests是一个非常流行的PythonHTTP第三方库,它允许你发送各种HTTP请求,处理cookies、会话、连接池、重定向、多种认证方式等,使得处理HTTP请求变得非常便捷,</div> </li> <li><a href="/article/1902511230866747392.htm" title="C++20 新特性全面解析:从概念到协程的编程革命" target="_blank">C++20 新特性全面解析:从概念到协程的编程革命</a> <span class="text-muted">小乌龟登顶记</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>一、引言:C++20的里程碑意义2020年发布的C++20标准被公认为继C++11之后最重要的版本更新,带来了4大核心特性和20+项重大改进。这些变革不仅提升了代码表达力,更从根本上改变了C++的编程范式。本文将深入解析C++20的关键特性,并通过实战代码示例演示其应用场景。二、四大核心特性详解2.1概念(Concepts):模板编程的革命基本概念类型约束:通过requires子句限制模板参数类型</div> </li> <li><a href="/article/1902510223181017088.htm" title="淘宝API接口深度解析:用户行为分析与精准营销实战" target="_blank">淘宝API接口深度解析:用户行为分析与精准营销实战</a> <span class="text-muted">lovelin+vI7809804594</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%8F%8D%E5%90%91%E6%B5%B7%E6%B7%98/1.htm">反向海淘</a><a class="tag" taget="_blank" href="/search/API/1.htm">API</a> <div>在电子商务领域,数据是驱动业务增长的关键要素之一。淘宝API接口作为连接商家与淘宝平台的桥梁,为商家提供了丰富的数据资源和强大的功能支持。其中,用户行为分析与精准营销是商家利用淘宝API接口实现业务增长的重要手段。本文将深入解析淘宝API接口在用户行为分析与精准营销方面的应用,并结合实战案例探讨其实际效果。一、淘宝API接口概述淘宝API接口是淘宝开放平台提供的一组标准化的网络接口,允许第三方开发</div> </li> <li><a href="/article/1902510220387610624.htm" title="电商API接口防爬虫实战:日均拦截千万级恶意请求的技术揭秘" target="_blank">电商API接口防爬虫实战:日均拦截千万级恶意请求的技术揭秘</a> <span class="text-muted">lovelin+vI7809804594</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</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%BA%93/1.htm">数据库</a> <div>在电子商务蓬勃发展的今天,API(应用程序编程接口)接口作为电商平台与外部系统交互的桥梁,承载着商品管理、订单处理、支付结算、用户管理、数据分析等重要功能。然而,这些功能也使电商API接口成为攻击者的目标,面临着来自多个方面的安全挑战。本文将深入探讨电商API接口防爬虫的策略与技术,揭秘日均拦截千万级恶意请求的实践过程。一、电商API接口的重要性与风险1.API接口的定义与作用API接口是一种定义</div> </li> <li><a href="/article/1902509715619901440.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/%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/%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91/1.htm">百度翻译</a> <div>(今年java工作真难找啊,有广州java高级岗位招人的好心人麻烦推一下,拜谢。。)花了一周时间,从零基础开始学习了python,学有所获之后,就总想爬些什么,不然感觉不得劲,所以花了一天时间整出了个百度翻译的爬虫示例,主要卡点花在了找token、sign以及调试请求上。代码有点乱,毕竟是demo,但是功能是实现了的。importrequestsimportjs2pyimportrefromurl</div> </li> <li><a href="/article/1902508959185563648.htm" title="ChatGPT、DeepSeek、GIS与Python机器学习强强联合!地质灾害风险评估、易发性分析、信息化建库及灾后重建" target="_blank">ChatGPT、DeepSeek、GIS与Python机器学习强强联合!地质灾害风险评估、易发性分析、信息化建库及灾后重建</a> <span class="text-muted">WangYan2022</span> <a class="tag" taget="_blank" href="/search/DeepSeek/1.htm">DeepSeek</a><a class="tag" taget="_blank" href="/search/ChatGPT/1.htm">ChatGPT</a><a class="tag" taget="_blank" href="/search/%E5%9C%B0%E4%B8%8B%E6%B0%B4/1.htm">地下水</a><a class="tag" taget="_blank" href="/search/%E5%9C%B0%E8%B4%A8%E7%81%BE%E5%AE%B3/1.htm">地质灾害</a><a class="tag" taget="_blank" href="/search/DeepSeek/1.htm">DeepSeek</a><a class="tag" taget="_blank" href="/search/ChatGPT/1.htm">ChatGPT</a><a class="tag" taget="_blank" href="/search/GIS/1.htm">GIS</a><a class="tag" taget="_blank" href="/search/%E7%81%BE%E5%90%8E%E9%87%8D%E5%BB%BA/1.htm">灾后重建</a> <div>在地质灾害频繁肆虐的当下,精准开展风险评价刻不容缓。如今,一门极具创新性的教程震撼登场,它将ChatGPT、DeepSeek等前沿技术与GIS、Python以及机器学习深度交融,为学员打造出前所未有的学习体验,助力大家在地质灾害风险评价领域强势突围,一路领先。前沿技术融合,铸就智能学习核心动力教程最闪耀的亮点之一,便是大胆引入了ChatGPT和DeepSeek技术。它们恰似无所不能的“数据魔法师”</div> </li> <li><a href="/article/1902507446652432384.htm" title="Chainlink 预言机的原理解析" target="_blank">Chainlink 预言机的原理解析</a> <span class="text-muted">Chainlink资讯</span> <a class="tag" taget="_blank" href="/search/%E9%A2%84%E8%A8%80%E6%9C%BA/1.htm">预言机</a><a class="tag" taget="_blank" href="/search/Chainlink/1.htm">Chainlink</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6/1.htm">智能合约</a> <div>本文来自于8月19日Chainlink开发者社区中国负责人Frank,在DAppLearning分享会上对于Chainlink预言机的原理的讲解,以下是这节分享会的总结内容。有兴趣的小伙伴可以结合视频一起学习:为什么区块链无法主动获取外界数据区块链的特点区块链是一个封闭的确定性系统,每一笔交易都需要不同节点共识,只有超过一定数量的节点共识成功,交易才会被真正认可,并写入区块链。因为对于外部API的</div> </li> <li><a href="/article/1902507320273858560.htm" title="python3实现爬取淘宝页面的商品的数据信息(selenium+pyquery+mongodb)" target="_blank">python3实现爬取淘宝页面的商品的数据信息(selenium+pyquery+mongodb)</a> <span class="text-muted">flood_d</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/pyquery/1.htm">pyquery</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>1.环境须知做这个爬取的时候需要安装好python3.6和selenium、pyquery等等一些比较常用的爬取和解析库,还需要安装MongoDB这个分布式数据库。2.直接上代码spider.pyimportrefromconfigimport*importpymongofromseleniumimportwebdriverfromselenium.common.exceptionsimportT</div> </li> <li><a href="/article/1902506563168432128.htm" title="使用Java爬虫根据关键词获取Shopee商品列表?" target="_blank">使用Java爬虫根据关键词获取Shopee商品列表?</a> <span class="text-muted">小爬虫程序猿</span> <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>在跨境电商领域,Shopee作为东南亚及中国台湾地区领先的电商平台,拥有海量的商品信息。无论是进行市场调研、数据分析,还是寻找热门商品,根据关键词获取Shopee商品列表都是一项极具价值的任务。然而,手动浏览和整理这些信息显然是低效且容易出错的。幸运的是,通过编写Java爬虫程序,我们可以高效地完成这一任务。本文将详细介绍如何利用Java爬虫根据关键词获取Shopee商品列表,并提供完整的代码示例</div> </li> <li><a href="/article/81.htm" title="java短路运算符和逻辑运算符的区别" target="_blank">java短路运算符和逻辑运算符的区别</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java%E5%9F%BA%E7%A1%80/1.htm">java基础</a> <div> /* * 逻辑运算符——不论是什么条件都要执行左右两边代码 * 短路运算符——我认为在底层就是利用物理电路的“并联”和“串联”实现的 * 原理很简单,并联电路代表短路或(||),串联电路代表短路与(&&)。 * * 并联电路两个开关只要有一个开关闭合,电路就会通。 * 类似于短路或(||),只要有其中一个为true(开关闭合)是</div> </li> <li><a href="/article/208.htm" title="Java异常那些不得不说的事" target="_blank">Java异常那些不得不说的事</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/exception/1.htm">exception</a> <div>一、在finally块中做数据回收操作 比如数据库连接都是很宝贵的,所以最好在finally中关闭连接。 JDBCAgent jdbc = new JDBCAgent(); try{ jdbc.excute("select * from ctp_log"); }catch(SQLException e){ ... }finally{ jdbc.close(); </div> </li> <li><a href="/article/335.htm" title="utf-8与utf-8(无BOM)的区别" target="_blank">utf-8与utf-8(无BOM)的区别</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a> <div>BOM——Byte Order Mark,就是字节序标记   在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。这样如</div> </li> <li><a href="/article/462.htm" title="JAVA Annotation之定义篇" target="_blank">JAVA Annotation之定义篇</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%B3%A8%E8%A7%A3/1.htm">注解</a><a class="tag" taget="_blank" href="/search/annotation/1.htm">annotation</a><a class="tag" taget="_blank" href="/search/%E5%85%A5%E9%97%A8/1.htm">入门</a><a class="tag" taget="_blank" href="/search/%E6%B3%A8%E9%87%8A/1.htm">注释</a> <div>    Annotation: 译为注释或注解 An annotation, in the Java computer programming language, is a form of syntactic metadata that can be added to Java source code. Classes, methods, variables, pa</div> </li> <li><a href="/article/589.htm" title="tomcat的多域名、虚拟主机配置" target="_blank">tomcat的多域名、虚拟主机配置</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a> <div>众所周知apache可以配置多域名和虚拟主机,而且配置起来比较简单,但是项目用到的是tomcat,配来配去总是不成功。查了些资料才总算可以,下面就跟大家分享下经验。 很多朋友搜索的内容基本是告诉我们这么配置: 在Engine标签下增面积Host标签,如下: <Host name="www.site1.com" appBase="webapps"</div> </li> <li><a href="/article/716.htm" title="Linux SSH 错误解析(Capistrano 的cap 访问错误 Permission )" target="_blank">Linux SSH 错误解析(Capistrano 的cap 访问错误 Permission )</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/capistrano/1.htm">capistrano</a> <div> 1.ssh -v hdfs@192.168.18.133 出现 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 错误 运行状况如下: OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013 debug1: Reading configuratio</div> </li> <li><a href="/article/843.htm" title="log4j的用法" target="_blank">log4j的用法</a> <span class="text-muted">Harry642</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a> <div>一、前言:     log4j 是一个开放源码项目,是广泛使用的以Java编写的日志记录包。由于log4j出色的表现,     当时在log4j完成时,log4j开发组织曾建议sun在jdk1.4中用log4j取代jdk1.4 的日志工具类,但当时jdk1.4已接近完成,所以sun拒绝使用log4j,当在java开发中</div> </li> <li><a href="/article/970.htm" title="mysql、sqlserver、oracle分页,java分页统一接口实现" target="_blank">mysql、sqlserver、oracle分页,java分页统一接口实现</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/jave/1.htm">jave</a> <div> 定义:pageStart 起始页,pageEnd 终止页,pageSize页面容量 oracle分页:     select * from ( select mytable.*,rownum num from (实际传的SQL) where rownum<=pageEnd) where num>=pageStart sqlServer分页:  </div> </li> <li><a href="/article/1097.htm" title="Hessian 简单例子" target="_blank">Hessian 简单例子</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/service/1.htm">service</a><a class="tag" taget="_blank" href="/search/hessian/1.htm">hessian</a> <div>hello.hessian.MyCar.java package hessian.pojo; import java.io.Serializable; public class MyCar implements Serializable { private static final long serialVersionUID = 473690540190845543</div> </li> <li><a href="/article/1224.htm" title="数据库对象的同义词和序列" target="_blank">数据库对象的同义词和序列</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/%E5%BA%8F%E5%88%97/1.htm">序列</a><a class="tag" taget="_blank" href="/search/%E5%90%8C%E4%B9%89%E8%AF%8D/1.htm">同义词</a><a class="tag" taget="_blank" href="/search/ORACLE%E6%9D%83%E9%99%90/1.htm">ORACLE权限</a> <div>回顾简单的数据库权限等命令; 解锁用户和锁定用户 alter user scott account lock/unlock; //system下查看系统中的用户 select * dba_users; //创建用户名和密码 create user wj identified by wj; identified by //授予连接权和建表权 grant connect to </div> </li> <li><a href="/article/1351.htm" title="使用Powermock和mockito测试静态方法" target="_blank">使用Powermock和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/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a><a class="tag" taget="_blank" href="/search/mockito/1.htm">mockito</a><a class="tag" taget="_blank" href="/search/Powermock/1.htm">Powermock</a> <div>        实例: package com.bijian.study; import static org.junit.Assert.assertEquals; import java.io.IOException; import org.junit.Before; import org.junit.Test; import or</div> </li> <li><a href="/article/1478.htm" title="精通Oracle10编程SQL(6)访问ORACLE" target="_blank">精通Oracle10编程SQL(6)访问ORACLE</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>/* *访问ORACLE */ --检索单行数据 --使用标量变量接收数据 DECLARE v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; BEGIN select ename,sal into v_ename,v_sal from emp where empno=&no; dbms_output.pu</div> </li> <li><a href="/article/1605.htm" title="【Nginx四】Nginx作为HTTP负载均衡服务器" target="_blank">【Nginx四】Nginx作为HTTP负载均衡服务器</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a> <div> Nginx的另一个常用的功能是作为负载均衡服务器。一个典型的web应用系统,通过负载均衡服务器,可以使得应用有多台后端服务器来响应客户端的请求。一个应用配置多台后端服务器,可以带来很多好处:   负载均衡的好处 增加可用资源 增加吞吐量 加快响应速度,降低延时 出错的重试验机制 Nginx主要支持三种均衡算法: round-robin l</div> </li> <li><a href="/article/1732.htm" title="jquery-validation备忘" target="_blank">jquery-validation备忘</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/F%23/1.htm">F#</a><a class="tag" taget="_blank" href="/search/Firebug/1.htm">Firebug</a> <div>留点学习jquery validation总结的代码:   function checkForm(){ validator = $("#commentForm").validate({// #formId为需要进行验证的表单ID errorElement :"span",// 使用"div"标签标记错误, 默认:&</div> </li> <li><a href="/article/1859.htm" title="solr限制admin界面访问(端口限制和http授权限制)" target="_blank">solr限制admin界面访问(端口限制和http授权限制)</a> <span class="text-muted">ronin47</span> <a class="tag" taget="_blank" href="/search/%E9%99%90%E5%AE%9AIp%E8%AE%BF%E9%97%AE/1.htm">限定Ip访问</a> <div>solr的管理界面可以帮助我们做很多事情,但是把solr程序放到公网之后就要限制对admin的访问了。 可以通过tomcat的http基本授权来做限制,也可以通过iptables防火墙来限制。 我们先看如何通过tomcat配置http授权限制。 第一步: 在tomcat的conf/tomcat-users.xml文件中添加管理用户,比如: <userusername="ad</div> </li> <li><a href="/article/1986.htm" title="多线程-用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1" target="_blank">多线程-用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a> <div> public class IncDecThread { private int j=10; /* * 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1 * 两个问题: * 1、线程同步--synchronized * 2、线程之间如何共享同一个j变量--内部类 */ public static </div> </li> <li><a href="/article/2113.htm" title="买房历程" target="_blank">买房历程</a> <span class="text-muted">cfyme</span> <div>    2015-06-21: 万科未来城,看房子   2015-06-26: 办理贷款手续,贷款73万,贷款利率5.65=5.3675   2015-06-27: 房子首付,签完合同   2015-06-28,央行宣布降息 0.25,就2天的时间差啊,没赶上。   首付,老婆找他的小姐妹接了5万,另外几个朋友借了1-</div> </li> <li><a href="/article/2240.htm" title="[军事与科技]制造大型太空战舰的前奏" target="_blank">[军事与科技]制造大型太空战舰的前奏</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%88%B6%E9%80%A0/1.htm">制造</a> <div>        天气热了........空调和电扇要准备好..........        最近,世界形势日趋复杂化,战争的阴影开始覆盖全世界..........        所以,我们不得不关</div> </li> <li><a href="/article/2367.htm" title="dateformat" target="_blank">dateformat</a> <span class="text-muted">dai_lm</span> <a class="tag" taget="_blank" href="/search/DateFormat/1.htm">DateFormat</a> <div> "Symbol Meaning Presentation Ex." "------ ------- ------------ ----" "G era designator (Text) AD" "y year</div> </li> <li><a href="/article/2494.htm" title="Hadoop如何实现关联计算" target="_blank">Hadoop如何实现关联计算</a> <span class="text-muted">datamachine</span> <a class="tag" taget="_blank" href="/search/mapreduce/1.htm">mapreduce</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E5%85%B3%E8%81%94%E8%AE%A1%E7%AE%97/1.htm">关联计算</a> <div>    选择Hadoop,低成本和高扩展性是主要原因,但但它的开发效率实在无法让人满意。     以关联计算为例。     假设:HDFS上有2个文件,分别是客户信息和订单信息,customerID是它们之间的关联字段。如何进行关联计算,以便将客户名称添加到订单列表中?   &nbs</div> </li> <li><a href="/article/2621.htm" title="用户模型中修改用户信息时,密码是如何处理的" target="_blank">用户模型中修改用户信息时,密码是如何处理的</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a> <div>当我添加或修改用户记录的时候对于处理确认密码我遇到了一些麻烦,所有我想分享一下我是怎么处理的。 场景是使用的基本的那些(系统自带),你需要有一个数据表(user)并且表中有一个密码字段(password),它使用 sha1、md5或其他加密方式加密用户密码。 面是它的工作流程: 当创建用户的时候密码需要加密并且保存,但当修改用户记录时如果使用同样的场景我们最终就会把用户加密过的密码再次加密,这</div> </li> <li><a href="/article/2748.htm" title="中文 iOS/Mac 开发博客列表" target="_blank">中文 iOS/Mac 开发博客列表</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/Blog/1.htm">Blog</a> <div>  本博客列表会不断更新维护,如果有推荐的博客,请到此处提交博客信息。 本博客列表涉及的文章内容支持 定制化Google搜索,特别感谢 JeOam 提供并帮助更新。 本博客列表也提供同步更新的OPML文件(下载OPML文件),可供导入到例如feedly等第三方定阅工具中,特别感谢 lcepy 提供自动转换脚本。这里有导入教程。 </div> </li> <li><a href="/article/2875.htm" title="js去除空格,去除左右两端的空格" target="_blank">js去除空格,去除左右两端的空格</a> <span class="text-muted">蕃薯耀</span> <a class="tag" taget="_blank" href="/search/%E5%8E%BB%E9%99%A4%E5%B7%A6%E5%8F%B3%E4%B8%A4%E7%AB%AF%E7%9A%84%E7%A9%BA%E6%A0%BC/1.htm">去除左右两端的空格</a><a class="tag" taget="_blank" href="/search/js%E5%8E%BB%E6%8E%89%E6%89%80%E6%9C%89%E7%A9%BA%E6%A0%BC/1.htm">js去掉所有空格</a><a class="tag" taget="_blank" href="/search/js%E5%8E%BB%E9%99%A4%E7%A9%BA%E6%A0%BC/1.htm">js去除空格</a> <div>js去除空格,去除左右两端的空格 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&g</div> </li> <li><a href="/article/3002.htm" title="SpringMVC4零配置--web.xml" target="_blank">SpringMVC4零配置--web.xml</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/springmvc4/1.htm">springmvc4</a> <div>servlet3.0+规范后,允许servlet,filter,listener不必声明在web.xml中,而是以硬编码的方式存在,实现容器的零配置。 ServletContainerInitializer:启动容器时负责加载相关配置 package javax.servlet; import java.util.Set; public interface ServletContainer</div> </li> <li><a href="/article/3129.htm" title="《开源框架那些事儿21》:巧借力与借巧力" target="_blank">《开源框架那些事儿21》:巧借力与借巧力</a> <span class="text-muted">j2eetop</span> <a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a> <div>同样做前端UI,为什么有人花了一点力气,就可以做好?而有的人费尽全力,仍然错误百出?我们可以先看看几个故事。 故事1:巧借力,乌鸦也可以吃核桃 有一个盛产核桃的村子,每年秋末冬初,成群的乌鸦总会来到这里,到果园里捡拾那些被果农们遗落的核桃。 核桃仁虽然美味,但是外壳那么坚硬,乌鸦怎么才能吃到呢?原来乌鸦先把核桃叼起,然后飞到高高的树枝上,再将核桃摔下去,核桃落到坚硬的地面上,被撞破了,于是,</div> </li> <li><a href="/article/3256.htm" title="JQuery EasyUI 验证扩展" target="_blank">JQuery EasyUI 验证扩展</a> <span class="text-muted">可怜的猫</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/easyui/1.htm">easyui</a><a class="tag" taget="_blank" href="/search/%E9%AA%8C%E8%AF%81/1.htm">验证</a> <div>  最近项目中用到了前端框架-- EasyUI,在做校验的时候会涉及到很多需要自定义的内容,现把常用的验证方式总结出来,留待后用。   以下内容只需要在公用js中添加即可。   使用类似于如下: <input class="easyui-textbox" name="mobile" id="mobile&</div> </li> <li><a href="/article/3383.htm" title="架构师之httpurlconnection----------读取和发送(流读取效率通用类)" target="_blank">架构师之httpurlconnection----------读取和发送(流读取效率通用类)</a> <span class="text-muted">nannan408</span> <div>1.前言.    如题. 2.代码. /* * Copyright (c) 2015, S.F. Express Inc. All rights reserved. */ package com.test.test.test.send; import java.io.IOException; import java.io.InputStream</div> </li> <li><a href="/article/3510.htm" title="Jquery性能优化" target="_blank">Jquery性能优化</a> <span class="text-muted">r361251</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a> <div>一、注意定义jQuery变量的时候添加var关键字 这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下: $loading = $('#loading'); //这个是全局定义,不知道哪里位置倒霉引用了相同的变量名,就会郁闷至死的 二、请使用一个var来定义变量 如果你使用多个变量的话,请如下方式定义: . 代码如下: var page </div> </li> <li><a href="/article/3637.htm" title="在eclipse项目中使用maven管理依赖" target="_blank">在eclipse项目中使用maven管理依赖</a> <span class="text-muted">tjj006</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>概览: 如何导入maven项目至eclipse中 建立自有Maven  Java类库服务器 建立符合maven代码库标准的自定义类库 Maven在管理Java类库方面有巨大的优势,像白衣所说就是非常“环保”。 我们平时用IDE开发都是把所需要的类库一股脑的全丢到项目目录下,然后全部添加到ide的构建路径中,如果用了SVN/CVS,这样会很容易就 把</div> </li> <li><a href="/article/3764.htm" title="中国天气网省市级联页面" target="_blank">中国天气网省市级联页面</a> <span class="text-muted">x125858805</span> <a class="tag" taget="_blank" href="/search/%E7%BA%A7%E8%81%94/1.htm">级联</a> <div>1、页面及级联js <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> &l</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>