(数据科学学习手札31)基于Python的网络数据采集(初级篇)

一、简介

  在实际的业务中,我们手头的数据往往难以满足需求,这时我们就需要利用互联网上的资源来获取更多的补充数据,但是很多情况下,有价值的数据往往是没有提供源文件的直接下载渠道的(即所谓的API),这时我们该如何批量获取这些嵌入网页中的信息呢?

  这时网络数据采集就派上用处了,你通过浏览器可以观看到的绝大多数数据,都可以利用爬虫来获取,而所谓的爬虫,就是我们利用编程语言编写的脚本,根据其规模大小又分为很多种,本篇便要介绍基本的Python编写的爬虫脚本来进行单机形式的网络数据采集,这也是一个进阶的数据挖掘工程师或数据分析师的基本技能之一,大量的应用场景都会需要这种几乎可以毫无阻碍地获取数据的手段,譬如市场预测、机器语言翻译亦或是医疗诊断领域,通过对新闻网站、文章中的文本数据进行采集以进行进一步的数据挖掘工作,也是爬虫很常见的应用场景之一;

  本篇博客将通过介绍基础的爬虫知识,并附上两个实战项目的例子(爬取网易财经海南板块历史股票数据、爬取网易新闻多个分类板块的新闻文本数据),对基础的爬虫做一个小小的总结。

*本篇以jupyter notebook作为开发工具

 

二、建立连接

  为了抓取互联网上的数据资源,第一步显然是要建立起网络连接(即登入你的目标网址),在Python中,我们使用urllib.request中的urlopen()来建立起与目标网址的连接,这个函数可以用来打开并读取一个从网络获取的远程对象,可以轻松读取HTML文件、图像文件或其他寄存在网络端的文件,下面是一个简单的例子:

from urllib.request import urlopen

'''赋值我们需要登入的网址'''
html = urlopen('http://news.163.com/')

'''打印采集回的目标网页的源代码'''
print(html.read())

运行结果:

(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第1张图片

可以看出,通过上面非常简单的几行语句,我们就采集回http://news.163.com/的网页源代码,与浏览器中查看源代码的方式进行比较:

(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第2张图片

 (数据科学学习手札31)基于Python的网络数据采集(初级篇)_第3张图片

  可以看出,只通过这几行语句采集回的网页内容,和浏览器中展示的网页源码信息有很大的出入,这是因为我们通过urlopen只是传回来朴素的源代码,没有经过任何解析操作,下面介绍如何对返回的朴素的网页源码进行解析;

 

三、BeautifulSoup库

  通过上一节我们举的例子可以看出,我们需要对返回的网页源码进行结构化的解析,而BeautifulSoup就是这样一个神奇的第三方库,它通过对HTML标签进行定位,以达到格式化和组织复杂网络信息的目的,我们基于BeautifulSoup对上一节中的简单代码进行扩充:

from urllib.request import urlopen
from bs4 import BeautifulSoup

'''赋值我们需要登入的网址'''
html = urlopen('http://news.163.com/')

'''利用BeautifulSoup对朴素的网页源代码进行结构化解析(包括对utf编码的内容进行转码)'''
obj1 = BeautifulSoup(html.read())

'''打印采集回的目标网页的源代码'''
print(obj1)

运行结果:

(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第4张图片

可以看出这时我们得到的内容与我们之前在浏览器中查看的网页源代码一致(中文内容也被展示出来),更重要的是,我们已经对目标网页的结构进行了解析,意味着我们可以通过调用不同结构标签来查看相应内容:

print(obj1.html.h1)

print(obj1.html.title)

运行结果:

这对之后我们对所需内容的定位提取很有帮助,事实上,任何HTML、XML文件的任意节点信息都可以被提取出来,只要目标信息的附近有标记即可;

 

四、错误的处理策略

  相比大家都有经验,当我们登入某些网址时,因为网络不稳定或其它原因,会导致网页连接失败,而在我们的网络爬虫持续采集数据的过程中,因为网页数据格式不友好、网络服务器宕机、目标数据的标签寻找失败等原因,会导致你的爬虫中途因发生错误而中断,这在需要长时间工作的爬虫项目来说尤为关键;

  爬虫工作过程中常见的错误如下:

  对于urlopen的过程,服务器上不存在目标网页(或是获取页面的时候出现错误),这种异常发生时,程序会返回HTTP错误,这包含很多种详细的错误类型,但urlopen统一反馈“HTTPError”,于是乎利用Python中处理错误的try...except机制,就可以在爬虫遇到这种错误时,进行相应的处理方法(通常是选择跳过),下面是一个简单的例子:

from urllib.request import urlopen

'''创造一系列网址,其中第四个为伪造的不存在网站'''
html = ['http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=1',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=2',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=3',
        'http://www.pythonscraping.com/pages/page10000.html',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=4']

'''循环反馈对应网址的源代码信息'''
for i in range(5):
        token = urlopen(html[i])
        print(token.read()[:10])

这时我们没有进行错误处理,因此在程序运行到第四个网址时,会出现打不开网页的错误,如下:

(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第5张图片

HTTPError出现了,这时由于这个网址的打开失败,导致后续的任务都被迫中断,下面我们使用错误处理机制对这种遍历任务中的潜在错误风险进行处理:

from urllib.request import urlopen
from urllib.error import HTTPError#注意,这里需要import urllib中具体的错误类型

'''创造一系列网址,其中第四个为伪造的不存在网站'''
html = ['http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=1',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=2',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=3',
        'http://www.pythonscraping.com/pages/page10000.html',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=4']

'''循环反馈对应网址的源代码信息'''
for i in range(5):
    try:
        token = urlopen(html[i])
        print(token.read()[:10])
    except HTTPError as e:
        print('错误出现!跳过')

运行结果:

这样就可以对各种潜在的错误进行处理,而不打断整个程序的进行,但运行大的爬虫项目时,潜在的错误类型是多种多样的,一旦没有在程序开头import全对应的错误类型,依旧会因为未预料到的错误类型打断程序,这时我们可以利用try...except中的泛型错误Exception来识别所有错误类型,并打印具体的错误类型以作后期分析:

from urllib.request import urlopen

'''创造一系列网址,其中第四个为伪造的不存在网站'''
html = ['http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=1',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=2',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=3',
        'http://www.pythonscraping.com/pages/page10000.html',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=4']

'''循环反馈对应网址的源代码信息'''
for i in range(5):
    try:
        token = urlopen(html[i])
        print(token.read()[:10])
    except Exception as e:#泛型错误处理机制
        print('错误','< ',e,' >','出现!跳过')

运行结果:

可以看到,在利用Exception时,会处理所有可能的错误,非常方便;

 

五、目标内容的粗略提取(基于CSS)

  前面说了这么多,实际上还是在对我们的目的做铺垫,即介绍了 获取信息--抽取目标信息 这个过程中的获取信息部分,在获得了结构化的全量信息之后,我们就要开始着手如何提取其中想要的信息了;

  先普及一个知识:几乎每一个网站都会存在层叠样式报(cascading style sheet,CSS),这种机制使得浏览器和人类得以理解网页的层次内容,CSS可以让HTML元素呈现出差异化,使得不同的数据归属于其对应的标签下,我们再通过BeautifulSoup解析后的网页内容(带有各层次标签),利用对应内容的标签属性,即可有选择的获取我们想要的数据内容;

  我们用findAll()方法来对BeautifulSoup对象进行指定标签内容的提取,下面是一个简单的例子:

(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第6张图片

 

我们对http://sports.163.com/18/0504/10/DGV2STDA00058782.html这个新闻网页,先是提取它的新闻标题内容,通过观察网页源代码,发现其文章标题内容隐藏在标签下,于是利用findAll()对title标签内内容进行提取:</span></p> <p> </p> <div class="cnblogs_code"> <pre><span style="color:#0000ff;">from</span> urllib.request <span style="color:#0000ff;">import</span><span style="color:#000000;"> urlopen </span><span style="color:#0000ff;">from</span> bs4 <span style="color:#0000ff;">import</span><span style="color:#000000;"> BeautifulSoup </span><span style="color:#800000;">'''</span><span style="color:#800000;">连接目标网址</span><span style="color:#800000;">'''</span><span style="color:#000000;"> html </span>= urlopen(<span style="color:#800000;">'</span><span style="color:#800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#800000;">'''</span><span style="color:#800000;">将反馈回的网页源代码解析为BeautifulSoup对象</span><span style="color:#800000;">'''</span><span style="color:#000000;"> obj </span>=<span style="color:#000000;"> BeautifulSoup(html) </span><span style="color:#800000;">'''</span><span style="color:#800000;">提取obj对象下title标签内的内容</span><span style="color:#800000;">'''</span><span style="color:#000000;"> text </span>= obj.findAll(<span style="color:#800000;">'</span><span style="color:#800000;">title</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#800000;">'''</span><span style="color:#800000;">打印结果</span><span style="color:#800000;">'''</span> <span style="color:#0000ff;">print</span>(text)</pre> </div> <p> </p> <p><span style="font-size:14pt;">运行结果:</span></p> <p style="text-align:center;"><span style="font-size:14pt;"><img src="http://img.e-com-net.com/image/info8/0b4cca18d0d94b5c9a06f9249ee94970.png" alt="" width="557" height="29"></span></p> <p style="text-align:left;"><span style="font-size:14pt;">  </span></p> <p style="text-align:left;"><span style="font-size:14pt;">  从上面的小例子中可以看出findAll()的强大功能,下面对其进行详细的介绍:</span></p> <p style="text-align:left;"><span style="font-size:14pt;">  BeautifulSoup中的find()与findAll()是网页内容提取中最常用的两个函数,我们可以利用它们通过标签的不同属性轻松地过滤HTML页面,查找需要的单个或多个标签下的内容。</span></p> <p style="text-align:left;"><span style="font-size:14pt;">  find()与findAll()用法几乎一样,先介绍findAll()的主要参数:</span></p> <p style="text-align:left;"><span style="font-size:14pt;">tag:这个参数传递字符串形式的单个标题标签或由多个标题标签组成的列表,如'title',['h1','h2','h3']</span></p> <p style="text-align:left;"><span style="font-size:14pt;">attributes:属性参数,接受用字典封装的一个标签的若干属性和对应的属性值,例如{'<span class="html-attribute-name">property':'<span class="html-attribute-value">og:description'}</span></span></span></p> <p style="text-align:left;"><span style="font-size:14pt;"><span class="html-attribute-name"><span class="html-attribute-value">recursive:bool型变量,默认为True,代表findAll会根据你的要求去查找标签参数的所有子标签,以及子标签的子标签;如果设置为False,则findAll只查找文档的一级标签;</span></span></span></p> <p style="text-align:left;"><span style="font-size:14pt;"><span class="html-attribute-name"><span class="html-attribute-value">text:字符型输入,设置该参数以后,提取信息就不是用标签的属性,而是用标签的文本内容,即content中的内容来匹配</span></span></span></p> <p style="text-align:left;"><span style="font-size:14pt;"><span class="html-attribute-name"><span class="html-attribute-value">limit:范围限制参数,只用于findAll,换句话说,find等价于findAll的limit参数为1时的特殊情况,因为根据其他参数设定的条件返回的,是满足条件的所有标签下内容按顺序排列的一个序列,limit设置的值即控制了最终留下前多少个结果</span></span></span></p> <p style="text-align:left;"><span style="font-size:14pt;"><span class="html-attribute-name"><span class="html-attribute-value">keyword:这个参数的用法不是对keyword赋值,而是将你感兴趣的标签内属性声明项,如<span class="html-attribute-name">name="<span class="html-attribute-value">keywords"这样的,在findAll中附加上</span></span></span></span></span></p> <p style="text-align:left;"><span style="font-size:14pt;"><span class="html-attribute-name"><span class="html-attribute-value"><span class="html-attribute-name"><span class="html-attribute-value">下面还是基于之前举例子的那篇新闻网页,对findAll进行演示:</span></span></span></span></span></p> <p style="text-align:left;"><span style="font-size:14pt;"><span class="html-attribute-name"><span class="html-attribute-value"><span class="html-attribute-name"><span class="html-attribute-value">单个标题标签内容的粗略提取:</span></span></span></span></span></p> <div class="cnblogs_code"> <pre><span style="color:#0000ff;">from</span> urllib.request <span style="color:#0000ff;">import</span><span style="color:#000000;"> urlopen </span><span style="color:#0000ff;">from</span> bs4 <span style="color:#0000ff;">import</span><span style="color:#000000;"> BeautifulSoup html </span>=urlopen( <span style="color:#800000;">'</span><span style="color:#800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color:#800000;">'</span><span style="color:#000000;">) obj </span>= BeautifulSoup(html,<span style="color:#800000;">'</span><span style="color:#800000;">lxml</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#800000;">'''</span><span style="color:#800000;">获取标签为<p>的内容</span><span style="color:#800000;">'''</span><span style="color:#000000;"> text </span>= obj.findAll(<span style="color:#800000;">'</span><span style="color:#800000;">p</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#0000ff;">print</span>(text)</pre> </div> <p style="text-align:left;"> </p> <p style="text-align:left;"> </p> <p><span style="font-size:14pt;">运行结果:</span></p> <p style="text-align:center;"><span style="font-size:14pt;"><a href="http://img.e-com-net.com/image/info8/d5c66166a4fb4d0196bb7ffac15528c5.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/d5c66166a4fb4d0196bb7ffac15528c5.jpg" alt="(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第7张图片" width="650" height="192" style="border:1px solid black;"></a></span></p> <p><span style="font-size:14pt;">多个标签内容的捆绑提取:</span></p> <div class="cnblogs_code"> <pre><span style="color:#0000ff;">from</span> urllib.request <span style="color:#0000ff;">import</span><span style="color:#000000;"> urlopen </span><span style="color:#0000ff;">from</span> bs4 <span style="color:#0000ff;">import</span><span style="color:#000000;"> BeautifulSoup html </span>=urlopen( <span style="color:#800000;">'</span><span style="color:#800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color:#800000;">'</span><span style="color:#000000;">) obj </span>= BeautifulSoup(html,<span style="color:#800000;">'</span><span style="color:#800000;">lxml</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#800000;">'''</span><span style="color:#800000;">保存多个标题标签的列表</span><span style="color:#800000;">'''</span><span style="color:#000000;"> tag </span>= [<span style="color:#800000;">'</span><span style="color:#800000;">title</span><span style="color:#800000;">'</span>,<span style="color:#800000;">'</span><span style="color:#800000;">meta</span><span style="color:#800000;">'</span><span style="color:#000000;">] </span><span style="color:#800000;">'''</span><span style="color:#800000;">获取tag中标签的内容</span><span style="color:#800000;">'''</span><span style="color:#000000;"> text </span>=<span style="color:#000000;"> obj.findAll(tag) </span><span style="color:#0000ff;">print</span>(text)</pre> </div> <p><span style="font-size:14pt;">运行结果:</span></p> <p style="text-align:center;"><span style="font-size:14pt;"><a href="http://img.e-com-net.com/image/info8/92bda107930c4adcac13a97d1f77e7af.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/92bda107930c4adcac13a97d1f77e7af.jpg" alt="" width="650" height="83"></a></span></p> <p><span style="font-size:14pt;">对指定标签下指定属性值对应内容的提取:</span></p> <div class="cnblogs_code"> <pre><span style="color:#0000ff;">from</span> urllib.request <span style="color:#0000ff;">import</span><span style="color:#000000;"> urlopen </span><span style="color:#0000ff;">from</span> bs4 <span style="color:#0000ff;">import</span><span style="color:#000000;"> BeautifulSoup html </span>=urlopen( <span style="color:#800000;">'</span><span style="color:#800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color:#800000;">'</span><span style="color:#000000;">) obj </span>= BeautifulSoup(html,<span style="color:#800000;">'</span><span style="color:#800000;">lxml</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#800000;">'''</span><span style="color:#800000;">获取meta标签下属性name为author的对应内容</span><span style="color:#800000;">'''</span><span style="color:#000000;"> text </span>= obj.findAll(<span style="color:#800000;">'</span><span style="color:#800000;">meta</span><span style="color:#800000;">'</span>,{<span style="color:#800000;">'</span><span style="color:#800000;">name</span><span style="color:#800000;">'</span>:<span style="color:#800000;">'</span><span style="color:#800000;">author</span><span style="color:#800000;">'</span><span style="color:#000000;">}) </span><span style="color:#0000ff;">print</span>(text)</pre> </div> <p><span style="font-size:14pt;">运行结果:</span></p> <p style="text-align:center;"><span style="font-size:14pt;"><a href="http://img.e-com-net.com/image/info8/2e8f69e81db04fed849a794d68922a7f.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/2e8f69e81db04fed849a794d68922a7f.png" alt="" width="350" height="45"></a></span></p> <p> </p> <p><span style="font-size:18pt;">六、正则表达式</span></p> <p><span style="font-size:14pt;">  即使你之前完全没有接触过网络爬虫,也可能接触过正则表达式(regular expression,简称regex),之所以叫正则表达式,是因为它们可以识别正则字符串(regular string),通俗的理解就是,我只识别我编写的正则表达式所匹配的内容,而忽视不符合我的表达式所构造的规则的字符串,这在很多方面都十分的方便;</span></p> <p><span style="font-size:14pt;">  正则字符串是任意可以用一系列线性规则构成的字符串,例如:</span></p> <p><span style="font-size:14pt;">  1、字母“a”至少出现一次;</span></p> <p><span style="font-size:14pt;">  2、后面接上重复5次的“b”;</span></p> <p><span style="font-size:14pt;">  3、后面再接上重复任意偶数次的字母“c”;</span></p> <p><span style="font-size:14pt;">  4、最后一位字母是“d”或没有。</span></p> <p><span style="font-size:14pt;">满足上述组合条件的字符串有无数个,如“aaabbbbbccccd”,“abbbbbcc”等,相信你应该理解了,正则表达式就是用一个对于目标语句的格式普适的规则,来识别目标内容。</span></p> <p><span style="font-size:14pt;">  你可以将正则表达式理解为SQL中的LIKE运算符后跟着的通配符,还是以上面介绍过的组合条件为例,用正则表达式来表示:</span></p> <p style="text-align:center;"><span style="font-size:14pt;">aa*bbbbb(cc)*(d|)</span></p> <p style="text-align:left;"><span style="font-size:14pt;">  首先,开头的a表示a出现一次,a*表示a出现任意次,因此aa*的组合代表a至少出现一次;bbbbb表示连续出现5次b;(cc)*表示cc出现任意次,对应重复任意次(包括0次)的c;(d|)表示出现d或无任何字符,对应“最后一位是字母d或没有”,这样一个由若干规则按顺序组合起来的字符串,就是正则字符串;</span></p> <p style="text-align:left;"><span style="font-size:14pt;">*有很多网站可以在线测试你的正则表达式,我喜欢用的是http://regexpal.com.s3-website-us-east-1.amazonaws.com/?_ga=2.164205119.1679442026.1514793856-2027450969.1514793856</span></p> <p style="text-align:left;"><span style="font-size:14pt;">  再举一个更常见的正则表达式使用场景——识别邮箱,以我个人的邮箱为例:pengzyill@foxmail.com,这是个常见的邮箱格式,若要编写正则表达式来识别它,就会按顺序用到以下识别规则:</span></p> <p style="text-align:left;"><span style="font-size:14pt;">  1、邮箱的第一部分至少包括一种内容:大写字母、小写字母、数字0-9、点号.、加号+或下划线_,因此为了识别这一部分,我们构造的正则字符串如下:</span></p> <p style="text-align:center;"><span style="font-size:14pt;">[A-Za-z0-9\.+_]+</span></p> <p style="text-align:left;"> <span style="font-size:14pt;">[]中放入的内容是所有可能出现的内容的最简形式,A-Z表示所有大写字母,a-z表示所有小写字母,0-9表示所有数字,\.表示点号.(这里用\转义),+表示加号,_表示下划线,[]后紧跟的+表示前面[]内的所有部件可以出现多次,且至少有一种部件至少出现1次,可以看出,非常简洁;</span><span style="font-size:14pt;"><br></span></p> <p style="text-align:left;"><span style="font-size:14pt;">  2、紧跟着,会出现一个@符号,很简单,对应的正则字符串为:</span></p> <p style="text-align:center;"><span style="font-size:14pt;">@</span></p> <p style="text-align:left;"><span style="font-size:14pt;">  3、在@之后,是指明邮箱所属域名的部分,由大小写字母组成,如我的邮箱中的foxmail,于是对应的正则字符串为:</span></p> <p style="text-align:center;"><span style="font-size:14pt;">[A-Za-z]+</span></p> <p style="text-align:left;"><span style="font-size:14pt;">  4、紧跟着是一个点号,即:</span></p> <p style="text-align:center;"><span style="font-size:14pt;">\.</span></p> <p style="text-align:left;"><span style="font-size:14pt;">  5、最后一部分,是邮箱地址的顶级域名,如com,org,edu或net等,这是四种最常见的,因此以这四种作为全部(虽然有些以偏概全),对应的正则字符串如下:</span></p> <p style="text-align:center;"><span style="font-size:14pt;">(com|org|edu|net)</span></p> <p style="text-align:left;"><span style="font-size:14pt;">将上述的子正则字符串按照顺序连接起来,便得到了我们的用于识别邮箱地址的正则字符串:</span></p> <p style="text-align:center;"><span style="font-size:14pt;">[A-Za-z0-9\.+_]+@[A-Za-z]+\.(com|org|edu|net)</span></p> <p style="text-align:left;"> <span style="font-size:14pt;">我们在前面提到的在线测试网站中测试一下~</span></p> <p style="text-align:left;"><span style="font-size:14pt;"><a href="http://img.e-com-net.com/image/info8/b60d06515d654b3989606cf72c70795a.png" target="_blank"><img style="margin-left:auto;;border:1px solid black;" src="http://img.e-com-net.com/image/info8/b60d06515d654b3989606cf72c70795a.png" alt="(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第8张图片" width="628" height="328"></a></span></p> <p style="text-align:left;"><span style="font-size:14pt;">可以看出,我的邮箱地址被准确的识别出来(完全被黄色底纹包裹),你也可以试试你自己的邮箱地址;所以,在使用正则表达式之前,最好分块的理清楚各个部分需要对应的正则字符串,这对提高效率很有帮助。</span></p> <p style="text-align:left;"><span style="font-size:14pt;">  下面用一些简单的说明和例子来总结一下正则表达式中的常用符号:</span></p> <table style="width:651px;" border="0" align="center"> <tbody> <tr> <td style="text-align:center;"><span style="font-size:14px;">符号</span></td> <td style="text-align:center;"><span style="font-size:14px;">含义</span></td> <td style="text-align:center;"><span style="font-size:14px;">例子</span></td> <td style="text-align:center;"><span style="font-size:14px;">匹配结果</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">*</span></td> <td style="text-align:center;"><span style="font-size:14px;">匹配前面的单个字符、子表达式或括号里的所有字符0次或多次</span></td> <td style="text-align:center;"><span style="font-size:14px;">a*(bb)*</span></td> <td style="text-align:center;"><span style="font-size:14px;">aaaa  aabbbb</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">+</span></td> <td style="text-align:center;"><span style="font-size:14px;">匹配前面的字符、子表达式或括号里的所有字符至少1次</span></td> <td style="text-align:center;"><span style="font-size:14px;">a+b+</span></td> <td style="text-align:center;"><span style="font-size:14px;">ab  aabbb</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">[]</span></td> <td style="text-align:center;"><span style="font-size:14px;">匹配括号中任意一个字符(配合*实现多次出现的匹配)</span></td> <td style="text-align:center;"><span style="font-size:14px;">[A-Z]*</span></td> <td style="text-align:center;"><span style="font-size:14px;">LOVE  PEACE</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">()</span></td> <td style="text-align:center;"><span style="font-size:14px;">表达式编组(类似数学运算,()里的规则会优先运行)</span></td> <td style="text-align:center;"><span style="font-size:14px;">(a*b)*</span></td> <td style="text-align:center;"><span style="font-size:14px;">aabab  abababab</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">{m,n}</span></td> <td style="text-align:center;"><span style="font-size:14px;">匹配前面的字符、子表达式或括号里的字符m到n次(包含m或n)</span></td> <td style="text-align:center;"><span style="font-size:14px;">a{2,3}b{2,3}</span></td> <td style="text-align:center;"><span style="font-size:14px;">aabbb  aaabb</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">[^]</span></td> <td style="text-align:center;"><span style="font-size:14px;">匹配任意一个不在中括号里的字符</span></td> <td style="text-align:center;"><span style="font-size:14px;">[^A-Z]*</span></td> <td style="text-align:center;"><span style="font-size:14px;">apple  love%++</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">|</span></td> <td style="text-align:center;"><span style="font-size:14px;">匹配任意<span style="color:#ff0000;">一个</span>由竖线|分割的字符、子表达式</span></td> <td style="text-align:center;"><span style="font-size:14px;">b(a|i|e)d</span></td> <td style="text-align:center;"><span style="font-size:14px;">bad  bid  bed</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">.</span></td> <td style="text-align:center;"><span style="font-size:14px;">匹配任意单个字符(包括符号、数字和空格等)</span></td> <td style="text-align:center;"><span style="font-size:14px;">b.d</span></td> <td style="text-align:center;"><span style="font-size:14px;">bed  b?d  bod</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">^</span></td> <td style="text-align:center;"><span style="font-size:14px;">表示以某个字符或子表达式开头的字符串</span></td> <td style="text-align:center;"><span style="font-size:14px;">^a</span></td> <td style="text-align:center;"><span style="font-size:14px;">adshdjsh  a?di</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">\</span></td> <td style="text-align:center;"><span style="font-size:14px;">转义字符(把有特殊含义的字符转换成字面形式,譬如本表中的一些常用符号)</span></td> <td style="text-align:center;"><span style="font-size:14px;">\.\|\\</span></td> <td style="text-align:center;"><span style="font-size:14px;">.|\</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">$</span></td> <td style="text-align:center;"><span style="font-size:14px;">常用于正则表达式的末尾,表示“从字符串的末端匹配”,如果不使用它,每个正则表达式实际上都相当于外套一个.*,默认从字符串开头进行匹配。可以将这个符号视为^的反义词</span></td> <td style="text-align:center;"><span style="font-size:14px;">[A-Z]*[a-z]*$</span></td> <td style="text-align:center;"><span style="font-size:14px;">ABCabc</span></td> </tr> <tr> <td style="text-align:center;"><span style="font-size:14px;">?!</span></td> <td style="text-align:center;"><span style="font-size:14px;">表示“不包含”,这个符号通常放在字符或正则表达式前面,表示指定字符不可以出现在目标字符串中,若字符在字符串的不规则部位出现,则需要在整个字符串中排除某个字符,就需要加上^与$符号</span></td> <td style="text-align:center;"><span style="font-size:14px;">^((?![A-Z]).)*$</span></td> <td style="text-align:center;"><span style="font-size:14px;">nojoasdn-\</span></td> </tr> </tbody> </table> <p style="text-align:center;"> </p> <p> <span style="font-size:18pt;">七、正则表达式与BeautifulSoup</span><span style="font-size:18pt;"><br></span></p> <p><span style="font-size:14pt;">  基于前面介绍的正则表达式,下面我们来介绍如何将正则表达式与BeautifulSoup结合起来:</span></p> <p><span style="font-size:14pt;">  这里要使用到一个新的模块——re,这时Python中专门进行正则表达式相关操作的模块,为了与BeautifulSoup结合起来,我们需要进行的操作是将re.compile('正则表达式内容')作为findAll内适配参数的输入值,即可将以前确切赋参的方法,转换为利用正则表达式进行模式赋参,这大大提高了findAll对网页内容提取的自由度和效率,下面是几个简单的例子:</span></p> <div class="cnblogs_code"> <pre><span style="color:#0000ff;">from</span> urllib.request <span style="color:#0000ff;">import</span><span style="color:#000000;"> urlopen </span><span style="color:#0000ff;">from</span> bs4 <span style="color:#0000ff;">import</span><span style="color:#000000;"> BeautifulSoup </span><span style="color:#0000ff;">import</span><span style="color:#000000;"> re html </span>=urlopen( <span style="color:#800000;">'</span><span style="color:#800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color:#800000;">'</span><span style="color:#000000;">) obj </span>= BeautifulSoup(html,<span style="color:#800000;">'</span><span style="color:#800000;">lxml</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#800000;">'''</span><span style="color:#800000;">匹配meta标签下,name属性值为k开头,紧跟着任意数目小写字母</span><span style="color:#800000;">'''</span><span style="color:#000000;"> text </span>= obj.findAll(<span style="color:#800000;">'</span><span style="color:#800000;">meta</span><span style="color:#800000;">'</span>,{<span style="color:#800000;">'</span><span style="color:#800000;">name</span><span style="color:#800000;">'</span>:re.compile(<span style="color:#800000;">'</span><span style="color:#800000;">k[a-z]*</span><span style="color:#800000;">'</span><span style="color:#000000;">)}) </span><span style="color:#0000ff;">print</span>(text)</pre> </div> <p><span style="font-size:14pt;">运行结果:</span></p> <p style="text-align:center;"><span style="font-size:14pt;"><a href="http://img.e-com-net.com/image/info8/dbd1624986a04994af39b85cf14f24da.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/dbd1624986a04994af39b85cf14f24da.png" alt="" width="441" height="41"></a></span></p> <p><span style="font-size:14pt;">接下来我们来实现更复杂一些的数据爬取,我在本篇博客中反复举例的网页是一篇关于台球的新闻报道,那么我们最关注的信息就应该是新闻的正文内容,下面我们就将针对此目的进行数据的爬取:</span></p> <p><span style="font-size:14pt;">  通过对网页源代码的观察后,确定了新闻内容属于标签p下,因此利用正则表达式配合findAll爬取这部分内容,这里.*?表示匹配所有类型任意出现次数的字符:</span></p> <div class="cnblogs_code"> <pre><span style="color:#0000ff;">from</span> urllib.request <span style="color:#0000ff;">import</span><span style="color:#000000;"> urlopen </span><span style="color:#0000ff;">from</span> bs4 <span style="color:#0000ff;">import</span><span style="color:#000000;"> BeautifulSoup </span><span style="color:#0000ff;">import</span><span style="color:#000000;"> re html </span>=urlopen( <span style="color:#800000;">'</span><span style="color:#800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color:#800000;">'</span><span style="color:#000000;">) obj </span>= BeautifulSoup(html,<span style="color:#800000;">'</span><span style="color:#800000;">lxml</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#800000;">'''</span><span style="color:#800000;">匹配p标签下的内容</span><span style="color:#800000;">'''</span><span style="color:#000000;"> text </span>= obj.findAll(<span style="color:#800000;">'</span><span style="color:#800000;">p</span><span style="color:#800000;">'</span>,text=re.compile(<span style="color:#800000;">'</span><span style="color:#800000;">.*?</span><span style="color:#800000;">'</span><span style="color:#000000;">)) </span><span style="color:#800000;">'''</span><span style="color:#800000;">打印未经处理的内容</span><span style="color:#800000;">'''</span> <span style="color:#0000ff;">print</span>(text)</pre> </div> <p><span style="font-size:14pt;">运行结果:</span></p> <p style="text-align:center;"><span style="font-size:14pt;"><a href="http://img.e-com-net.com/image/info8/79c21ccfec81454abeced550a1023952.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/79c21ccfec81454abeced550a1023952.jpg" alt="(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第9张图片" width="650" height="343" style="border:1px solid black;"></a></span></p> <p><span style="font-size:14pt;">虽然将全部新闻内容爬取了下来,但其中参杂着许多<>包裹的标签内容,下面我们利用re.sub来对这些无关内容进行处理:</span></p> <div class="cnblogs_code"> <pre><span style="color:#800000;">'''</span><span style="color:#800000;">将爬下来的粗略内容转为字符串形式</span><span style="color:#800000;">'''</span><span style="color:#000000;"> text </span>=<span style="color:#000000;"> str(text) </span><span style="color:#800000;">'''</span><span style="color:#800000;">利用re.sub将所有的<>及内部信息替换为空字符,等价于将这些干扰部分删去</span><span style="color:#800000;">'''</span> <span style="color:#0000ff;">print</span>(re.sub(<span style="color:#800000;">'</span><span style="color:#800000;"><.*?></span><span style="color:#800000;">'</span>,<span style="color:#800000;">''</span>,text))</pre> </div> <p><span style="font-size:14pt;">运行结果:</span></p> <p style="text-align:center;"><span style="font-size:14pt;"><a href="http://img.e-com-net.com/image/info8/e2838a8ff1854c2d9f99c2d3e08033ee.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e2838a8ff1854c2d9f99c2d3e08033ee.jpg" alt="(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第10张图片" width="650" height="338" style="border:1px solid black;"></a></span></p> <p><span style="font-size:14pt;">相信你此时一定在惊叹re这个模块的功能之强大,接下来的一篇博客,我就将详细介绍re模块的常见功能和特性;</span></p> <p> </p> <p><span style="font-size:14pt;">  以上就是关于Python网络爬虫的初级知识,今后会继续更进阶的介绍,敬请期待。</span></p> <p> </p> <p style="text-align:left;"> </p> <p> </p> </div> <p>转载于:https://www.cnblogs.com/feffery/p/8984411.html</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1280740270547156992"></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">你可能感兴趣的:((数据科学学习手札31)基于Python的网络数据采集(初级篇))</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1899394141863866368.htm" title="仅仅使用pytorch来手撕transformer架构(4):解码器和解码器模块类的实现和向前传播" target="_blank">仅仅使用pytorch来手撕transformer架构(4):解码器和解码器模块类的实现和向前传播</a> <span class="text-muted">KangkangLoveNLP</span> <a class="tag" taget="_blank" href="/search/%E6%89%8B%E6%92%95%E7%B3%BB%E5%88%97/1.htm">手撕系列</a><a class="tag" taget="_blank" href="/search/%23transformer/1.htm">#transformer</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a><a class="tag" taget="_blank" href="/search/transformer/1.htm">transformer</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>仅仅使用pytorch来手撕transformer架构(4):解码器和解码器模块类的实现和向前传播仅仅使用pytorch来手撕transformer架构(1):位置编码的类的实现和向前传播最适合小白入门的Transformer介绍仅仅使用pytorch来手撕transformer架构(2):多头注意力MultiHeadAttention类的实现和向前传播仅仅使用pytorch来手撕transfor</div> </li> <li><a href="/article/1899393889089941504.htm" title="深入学习Nginx:从入门到实践" target="_blank">深入学习Nginx:从入门到实践</a> <span class="text-muted">小码快撩</span> <a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>引言Nginx,全名“EngineX”,是一款高性能的HTTP和反向代理服务器,由俄罗斯程序员IgorSysoev开发。以其轻量级、高并发处理能力和稳定性而闻名于世,广泛应用于负载均衡、动静内容分离、API网关、缓存服务以及静态文件服务等多个场景。本文旨在为读者提供一份详尽的Nginx技术学习指南,助您快速掌握并应用这一强大工具。。一、事件驱动模型在Nginx中,事件驱动模型是其高效处理并发连接的</div> </li> <li><a href="/article/1899393889601646592.htm" title="大数据技术生态圈:Hadoop、Hive、Spark的区别和关系" target="_blank">大数据技术生态圈:Hadoop、Hive、Spark的区别和关系</a> <span class="text-muted">雨中徜徉的思绪漫溢</span> <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/hive/1.htm">hive</a> <div>大数据技术生态圈:Hadoop、Hive、Spark的区别和关系在大数据领域中,Hadoop、Hive和Spark是三个常用的开源技术,它们在大数据处理和分析方面发挥着重要作用。虽然它们都是为了处理大规模数据集而设计的,但它们在功能和使用方式上存在一些区别。本文将详细介绍Hadoop、Hive和Spark的区别和关系,并提供相应的源代码示例。Hadoop:Hadoop是一个用于分布式存储和处理大规</div> </li> <li><a href="/article/1899393511170568192.htm" title="基于Java的智能家居设计:模块化智能插座的设计与实现" target="_blank">基于Java的智能家居设计:模块化智能插座的设计与实现</a> <span class="text-muted">AGI大模型与大数据研究院</span> <a class="tag" taget="_blank" href="/search/DeepSeek/1.htm">DeepSeek</a><a class="tag" taget="_blank" href="/search/R1/1.htm">R1</a><a class="tag" taget="_blank" href="/search/%26amp%3B/1.htm">&</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AEAI%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">大数据AI人工智能</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><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/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/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> <div>智能家居,Java,模块化设计,智能插座,物联网,MQTT,RESTfulAPI1.背景介绍智能家居已成为现代生活的重要趋势,它通过将各种智能设备连接到网络,实现对家居环境的自动化控制和远程管理。智能插座作为智能家居的基础设备之一,能够远程控制电器开关,监测电器功耗,并根据用户需求实现定时开关等功能。传统的智能插座往往采用单片机或嵌入式系统,功能相对单一,难以扩展和升级。随着物联网技术的快速发展,</div> </li> <li><a href="/article/1899392881412599808.htm" title="【30天玩转python】项目实战:从零开始开发一个Python项目" target="_blank">【30天玩转python】项目实战:从零开始开发一个Python项目</a> <span class="text-muted">爱技术的小伙子</span> <a class="tag" taget="_blank" href="/search/30%E5%A4%A9%E7%8E%A9%E8%BD%ACpython/1.htm">30天玩转python</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>项目实战:从零开始开发一个Python项目在学习Python的过程中,开发一个完整的项目是非常重要的实战练习。它不仅能够帮助你巩固所学的知识,还能提高实际编程能力。本文将带领你从零开始开发一个Python项目,介绍从项目规划、环境搭建、代码实现到项目发布的完整过程。我们将以一个简单的“任务管理系统”为例,逐步讲解如何构建、测试和优化这个项目。1.项目规划1.1项目简介我们将开发一个基于命令行的任务</div> </li> <li><a href="/article/1899392880460492800.htm" title="决策树的核心思想" target="_blank">决策树的核心思想</a> <span class="text-muted">code 旭</span> <a class="tag" taget="_blank" href="/search/AI%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0/1.htm">AI人工智能学习</a><a class="tag" taget="_blank" href="/search/%E5%86%B3%E7%AD%96%E6%A0%91/1.htm">决策树</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>一、决策树的核心思想本质:通过特征判断对数据集递归划分,形成树形结构。目标:生成一组“若-则”规则,使数据划分到叶子节点时尽可能纯净。关键流程:特征选择:选择最佳分裂特征(如信息增益最大)。节点分裂:根据特征取值划分子节点。停止条件:节点样本纯度过高或样本数过少时终止。二、数学公式与理论1.信息熵(InformationEntropy)衡量数据集的混乱程度:H(D)=−∑k=1Kpklog⁡2pk</div> </li> <li><a href="/article/1899392628382822400.htm" title="本地部署Hive集群" target="_blank">本地部署Hive集群</a> <span class="text-muted">克里斯蒂亚诺罗纳尔多阿维罗</span> <a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93/1.htm">数据仓库</a> <div>规划服务机器Hive本体部署在Node1元数据服务所需的关系型数据库(MYSQL)部署在Node1安装MYSQL数据库#更新密钥rpm--importhttps://repo.mysql.com/RPM-GPG-KEY-mysql-2022#安装Mysqlyum库rpm-Uvhhttp://repo.mysql.com//mysql57-community-release-el7-7.noarch</div> </li> <li><a href="/article/1899391998524190720.htm" title="卡尔曼滤波算法从理论到实践:在STM32中的嵌入式实现" target="_blank">卡尔曼滤波算法从理论到实践:在STM32中的嵌入式实现</a> <span class="text-muted">DOMINICHZL</span> <a class="tag" taget="_blank" href="/search/STM32/1.htm">STM32</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/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> <div>摘要:卡尔曼滤波(KalmanFilter)是传感器数据融合领域的经典算法,在姿态解算、导航定位等嵌入式场景中广泛应用。本文将从公式推导、代码实现、参数调试三个维度深入解析卡尔曼滤波,并给出基于STM32硬件的完整工程案例。一、卡尔曼滤波核心思想1.1什么是卡尔曼滤波?卡尔曼滤波是一种最优递归估计算法,通过融合预测值(系统模型)与观测值(传感器数据),在噪声干扰环境下实现对系统状态的动态估计。其核</div> </li> <li><a href="/article/1899390361990656000.htm" title="ffplay 使用文档介绍" target="_blank">ffplay 使用文档介绍</a> <span class="text-muted">码流怪侠</span> <a class="tag" taget="_blank" href="/search/FFmpeg/1.htm">FFmpeg</a><a class="tag" taget="_blank" href="/search/ffplay/1.htm">ffplay</a><a class="tag" taget="_blank" href="/search/%E6%92%AD%E6%94%BE%E5%99%A8/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/%E7%9B%B4%E6%92%AD/1.htm">直播</a><a class="tag" taget="_blank" href="/search/%E8%BD%AC%E7%A0%81/1.htm">转码</a> <div>ffplayffplay是一个简单的媒体播放器,它是FFmpeg项目的一部分。FFmpeg是一个广泛使用的多媒体框架,能够解码、编码、转码、复用、解复用、流化、过滤和播放几乎所有类型的媒体文件。ffplay主要用于测试和调试,因为它提供了一个命令行界面,可以方便地查看媒体文件的详细信息,如视频帧、音频波形等。它支持多种视频和音频格式,并且可以实时显示解码过程中的统计信息。使用文档原文地址:http</div> </li> <li><a href="/article/1899390361592197120.htm" title="IEC104协议解析" target="_blank">IEC104协议解析</a> <span class="text-muted">上海研博数据</span> <a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>一、IEC104协议核心特性与应用场景IEC104(IEC60870-5-104)是电力系统中广泛使用的通信协议,基于TCP/IP实现主从站(SCADA与RTU/变电站设备)的实时数据交互‌。其核心功能包括:1.四遥操作‌:‌遥测‌(YC):采集电压、电流等模拟量数据(如类型标识0x0D)‌。遥信‌(YX):监测开关状态等数字量信号(如M_SP_NA_1单点遥信)‌。遥控‌(YK):远程控制断路器</div> </li> <li><a href="/article/1899390109397086208.htm" title="flink+kafka实现流数据处理学习" target="_blank">flink+kafka实现流数据处理学习</a> <span class="text-muted">上海研博数据</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>在应用系统的建设过程中,通常都会遇到需要实时处理数据的场景,处理实时数据的框架有很多,本文将以一个示例来介绍flink+kafka在流数据处理中的应用。1、概念介绍flink:是一个分布式、高可用、高可靠的大数据处理引擎,提供了一种高效、可靠、可扩展的方式来处理和分析实时数据。kafka:是用于构建实时数据管道和流应用程序并具有横向扩展,容错,wickedfast(变态快)等优点的一种消息中间件。</div> </li> <li><a href="/article/1899388724085583872.htm" title="Python从0到100(七十六):计算机视觉-直方图和自适应直方图均衡化" target="_blank">Python从0到100(七十六):计算机视觉-直方图和自适应直方图均衡化</a> <span class="text-muted">是Dream呀</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</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><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!欢迎大家订阅专栏:零基础学Python:Python从0到100最新</div> </li> <li><a href="/article/1899388469533274112.htm" title="uniapp 滚动尺" target="_blank">uniapp 滚动尺</a> <span class="text-muted">走,带你去玩</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>scale组件代码(部分class样式使用到了uview1.0的样式){{item/10}}exportdefault{name:'Scale',components:{},props:{value:{type:String,default:'0.0'},//最小值min:{type:Number,default:0,},//最大值max:{type:Number,default:100,},//</div> </li> <li><a href="/article/1899388470401495040.htm" title="修改uview组件样式无效" target="_blank">修改uview组件样式无效</a> <span class="text-muted">走,带你去玩</span> <a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a> <div>在自己的components组件目录下修改uview组件样式不起效果,添加如下代码与metnods平级即可exportdefault{options:{styleIsolation:'shared'},}</div> </li> <li><a href="/article/1899388470825119744.htm" title="Elasticsearch 入门教学:从零开始掌握分布式搜索引擎" target="_blank">Elasticsearch 入门教学:从零开始掌握分布式搜索引擎</a> <span class="text-muted">格子先生Lab</span> <a class="tag" taget="_blank" href="/search/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E/1.htm">搜索引擎</a><a class="tag" taget="_blank" href="/search/elasticsearch/1.htm">elasticsearch</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>引言Elasticsearch是一个开源的分布式搜索引擎,基于ApacheLucene构建,能够实现近乎实时的数据搜索和分析。它广泛应用于日志分析、全文搜索、数据可视化等场景。本文将带你从零开始学习Elasticsearch,掌握其基本概念、安装配置、数据操作及搜索功能。1.Elasticsearch简介1.1什么是Elasticsearch?Elasticsearch是一个分布式的RESTful</div> </li> <li><a href="/article/1899388471441682432.htm" title="MySql索引使用" target="_blank">MySql索引使用</a> <span class="text-muted">沐千熏</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>索引类型#主键索引:PRIMARY这设立主键后数据库自动建立索引,InnoDB为聚簇索引,主键索引列不能为空(NUll);#唯一索引:UNIQUE索引列的值必须唯一。可以为空值,但是必须只有一个;#普通索引(组合索引):NORMAL也称为非唯一索引,允许重复值和NULL值。一个索引可以包含多个列,多个列共同组成一个复杂的索引;#全文索引:FULLTEXTFullText(MySQL5.7之前,只有</div> </li> <li><a href="/article/1899387588096094208.htm" title="【LLM】预训练的具体流程" target="_blank">【LLM】预训练的具体流程</a> <span class="text-muted">FOUR_A</span> <a class="tag" taget="_blank" href="/search/LLM/1.htm">LLM</a><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/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a> <div>分词器训练预训练模型:就像你已经学会了一些基础知识的“大脑”,我们可以在这个基础上继续学习新东西。比如,有些模型已经学会了英语,但中文学得不够好。中文预训练:为了让这个“大脑”更好地理解中文,我们需要用大量的中文数据继续训练它。分词器(Tokenizer):它的作用是把一句话拆分成一个个小单元(比如词语或字)。比如,“我喜欢学习”会被拆成“我/喜欢/学习”。这些拆分后的单元会被转换成数字,方便模型</div> </li> <li><a href="/article/1899387336022618112.htm" title="android屏幕旋转生命周期,Activity、Fragment生命周期---横竖屏切换的生命周期" target="_blank">android屏幕旋转生命周期,Activity、Fragment生命周期---横竖屏切换的生命周期</a> <span class="text-muted">老K先生</span> <a class="tag" taget="_blank" href="/search/android%E5%B1%8F%E5%B9%95%E6%97%8B%E8%BD%AC%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/1.htm">android屏幕旋转生命周期</a> <div>先贴出一张大家众所周知activity流程图onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态。onStart():Activity在屏幕上对用户可见时调用,但还不可与用户交互onRestart():在activity停止后,在再次启动之前被调用。onResume():Activity开始和用户交互的时候调用,这时该A</div> </li> <li><a href="/article/1899386957868363776.htm" title="大数据面试之路 (一) 数据倾斜" target="_blank">大数据面试之路 (一) 数据倾斜</a> <span class="text-muted">愿与狸花过一生</span> <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/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a> <div>记录大数据面试历程数据倾斜大数据岗位,数据倾斜面试必问的一个问题。一、数据倾斜的表现与原因表现某个或某几个Task执行时间过长,其他Task快速完成。Spark/MapReduce作业卡在某个阶段(如reduce阶段),日志显示少数Task处理大量数据。资源利用率不均衡(如CPU、内存集中在某些节点)。常见场景Key分布不均:如某些Key对应的数据量极大(如用户ID为空的记录、热点事件)。数据分区</div> </li> <li><a href="/article/1899386453226483712.htm" title="python递推法_如何使用Python递归函数中的递推?" target="_blank">python递推法_如何使用Python递归函数中的递推?</a> <span class="text-muted">热茶走</span> <a class="tag" taget="_blank" href="/search/python%E9%80%92%E6%8E%A8%E6%B3%95/1.htm">python递推法</a> <div>我们大家都知道,一个函数可能存在多种不同的用法,很少是有函数只针对一个方式,那么基于一种函数,我们肯定要了解多个方式,今日针对递归函数里的递推内容给大家介绍哦~递归是什么?是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。下面是个人理解:递归就是在函数内部调用自己的函数被称之为递归。实例:#直接调用自己:deffunc:print('fromfunc')funcFunc#间接</div> </li> <li><a href="/article/1899386453633331200.htm" title="递推和递归_一文学会递归递推" target="_blank">递推和递归_一文学会递归递推</a> <span class="text-muted">HR刀姐</span> <a class="tag" taget="_blank" href="/search/%E9%80%92%E6%8E%A8%E5%92%8C%E9%80%92%E5%BD%92/1.htm">递推和递归</a> <div>递归算法和递推算法无论是在ACM竞赛还是项目工程上都有着极为广泛的应用,但想要完全掌握两者的思想并不容易,对于刚刚接触编程的人来说更是这样,我在初次接触递归递推时就吃了很多的苦头,除了当时对编程语言不太熟悉之外,最大的原因就是难以理解其中的思想,本文将二者结合代码分别讲解,力求以"理论+实践"的方式使读者明白两种算法。一箭双雕,一文双递。一.递归和递推的区别学习递归递推的一个容易遇到的问题就是混淆</div> </li> <li><a href="/article/1899386454115676160.htm" title="飞控简析-从入门到跑路序章" target="_blank">飞控简析-从入门到跑路序章</a> <span class="text-muted">skyman满天星</span> <a class="tag" taget="_blank" href="/search/%E9%A3%9E%E6%8E%A7%E7%AE%80%E6%9E%90/1.htm">飞控简析</a><a class="tag" taget="_blank" href="/search/pixhawk/1.htm">pixhawk</a><a class="tag" taget="_blank" href="/search/%E6%97%A0%E4%BA%BA%E6%9C%BA/1.htm">无人机</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E9%A3%9E%E6%8E%A7/1.htm">开源飞控</a> <div>一、序言茫茫天数此中求,世道兴衰不自由万万千千说不尽,不如推背去归休本人搞飞控差不多两年了,从一开始什么都不懂的真·小白,到现在的高级小白,我已经经历了太多太多。因为感觉飞控是一个比较小众的产品,所以国内的资料并不是很完善,有些文章重复太多了,而且每个人看问题的视角是不一样的。我虽然只是个半瓶水,但是也想为国内的飞控圈子做一点贡献。二、学飞控有没有前途这个话题有点小,大一点的问法应该是学嵌入式有没</div> </li> <li><a href="/article/1899386074359197696.htm" title="python递推式_Python 递推式构造列表(List Comprehensions)" target="_blank">python递推式_Python 递推式构造列表(List Comprehensions)</a> <span class="text-muted">man One</span> <a class="tag" taget="_blank" href="/search/python%E9%80%92%E6%8E%A8%E5%BC%8F/1.htm">python递推式</a> <div>你需要构造一个新的列表,列表中的元素是从一个已知列表中的元素计算而得到的.比如你要创建一个列表,里面的元素是另一个列表中的元素加23后得到的.使用递推式构造列表是最理想的方法:thenewlist=[x+23forxintheoldlist]如果你希望用一个列表中大于5的元素构造一个新的列表,使用递推式也是很方便的:thenewlist=[xforxintheoldlistifx>5]如果你希望将</div> </li> <li><a href="/article/1899386074887680000.htm" title="zookeeper程序员指南" target="_blank">zookeeper程序员指南</a> <span class="text-muted">weixin_30326741</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a> <div>1简介本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的。本文包含理论信息和实践信息。本指南的前四节对各种ZooKeeper概念进行较高层次的讨论。这些概念对于理解ZooKeeper是如何工作的,以及如何使用ZooKeeper来进行工作都是必要的。这几节没有代码,但却要求读者对分布式计算相关的问题较为熟悉。本文的大多数信息以可独立访问的参考材料的形式存在。但是,在编写第一</div> </li> <li><a href="/article/1899386072853442560.htm" title="ZooKeeper学习总结(1)——ZooKeeper入门介绍" target="_blank">ZooKeeper学习总结(1)——ZooKeeper入门介绍</a> <span class="text-muted">一杯甜酒</span> <a class="tag" taget="_blank" href="/search/ZooKeeper%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/1.htm">ZooKeeper学习总结</a><a class="tag" taget="_blank" href="/search/Zookeeper/1.htm">Zookeeper</a> <div>1.概述Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务、名字服务、分布式同步、组服务等。它有如下的一些特点:简单Zookeeper的核心是一个精简的文件系统,它支持一些简单的操作和一些抽象操作,例如,排序和通知。丰富Zookeeper的原语操作是很丰富的,可实现一些协调数据结构和协议。例如,分布式队列、分布式锁和一组同级别节点中的“领导者选举</div> </li> <li><a href="/article/1899386073302233088.htm" title="软考高项报名开始啦,这些东西提前准备好..." target="_blank">软考高项报名开始啦,这些东西提前准备好...</a> <span class="text-muted">不是小盆友</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AF%E8%80%83/1.htm">软考</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%80%83%E8%AF%95/1.htm">计算机考试</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E8%80%83%E9%AB%98%E9%A1%B9/1.htm">软考高项</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E8%80%83%E9%AB%98%E7%BA%A7/1.htm">软考高级</a><a class="tag" taget="_blank" href="/search/%E8%8B%8F%E6%99%AF%E4%B8%80%E8%BD%AF%E8%80%83/1.htm">苏景一软考</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E8%80%83%E6%8A%A5%E5%90%8D/1.htm">软考报名</a><a class="tag" taget="_blank" href="/search/pat%E8%80%83%E8%AF%95/1.htm">pat考试</a> <div>软考高项报名开始啦,这些东西提前准备好...部分地区已经开始报名了,是不是还有很多人不知道要准备什么东西,资料一定要提前准备好,不然很可能会报名失败!!!-��时间节点♦报名时间:3.11——3.28(具体以地区发布为准)♦资格审查时间:3.11——3.29(具体以地区发布为准)♦缴费时间:3.11——3.30(具体以地区发布为准)♦发票打印时间:4.14——12.31♦准考证打印时间:5.19—</div> </li> <li><a href="/article/1899385694401392640.htm" title="一体化便携式气象站:从农业到环保,助力各行各业发展" target="_blank">一体化便携式气象站:从农业到环保,助力各行各业发展</a> <span class="text-muted">tianhe8888_</span> <a class="tag" taget="_blank" href="/search/%E6%B0%94%E8%B1%A1%E7%AB%99/1.htm">气象站</a><a class="tag" taget="_blank" href="/search/%E4%BE%BF%E6%90%BA%E5%BC%8F%E6%B0%94%E8%B1%A1%E7%AB%99/1.htm">便携式气象站</a><a class="tag" taget="_blank" href="/search/%E6%B0%94%E8%B1%A1%E7%9B%91%E6%B5%8B%E7%AB%99/1.htm">气象监测站</a> <div>【TH-PQX5】随着科技的飞速进步,气象监测技术也在不断创新与发展。一体化便携式气象站,作为气象监测领域的佼佼者,以其小巧、便捷、功能全面的特点,正逐渐成为各行各业不可或缺的监测工具。从农业到环保,从科研到应急,一体化便携式气象站正以其独特的优势,助力各行各业的发展。一、一体化便携式气象站的基本概述一体化便携式气象站是一种集多种气象要素监测于一体的便携式设备。它通常包括温度传感器、湿度传感器、风</div> </li> <li><a href="/article/1899385694812434432.htm" title="转基因大豆检测仪:快速精准识别,确保大豆安全品质" target="_blank">转基因大豆检测仪:快速精准识别,确保大豆安全品质</a> <span class="text-muted">tianhe8888_</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AC%E5%9F%BA%E5%9B%A0%E6%A3%80%E6%B5%8B%E4%BB%AA/1.htm">转基因检测仪</a><a class="tag" taget="_blank" href="/search/%E8%BD%AC%E5%9F%BA%E5%9B%A0%E6%A3%80%E6%B5%8B%E8%AE%BE%E5%A4%87/1.htm">转基因检测设备</a> <div>【TH-ZJY1】在现代农业与食品工业中,转基因作物的安全性一直是公众关注的焦点。为了确保大豆及其制品的安全品质,转基因大豆检测仪应运而生。这种高科技设备以其快速、精准的检测能力,为大豆产业链的安全监管提供了有力支持。一、工作原理基因检测技术转基因大豆检测仪主要依赖于先进的基因检测技术,如聚合酶链反应(PCR)、荧光原位杂交(FISH)或基因芯片等。这些技术能够特异性地识别大豆DNA中的转基因片段</div> </li> <li><a href="/article/1899385568215756800.htm" title="洛谷P5731 【深基5.习6】蛇形方阵" target="_blank">洛谷P5731 【深基5.习6】蛇形方阵</a> <span class="text-muted">westdata-Tm</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%A8%A1%E6%8B%9F/1.htm">模拟</a> <div>P5731【深基5.习6】蛇形方阵题目描述给出一个不大于999的正整数nnn,输出n×nn\timesnn×n的蛇形方阵。从左上角填上111开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用333个字符,前面使用空格补齐。输入格式输入一个正整数nnn,含义如题所述。输出格式输出符合题目要求的蛇形矩阵。输入输出样例#1输入#14输出#112341213145111615610987说</div> </li> <li><a href="/article/1899385441812017152.htm" title="雨滴谱仪:准确掌握降水情况,助力道路维护" target="_blank">雨滴谱仪:准确掌握降水情况,助力道路维护</a> <span class="text-muted">tianhe8888_</span> <a class="tag" taget="_blank" href="/search/%E9%9B%A8%E6%BB%B4%E8%B0%B1%E4%BB%AA/1.htm">雨滴谱仪</a><a class="tag" taget="_blank" href="/search/%E9%99%8D%E6%B0%B4%E5%A4%A9%E6%B0%94%E7%8E%B0%E8%B1%A1%E4%BB%AA/1.htm">降水天气现象仪</a><a class="tag" taget="_blank" href="/search/%E9%9B%A8%E6%BB%B4/1.htm">雨滴</a> <div>【TH-YD1】在气象监测与交通管理中,对道路降水情况的实时监测是至关重要的。雨滴谱仪作为一种高精度、智能化的降水天气现象监测设备,凭借其独特的工作原理和卓越的性能,在实时监测道路降水情况方面发挥着重要作用。一、引言降水是自然界中一种常见的天气现象,对道路交通、农业生产、城市排水等多个领域都有着重要影响。为了准确掌握降水情况,及时采取应对措施,科学家们研发了雨滴谱仪这一先进的气象监测设备。雨滴谱仪</div> </li> <li><a href="/article/128.htm" title="scala的option和some" target="_blank">scala的option和some</a> <span class="text-muted">矮蛋蛋</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>原文地址: http://blog.sina.com.cn/s/blog_68af3f090100qkt8.html 对于学习 Scala 的 Java™ 开发人员来说,对象是一个比较自然、简单的入口点。在 本系列 前几期文章中,我介绍了 Scala 中一些面向对象的编程方法,这些方法实际上与 Java 编程的区别不是很大。我还向您展示了 Scala 如何重新应用传统的面向对象概念,找到其缺点</div> </li> <li><a href="/article/255.htm" title="NullPointerException" target="_blank">NullPointerException</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/BaseAdapter/1.htm">BaseAdapter</a> <div>    java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference     出现以上异常.然后就在baidu上</div> </li> <li><a href="/article/382.htm" title="PHP使用文件和目录" target="_blank">PHP使用文件和目录</a> <span class="text-muted">天子之骄</span> <a class="tag" taget="_blank" href="/search/php%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95/1.htm">php文件和目录</a><a class="tag" taget="_blank" href="/search/%E8%AF%BB%E5%8F%96%E5%92%8C%E5%86%99%E5%85%A5/1.htm">读取和写入</a><a class="tag" taget="_blank" href="/search/php%E9%AA%8C%E8%AF%81%E6%96%87%E4%BB%B6/1.htm">php验证文件</a><a class="tag" taget="_blank" href="/search/php%E9%94%81%E5%AE%9A%E6%96%87%E4%BB%B6/1.htm">php锁定文件</a> <div>PHP使用文件和目录 1.使用include()包含文件 (1):使用include()从一个被包含文档返回一个值 (2):在控制结构中使用include()   include_once()函数需要一个包含文件的路径,此外,第一次调用它的情况和include()一样,如果在脚本执行中再次对同一个文件调用,那么这个文件不会再次包含。   在php.ini文件中设置</div> </li> <li><a href="/article/509.htm" title="SQL SELECT DISTINCT 语句" target="_blank">SQL SELECT DISTINCT 语句</a> <span class="text-muted">何必如此</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>SELECT DISTINCT 语句用于返回唯一不同的值。 SQL SELECT DISTINCT 语句 在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 SELECT DISTINCT column_name,column_name F</div> </li> <li><a href="/article/636.htm" title="java冒泡排序" target="_blank">java冒泡排序</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/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/1.htm">冒泡排序</a> <div>package com.algorithm; /** * @Description 冒泡 * @author FuJianyong * 2015-1-22上午09:58:39 */ public class MaoPao { public static void main(String[] args) { int[] mao = {17,50,26,18,9,10</div> </li> <li><a href="/article/763.htm" title="struts2.18 +json,struts2-json-plugin-2.1.8.1.jar配置及问题!" target="_blank">struts2.18 +json,struts2-json-plugin-2.1.8.1.jar配置及问题!</a> <span class="text-muted">7454103</span> <a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/qq/1.htm">qq</a> <div>struts2.18  出来有段时间了! (貌似是 稳定版)   闲时研究下下!  貌似 sruts2 搭配 json 做 ajax 很吃香!   实践了下下! 不当之处请绕过! 呵呵   网上一大堆 struts2+json  不过大多的json 插件 都是 jsonplugin.34.jar   strut</div> </li> <li><a href="/article/890.htm" title="struts2 数据标签说明" target="_blank">struts2 数据标签说明</a> <span class="text-muted">darkranger</span> <a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/Scheme/1.htm">Scheme</a> <div>数据标签主要用于提供各种数据访问相关的功能,包括显示一个Action里的属性,以及生成国际化输出等功能 数据标签主要包括: action :该标签用于在JSP页面中直接调用一个Action,通过指定executeResult参数,还可将该Action的处理结果包含到本页面来。 bean :该标签用于创建一个javabean实例。如果指定了id属性,则可以将创建的javabean实例放入Sta</div> </li> <li><a href="/article/1017.htm" title="链表.简单的链表节点构建" target="_blank">链表.简单的链表节点构建</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/1.htm">编程技巧</a> <div>/*编程环境WIN-TC*/ #include "stdio.h" #include "conio.h" #define NODE(name, key_word, help) \  Node name[1]={{NULL, NULL, NULL, key_word, help}} typedef struct node {  &nbs</div> </li> <li><a href="/article/1144.htm" title="tomcat下jndi的三种配置方式" target="_blank">tomcat下jndi的三种配置方式</a> <span class="text-muted">avords</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a> <div>jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称 访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。          tomcat配置</div> </li> <li><a href="/article/1271.htm" title="关于敏捷的一些想法" target="_blank">关于敏捷的一些想法</a> <span class="text-muted">houxinyou</span> <a class="tag" taget="_blank" href="/search/%E6%95%8F%E6%8D%B7/1.htm">敏捷</a> <div>从网上看到这样一句话:“敏捷开发的最重要目标就是:满足用户多变的需求,说白了就是最大程度的让客户满意。” 感觉表达的不太清楚。 感觉容易被人误解的地方主要在“用户多变的需求”上。 第一种多变,实际上就是没有从根本上了解了用户的需求。用户的需求实际是稳定的,只是比较多,也比较混乱,用户一般只能了解自己的那一小部分,所以没有用户能清楚的表达出整体需求。而由于各种条件的,用户表达自己那一部分时也有</div> </li> <li><a href="/article/1398.htm" title="富养还是穷养,决定孩子的一生" target="_blank">富养还是穷养,决定孩子的一生</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E6%95%99%E8%82%B2/1.htm">教育</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E7%94%9F/1.htm">人生</a> <div> 是什么决定孩子未来物质能否丰盛?为什么说寒门很难出贵子,三代才能出贵族?真的是父母必须有钱,才能大概率保证孩子未来富有吗?-----作者:@李雪爱与自由 事实并非由物质决定,而是由心灵决定。一朋友富有而且修养气质很好,兄弟姐妹也都如此。她的童年时代,物质上大家都很贫乏,但妈妈总是保持生活中的美感,时不时给孩子们带回一些美好小玩意,从来不对孩子传递生活艰辛、金钱来之不易、要懂得珍惜</div> </li> <li><a href="/article/1525.htm" title="oracle 日期时间格式转化" target="_blank">oracle 日期时间格式转化</a> <span class="text-muted">征客丶</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>oracle 系统时间有 SYSDATE 与 SYSTIMESTAMP; SYSDATE:不支持毫秒,取的是系统时间; SYSTIMESTAMP:支持毫秒,日期,时间是给时区转换的,秒和毫秒是取的系统的。 日期转字符窜: 一、不取毫秒: TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') 简要说明, YYYY 年 MM   月</div> </li> <li><a href="/article/1652.htm" title="【Scala六】分析Spark源代码总结的Scala语法四" target="_blank">【Scala六】分析Spark源代码总结的Scala语法四</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>1. apply语法   FileShuffleBlockManager中定义的类ShuffleFileGroup,定义:   private class ShuffleFileGroup(val shuffleId: Int, val fileId: Int, val files: Array[File]) { ... def apply(bucketId</div> </li> <li><a href="/article/1779.htm" title="Erlang中有意思的bug" target="_blank">Erlang中有意思的bug</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a> <div>  代码中常有一些很搞笑的bug,如下面的一行代码被调用两次(Erlang beam) commit f667e4a47b07b07ed035073b94d699ff5fe0ba9b Author: Jovi Zhang <bookjovi@gmail.com> Date: Fri Dec 2 16:19:22 2011 +0100 erts:</div> </li> <li><a href="/article/1906.htm" title="移位打印10进制数转16进制-2008-08-18" target="_blank">移位打印10进制数转16进制-2008-08-18</a> <span class="text-muted">ljy325</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80/1.htm">基础</a> <div> /** * Description 移位打印10进制的16进制形式 * Creation Date 15-08-2008 9:00 * @author 卢俊宇 * @version 1.0 * */ public class PrintHex { // 备选字符 static final char di</div> </li> <li><a href="/article/2033.htm" title="读《研磨设计模式》-代码笔记-组合模式" target="_blank">读《研磨设计模式》-代码笔记-组合模式</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/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ import java.util.ArrayList; import java.util.List; abstract class Component { public abstract void printStruct(Str</div> </li> <li><a href="/article/2160.htm" title="利用cmd命令将.class文件打包成jar" target="_blank">利用cmd命令将.class文件打包成jar</a> <span class="text-muted">chenyu19891124</span> <a class="tag" taget="_blank" href="/search/cmd/1.htm">cmd</a><a class="tag" taget="_blank" href="/search/jar/1.htm">jar</a> <div>cmd命令打jar是如下实现: 在运行里输入cmd,利用cmd命令进入到本地的工作盘符。(如我的是D盘下的文件有此路径 D:\workspace\prpall\WEB-INF\classes) 现在是想把D:\workspace\prpall\WEB-INF\classes路径下所有的文件打包成prpall.jar。然后继续如下操作: cd D: 回车 cd workspace/prpal</div> </li> <li><a href="/article/2287.htm" title="[原创]JWFD v0.96 工作流系统二次开发包 for Eclipse 简要说明" target="_blank">[原创]JWFD v0.96 工作流系统二次开发包 for Eclipse 简要说明</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/swing/1.htm">swing</a> <div>                       JWFD v0.96 工作流系统二次开发包 for Eclipse 简要说明     &nb</div> </li> <li><a href="/article/2414.htm" title="SecureCRT右键粘贴的设置" target="_blank">SecureCRT右键粘贴的设置</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/secureCRT/1.htm">secureCRT</a><a class="tag" taget="_blank" href="/search/%E5%8F%B3%E9%94%AE/1.htm">右键</a><a class="tag" taget="_blank" href="/search/%E7%B2%98%E8%B4%B4/1.htm">粘贴</a> <div>一般都习惯鼠标右键自动粘贴的功能,对于SecureCRT6.7.5 ,这个功能也已经是默认配置了。 老版本的SecureCRT其实也有这个功能,只是不是默认设置,很多人不知道罢了。 菜单: Options->Global Options ...->Terminal 右边有个Mouse的选项块。 Copy on Select Paste on Right/Middle</div> </li> <li><a href="/article/2541.htm" title="Linux 软链接和硬链接" target="_blank">Linux 软链接和硬链接</a> <span class="text-muted">dongwei_6688</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。 【硬连接】硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连</div> </li> <li><a href="/article/2668.htm" title="DIV底部自适应" target="_blank">DIV底部自适应</a> <span class="text-muted">dcj3sjt126com</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/2795.htm" title="Centos6.5使用yum安装mysql——快速上手必备" target="_blank">Centos6.5使用yum安装mysql——快速上手必备</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>第1步、yum安装mysql [root@stonex ~]#  yum -y install mysql-server 安装结果: Installed:     mysql-server.x86_64 0:5.1.73-3.el6_5                   &nb</div> </li> <li><a href="/article/2922.htm" title="如何调试JDK源码" target="_blank">如何调试JDK源码</a> <span class="text-muted">frank1234</span> <a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a> <div>相信各位小伙伴们跟我一样,想通过JDK源码来学习Java,比如collections包,java.util.concurrent包。 可惜的是sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt.jar。 下面是编译jdk的具体步骤:         1.把C:\java\jdk1.6.0_26\sr</div> </li> <li><a href="/article/3049.htm" title="Maximal Rectangle" target="_blank">Maximal Rectangle</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/max/1.htm">max</a> <div>Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.   public class Solution { public int maximalRectangle(char[][] matrix)</div> </li> <li><a href="/article/3176.htm" title="Spring MVC测试框架详解——服务端测试" target="_blank">Spring MVC测试框架详解——服务端测试</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/spring+mvc+test/1.htm">spring mvc test</a> <div>随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的。从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用spring-test-mvc项目(合并到spring3.2中了)。   Spring MVC测试框架提供了对服务器端和客户端(基于RestTemplate的客户端)提供了支持。 &nbs</div> </li> <li><a href="/article/3303.htm" title="Linux64位操作系统(CentOS6.6)上如何编译hadoop2.4.0" target="_blank">Linux64位操作系统(CentOS6.6)上如何编译hadoop2.4.0</a> <span class="text-muted">liyong0802</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>一、准备编译软件   1.在官网下载jdk1.7、maven3.2.1、ant1.9.4,解压设置好环境变量就可以用。     环境变量设置如下:   (1)执行vim /etc/profile (2)在文件尾部加入: export JAVA_HOME=/home/spark/jdk1.7 export MAVEN_HOME=/ho</div> </li> <li><a href="/article/3430.htm" title="StatusBar 字体白色" target="_blank">StatusBar 字体白色</a> <span class="text-muted">pangyulei</span> <a class="tag" taget="_blank" href="/search/status/1.htm">status</a> <div> [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; /*you'll also need to set UIViewControllerBasedStatusBarAppearance to NO in the plist file if you use this method</div> </li> <li><a href="/article/3557.htm" title="如何分析Java虚拟机死锁" target="_blank">如何分析Java虚拟机死锁</a> <span class="text-muted">sesame</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/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E6%9C%BA/1.htm">虚拟机</a><a class="tag" taget="_blank" href="/search/jdbc/1.htm">jdbc</a> <div>英文资料: Thread Dump and Concurrency Locks   Thread dumps are very useful for diagnosing synchronization related problems such as deadlocks on object monitors. Ctrl-\ on Solaris/Linux or Ctrl-B</div> </li> <li><a href="/article/3684.htm" title="位运算简介及实用技巧(一):基础篇" target="_blank">位运算简介及实用技巧(一):基础篇</a> <span class="text-muted">tw_wangzhengquan</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a> <div>http://www.matrix67.com/blog/archives/263    去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章。后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法。从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个r</div> </li> <li><a href="/article/3811.htm" title="jsearch的索引文件结构" target="_blank">jsearch的索引文件结构</a> <span class="text-muted">yangshangchuan</span> <a class="tag" taget="_blank" href="/search/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E/1.htm">搜索引擎</a><a class="tag" taget="_blank" href="/search/jsearch/1.htm">jsearch</a><a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%96%87%E6%A3%80%E7%B4%A2/1.htm">全文检索</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E6%A3%80%E7%B4%A2/1.htm">信息检索</a><a class="tag" taget="_blank" href="/search/word%E5%88%86%E8%AF%8D/1.htm">word分词</a> <div>jsearch是一个高性能的全文检索工具包,基于倒排索引,基于java8,类似于lucene,但更轻量级。   jsearch的索引文件结构定义如下:     1、一个词的索引由=分割的三部分组成:        第一部分是词        第二部分是这个词在多少</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>