Scrapy介绍及入门

 

 一、Scrapy简介

       Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

      其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

二、架构概览

1. Scrapy Engine

       引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的数据流(Data Flow)部分。此组件相当于爬虫的“大脑”,是整个爬虫的调度中心。

2. 调度器(Scheduler)

        调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。

       初始的爬取URL和后续在页面中获取的待爬取的URL将放入调度器中,等待爬取。同时调度器会自动去除重复的URL(如果特定的URL不需要去重也可以通过设置实现,如post请求的URL)

3. 下载器(Downloader)

        下载器负责获取页面数据并提供给引擎,而后提供给spider。

4. Spiders

        Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。

5. Item Pipeline

       Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库中)。

       当页面被爬虫解析所需的数据存入Item后,将被发送到项目管道(Pipeline),并经过几个特定的次序处理数据,最后存入本地文件或存入数据库。

6. 下载器中间件(Downloader middlewares)

       下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。通过设置下载器中间件可以实现爬虫自动更换user-agent、IP等功能。

7. Spider中间件(Spider middlewares)

       Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。

8. 数据流(Data flow)

       1) 引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。

       2) 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。

       3) 引擎向调度器请求下一个要爬取的URL。

       4) 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。

      5) 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。

       6) 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。

       7) Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。

       8) 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。

       9) (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。

三、创建项目

       在开始抓取之前,你必须建立一个新的零碎项目。输入要在其中存储代码并运行的目录:

      创建了一个tutorial目录包含以下内容:

四、创建第一只sipder

       爬行器是定义的类,Scrapy使用它从一个网站(或一组网站)中抓取信息。它们必须是子类 Spider 并定义要做出的初始请求,可选的是如何跟随页面中的链接,以及如何解析下载的页面内容以提取数据。
       创建第一只spider的代码。将其保存在tutorial/spiders 项目命名文件为quotes_spider.py中:

       Spider子类 scrapy.Spider 并定义了一些属性和方法:

       name :标识spider。它在一个项目中必须是唯一的,即不能为不同的爬行器设置相同的名称。

       start_requests() :必须返回请求的可迭代(可以返回请求列表或编写生成器函数),爬行器将从该请求开始爬行。后续请求将从这些初始请求中相继生成。

       parse() :将被调用以处理为每个请求下载的响应的方法。Response参数是 TextResponse 它保存页面内容,并具有进一步有用的方法来处理它。

       这个 parse() 方法通常解析响应,将抓取的数据提取为字典,还查找要遵循的新URL并创建新请求 (Request )。

    运行创建的sipder,此命令运行我们刚刚添加的spider quotes,这将发送一些 quotes.toscrape.com 领域。您将得到类似于以下内容的输出:

       现在,检查当前目录中的文件。您应该注意到已经创建了两个新文件: quotes-1.html 和 quotes-2.HTML, 将各个URL的内容作为 parse 方法指示。

 五、提取数据


          scrappy提取数据的最佳方法是使用 Scrapy shell :

       使用shell,可以尝试使用 CSS 对于响应对象:

       要从上述标题中提取文本,可以执行以下操作:

       这里有两件事需要注意:一是我们已经添加了 ::text 对于CSS查询,意味着我们只想直接选择内部的文本元素 元素。如果我们不指定 ::text ,我们将获得完整的title元素,包括其标记:</p> <p><img alt="" height="37" src="https://img-blog.csdnimg.cn/20210903111059357.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_7,color_FFFFFF,t_70,g_se,x_16" width="338" /></p> <p>       另一件事是呼叫的结果 .getall() 是一个列表:选择器可能返回多个结果,因此我们提取所有结果。只想要第一个结果时,如本例所示:</p> <p><img alt="" height="37" src="https://img-blog.csdnimg.cn/20210903111115468.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_7,color_FFFFFF,t_70,g_se,x_16" width="337" /></p> <p>       作为替代,可以写下:</p> <p><img alt="" height="37" src="https://img-blog.csdnimg.cn/20210903111130507.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_7,color_FFFFFF,t_70,g_se,x_16" width="348" /></p> <p>       使用 .get() 直接在A上 SelectorList 实例避免了 IndexError 回报 None 当它找不到任何与所选内容匹配的元素时。<br />        除 getall() 和 get() 方法以外,也可以使用 re() 提取方法 regular expressions :</p> <p><img alt="" height="133" src="https://img-blog.csdnimg.cn/20210903111201287.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_10,color_FFFFFF,t_70,g_se,x_16" width="471" /></p> <p>       除 CSS外 ,scrapy选择器也支持使用 XPath 表达</p> <p><img alt="" height="80" src="https://img-blog.csdnimg.cn/20210903111215781.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="538" /></p> <p>       XPath表达式是非常强大的,是抓取选择器的基础。实际上,CSS选择器在引擎盖下转换为xpath。xpath表达式提供了更多的功能,因为除了导航结构之外,它还可以查看内容。使用xpath,您可以选择如下内容:*选择包含文本“下一页”*的链接,这使得xpath非常适合于抓取任务。</p> <h2>六、提取引用和作者</h2> <p><br />        编写代码从网页中提取引号来完成spider程序。http://quotes.toscrape.com中的每个引号都由如下所示的HTML元素表示:</p> <p><img alt="" height="252" src="https://img-blog.csdnimg.cn/20210903111231790.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>       打开Scrapy Shell并提取所需数据:</p> <p><img alt="" height="66" src="https://img-blog.csdnimg.cn/20210903111244476.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="554" /></p> <p>      得到了一个quote HTML元素的选择器列表,其中包括:</p> <p><img alt="" height="202" src="https://img-blog.csdnimg.cn/20210903111300973.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>       上面查询返回的每个选择器都允许对其子元素运行进一步的查询。将第一个选择器分配给一个变量,这样我们就可以直接在特定的引号上运行CSS选择器:</p> <p><img alt="" height="27" src="https://img-blog.csdnimg.cn/20210903111313942.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_8,color_FFFFFF,t_70,g_se,x_16" width="384" /></p> <p>       提取 text , author以及 tags,其中tags是字符串列表,我们可以使用 .getall() 方法获取所有这些参数:</p> <p><img alt="" height="140" src="https://img-blog.csdnimg.cn/20210903111326844.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>       提取每个位之后,迭代所有的quotes元素,并将它们放在Python字典中:</p> <p><img alt="" height="250" src="https://img-blog.csdnimg.cn/20210903111338625.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>      在spider中提取数据,使用 yield 回调response中的python关键字,如下所示:</p> <p><img alt="" height="340" src="https://img-blog.csdnimg.cn/20210903111353568.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>       存储抓取的数据,最简单方法是使用 Feed exports ,使用以下命令:</p> <p><img alt="" height="171" src="https://img-blog.csdnimg.cn/20210903111410759.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>      这将生成一个 quotes.json 包含所有抓取的项目的文件,序列化在 JSON 。</p> <p><img alt="" height="236" src="https://img-blog.csdnimg.cn/20210903111422760.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>       这个 -O 命令行开关覆盖任何现有文件;使用 -o 而是将新内容附加到任何现有文件中。但是,附加到JSON文件会使文件内容无效JSON。附加到文件时,请考虑使用不同的序列化格式,例如 JSON Lines ::</p> <p><img alt="" height="83" src="https://img-blog.csdnimg.cn/2021090311143938.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p><img alt="" height="231" src="https://img-blog.csdnimg.cn/20210903111448532.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>       JSON Lines 类似于流,可以很容易地向它附加新记录。当运行两次时,它不存在相同的JSON问题。另外,由于每个记录都是单独的一行,可以处理大文件,而不必将所有内容都放入内存中,因此有如下工具: JQ以帮助在命令行中执行此操作。</p> <p>       从网站上所有页面的引用抓取内容。从页面中跟踪链接第一件事是提取到要跟踪的页面的链接。检查页面,可以看到有一个链接指向下一个带有以下标记的页面:</p> <p><img alt="" height="154" src="https://img-blog.csdnimg.cn/20210903111517815.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>       在外壳中提取:</p> <p><img alt="" height="37" src="https://img-blog.csdnimg.cn/20210903111529629.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="554" /></p> <p>       获取到anchor元素,但需要该属性href ,Scrapy支持CSS扩展,允许选择属性内容,如下所示:</p> <p><img alt="" height="38" src="https://img-blog.csdnimg.cn/20210903111543244.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_9,color_FFFFFF,t_70,g_se,x_16" width="414" /></p> <p>       还有一个 attrib 可用属性</p> <p><img alt="" height="36" src="https://img-blog.csdnimg.cn/20210903111555740.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_8,color_FFFFFF,t_70,g_se,x_16" width="404" /></p> <p>       将spider被修改为递归地跟踪下一页的链接,从中提取数据:</p> <p><img alt="" height="451" src="https://img-blog.csdnimg.cn/20210903111607544.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>      在提取数据之后, parse() 方法查找到下一页的链接,并使用 urljoin() 方法(因为链接可以是相对的),并生成对下一页的新请求,将自身注册为回调,以处理下一页的数据提取,并保持爬行在所有页中进行。</p> <p>       scrapy的以下链接机制:在回调方法中生成一个请求时,scrapy将计划发送该请求,并注册一个回调方法,以便在该请求完成时执行。</p> <p>       使用它可以构建复杂的爬虫程序,这些爬虫程序根据定义的规则跟踪链接,并根据所访问的页面提取不同类型的数据。</p> <p>       示例中,创建了一种循环,跟踪到下一页的所有链接,直到找不到一个为止——这对于爬行博客、论坛和其他带有分页的站点很方便。</p> <h2>七、创建请求的快捷方式</h2> <p><br />        作为创建请求对象的快捷方式,可以使用 response.follow ::</p> <p><img alt="" height="318" src="https://img-blog.csdnimg.cn/20210903111626985.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_10,color_FFFFFF,t_70,g_se,x_16" width="472" /></p> <p>       不像Scrapy.Request, response.follow 直接支持相对URL-无需调用URLJOIN。注意response.follow 只返回一个请求实例;仍然需要生成这个请求。<br />        也可以将选择器传递给 response.follow 而不是字符串;此选择器应提取必要的属性:</p> <p><img alt="" height="47" src="https://img-blog.csdnimg.cn/20210903111646954.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_10,color_FFFFFF,t_70,g_se,x_16" width="474" /></p> <p>       为了 <a> 元素有一个快捷方式: response.follow 自动使用其href属性。因此代码可以进一步缩短:</p> <p><img alt="" height="46" src="https://img-blog.csdnimg.cn/20210903111703266.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_9,color_FFFFFF,t_70,g_se,x_16" width="415" /></p> <p>       要从iterable创建多个请求,可以使用 response.follow_all 取而代之的是:</p> <p><img alt="" height="45" src="https://img-blog.csdnimg.cn/20210903111717511.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_10,color_FFFFFF,t_70,g_se,x_16" width="472" /></p> <p>       进一步缩短:</p> <p><img alt="" height="29" src="https://img-blog.csdnimg.cn/20210903111734162.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="542" /></p> <p>       另一个spider,演示回调和以下链接,抓取作者信息:</p> <p><img alt="" height="392" src="https://img-blog.csdnimg.cn/2021090311174696.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p><img alt="" height="30" src="https://img-blog.csdnimg.cn/20210903111758619.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="554" /></p> <p><img alt="" height="126" src="https://img-blog.csdnimg.cn/20210903111807259.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>        这个spider将从主页开始,跟踪所有指向作者页面的链接,调用 parse_author 它们的回调,以及与 parse 像我们以前看到的那样回拨。</p> <p>        在这里,我们将回调传递给 response.follow_all 作为位置参数,以使代码更短;它还适用于 Request 。</p> <p>       这个 parse_author 回调定义了一个助手函数,用于从CSS查询中提取和清理数据,并用作者数据生成python dict。</p> <p>       这个spider展示的另一个有趣的事情是,即使同一作者引用了很多话,我们也不需要担心多次访问同一作者页面。默认情况下,scrapy过滤掉对已经访问过的URL的重复请求,避免了由于编程错误而太多地访问服务器的问题。这可以通过设置进行配置 DUPEFILTER_CLASS .</p> <h2>八、使用spider参数</h2> <p><br />        通过使用 -a 运行它们时的选项:</p> <p><img alt="" height="26" src="https://img-blog.csdnimg.cn/20210903111843970.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_12,color_FFFFFF,t_70,g_se,x_16" width="553" /></p> <p>       这些论点被传给spider __init__ 方法并默认成为spider属性。<br />        在本例中,为 tag 参数将通过 self.tag 。可以使用它的spider只获取带有特定标记的引号,并基于以下参数构建URL::</p> <p><img alt="" height="406" src="https://img-blog.csdnimg.cn/20210903111859214.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWw5o2u5rmW5byA5Y-R6ICF56S-5Yy6,size_11,color_FFFFFF,t_70,g_se,x_16" width="500" /></p> <p>                如果你通过 tag=humor 对于这个spider,您会注意到它只访问来自 humor 标记,如 http://quotes.toscrape.com/tag/humor .</p> </p> <p><br /><pre><code style="font-size:16px;">本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击<a href="https://shimo.im/forms/N2A1gvJRpPh7K9qD/fill" target="_blank" rel="nofollow">【内容举报】</a>进行投诉反馈!</code></pre></p> <!-- E 正文 --> <link href="https://qiniu.techgrow.cn/readmore/dist/readmore.css" type="text/css" rel="stylesheet"> <script src="https://qiniu.techgrow.cn/readmore/dist/readmore.js" type="text/javascript"></script> <script> var regex = /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i var isMobile = navigator.userAgent.match(regex); if (!isMobile) { try { var plugin = new ReadmorePlugin(); plugin.init({ id: "readmore-container", blogId: "55721-7689706765131-406", name: "财经早读", keyword: "666", qrcode: "https://www.imspm.com/assets/img/caijingzaodu.jpg", type: "website", height: "auto", expires: "7", interval: "60", random: "1" }) } catch (e) { console.warn("readmore plugin occurred error: " + e.name + " | " + e.message); } } </script> </div> <!-- S 付费阅读 --> <!-- E 付费阅读 --> <!-- S 点赞 --> <div class="article-donate"> <a href="javascript:" class="btn btn-primary btn-like btn-lg social-share-icon icon-heart addbookbark" data-type="archives" data-aid="44667" data-action="/addons/cms/ajax/collection.html">收藏</a> </div> <!-- E 点赞 --> <div class="entry-meta"> <ul> <!-- S 归档 --> <li>标签:<a href="/dev.html" class="tag" rel="tag" target="_blank">技术</a></li> <!-- S 归档 --> </ul> <ul class="article-prevnext"> <!-- S 上一篇下一篇 --> <li> <span>上一篇 ></span> <a href="/dev/44665.html" target="_blank">Python爬虫教程(二)</a> </li> <li> <span>下一篇 ></span> <a href="/dev/44670.html" target="_blank">工程探索仿生机器人</a> </li> <!-- E 上一篇下一篇 --> </ul> </div> <div class="related-article"> <div class="row" style="margin: 0 -15px;"> <!-- S 相关文章 --> <div class="col-xs-12"> <h3 style="font-size: 1.1em;">相关文章</h5> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747938.html" target="_blank">Duilib中list控件支持ctrl和shif多行选中的实现</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747937.html" target="_blank">[ICML2015]Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shif</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747936.html" target="_blank">win10系统 微软输入法 于eclipse ctrl+shif+f冲突间接处理办法</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747935.html" target="_blank">Codeforces Round #259 (Div. 2) B. Little Pony and Sort by Shif</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747934.html" target="_blank">读LDD3,内存映射与DMA--PAGE_SHIF…</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747933.html" target="_blank">VMware虚拟机安装XP【要先分区,再设置BOOT 启动CD,shif+上移】</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747932.html" target="_blank">更换iBus五笔的左与右Shif</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747931.html" target="_blank">sublime ctrl+shif+f 没用解决办法</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747930.html" target="_blank">idea 对 ctrl + z 的撤销 是 ctrl + shif + z</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747929.html" target="_blank">计算机最早的设计师应用于,计算机应用基础选择题doc.doc</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747928.html" target="_blank">win10自带截图神器:Win+Shift+S</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747927.html" target="_blank">Python基础之文件目录操作</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747926.html" target="_blank">python简述目录_Python基础之文件目录操作(示例代码)</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747925.html" target="_blank">tp5 如何做数据采集</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747924.html" target="_blank">任务2-7(服务器字体+阿里巴巴矢量库)</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747923.html" target="_blank">html标签(1):h1~h6,p,br,pre,hr</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747922.html" target="_blank">TI 电量计介绍与芯片选型指南</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747921.html" target="_blank">几款TI电源芯片简介</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747920.html" target="_blank">TI DSP芯片C2000系列读取FLASH数据</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747919.html" target="_blank">德州仪器(Ti)平台嵌入式开发基础</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747918.html" target="_blank">TI三相电机智能栅极驱动芯片特点分类</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747917.html" target="_blank">省选模拟(12.08) T3 圈圈圈圈圈圈圈圈</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747916.html" target="_blank">Hadoop生态圈技术栈(上)</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747915.html" target="_blank">大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之6.Impala交互式查询</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747914.html" target="_blank">小猿圈之Linux下Mysql 操作命令</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747913.html" target="_blank">大数据Hadoop生态圈常用面试题</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747912.html" target="_blank">大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之4.Hive DDL、DQL和数据操作</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747911.html" target="_blank">备战Noip2018模拟赛11(B组)T3 Monogatari 物语</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747910.html" target="_blank">【智能优化算法-圆圈搜索算法】基于圆圈搜索算法Circle Search Algorithm求解单目标优化问题附matlab代码</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747909.html" target="_blank">NYOJ 78 圈水池</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747908.html" target="_blank">递归问题 跑道 汽车 绕圈问题 Python实现</a></p> </div> <div class="col-xs-12"> <p style="margin-top: 17px;margin-bottom: 8.5px;"><a href="/dev/747907.html" target="_blank">Hadoop生态圈(三):MapReduce</a></p> </div> <!-- E 相关文章 --> </div> </div> <div class="clearfix"></div> </div> </div> </main> <aside class="col-xs-12 col-md-4"> <!--@formatter:off--> <!--@formatter:on--> <!-- S 内容推荐 --> <div class="panel panel-default hot-article"> <div class="panel-heading"> <h3 class="panel-title">内容推荐</h3> </div> <div class="panel-body"> <div class="media media-number"> <div class="media-left"> <span class="num tag">1</span> </div> <div class="media-body"> <a class="link-dark" href="/jiaohutiyan/753475.html" title="大厂出品!保姆级教程帮你掌握「用户体验要素」" target="_blank">大厂出品!保姆级教程帮你掌握「用户体验要素」</a> </div> </div> <div class="media media-number"> <div class="media-left"> <span class="num tag">2</span> </div> <div class="media-body"> <a class="link-dark" href="/jiaohutiyan/753348.html" title="大厂实战案例!设计师如何助力京东快递业务增长?" target="_blank">大厂实战案例!设计师如何助力京东快递业务增长?</a> </div> </div> <div class="media media-number"> <div class="media-left"> <span class="num tag">3</span> </div> <div class="media-body"> <a class="link-dark" href="/jiaohutiyan/753116.html" title="总监干货!5个常见的UI设计规范创建误区" target="_blank">总监干货!5个常见的UI设计规范创建误区</a> </div> </div> <div class="media media-number"> <div class="media-left"> <span class="num tag">4</span> </div> <div class="media-body"> <a class="link-dark" href="/kaifagongju/752540.html" title="数据库管理利器——Navicat Premium v17.0.4学习版(Windows+MacOS+Linux)" target="_blank">数据库管理利器——Navicat Premium v17.0.4学习版(Windows+MacOS+Linux)</a> </div> </div> <div class="media media-number"> <div class="media-left"> <span class="num tag">5</span> </div> <div class="media-body"> <a class="link-dark" href="/jiaohutiyan/750353.html" title="进阶必学!快速掌握10种国际主流设计模型" target="_blank">进阶必学!快速掌握10种国际主流设计模型</a> </div> </div> <div class="media media-number"> <div class="media-left"> <span class="num tag">6</span> </div> <div class="media-body"> <a class="link-dark" href="/jiaohutiyan/750352.html" title="春节期间,10个大厂的产品细节走心设计" target="_blank">春节期间,10个大厂的产品细节走心设计</a> </div> </div> <div class="media media-number"> <div class="media-left"> <span class="num tag">7</span> </div> <div class="media-body"> <a class="link-dark" href="/jiaohutiyan/747940.html" title="如何帮助用户度过新人期?来看雪球APP的实战总结!" target="_blank">如何帮助用户度过新人期?来看雪球APP的实战总结!</a> </div> </div> <div class="media media-number"> <div class="media-left"> <span class="num tag">8</span> </div> <div class="media-body"> <a class="link-dark" href="/ruanjianzixun/42357.html" title="Sketch 95.3最新版下载 (Sketch矢量绘图应用软件)" target="_blank">Sketch 95.3最新版下载 (Sketch矢量绘图应用软件)</a> </div> </div> <div class="media media-number"> <div class="media-left"> <span class="num tag">9</span> </div> <div class="media-body"> <a class="link-dark" href="/ruanjianzixun/42356.html" title="Axure RP 9 最新正式版安装软件与汉化语言包下载(2023年3月30日更新)" target="_blank">Axure RP 9 最新正式版安装软件与汉化语言包下载(2023年3月30日更新)</a> </div> </div> <div class="media media-number"> <div class="media-left"> <span class="num tag">10</span> </div> <div class="media-body"> <a class="link-dark" href="/chanpinsheji/42343.html" title="嘘!SaaS产品的差异化设计细节,一般人我不告诉他" target="_blank">嘘!SaaS产品的差异化设计细节,一般人我不告诉他</a> </div> </div> </div> </div> <!-- E 内容推荐 --> <div class="panel panel-blockimg"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6421005227861480" crossorigin="anonymous"></script> <!-- 右侧正方形 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6421005227861480" data-ad-slot="1989994359" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="panel panel-default lasest-update"> <!-- S 最近更新 --> <div class="panel-heading"> <h3 class="panel-title">最新更新</h3> </div> <div class="panel-body"> <ul class="list-unstyled"> <li> <span><a href="/chanpinjingli.html" target="_blank">[产品经理]</a></span> <a class="link-dark" href="/chanpinjingli/758173.html" title="3分钟绘制流程图!这个AI+绘图工具的神仙组合,学完老板直呼内行" target="_blank">3分钟绘制流程图!这个AI+绘图工具的神仙组合,学完老板直呼内行</a> </li> <li> <span><a href="/chanpinjingli.html" target="_blank">[产品经理]</a></span> <a class="link-dark" href="/chanpinjingli/758172.html" title="商业潜规则:打败你的不是AI,而是人性" target="_blank">商业潜规则:打败你的不是AI,而是人性</a> </li> <li> <span><a href="/chanpinsheji.html" target="_blank">[产品设计]</a></span> <a class="link-dark" href="/chanpinsheji/758171.html" title="DeepSeek+智能派单系统的实践分享" target="_blank">DeepSeek+智能派单系统的实践分享</a> </li> <li> <span><a href="/chanpinjingli.html" target="_blank">[产品经理]</a></span> <a class="link-dark" href="/chanpinjingli/758170.html" title="一文读懂本年实际损益借(贷)方发生额" target="_blank">一文读懂本年实际损益借(贷)方发生额</a> </li> <li> <span><a href="/chuangyexueyuan.html" target="_blank">[创业学院]</a></span> <a class="link-dark" href="/chuangyexueyuan/758169.html" title="大客户 vs 中小企业:需求竟天差地别?以企业培训数字化为例" target="_blank">大客户 vs 中小企业:需求竟天差地别?以企业培训数字化为例</a> </li> <li> <span><a href="/chanpinjingli.html" target="_blank">[产品经理]</a></span> <a class="link-dark" href="/chanpinjingli/758168.html" title="不要将员工的“猴子”背到自己身上:职场管理中的权责划分" target="_blank">不要将员工的“猴子”背到自己身上:职场管理中的权责划分</a> </li> <li> <span><a href="/chanpinjingli.html" target="_blank">[产品经理]</a></span> <a class="link-dark" href="/chanpinjingli/758167.html" title="人工智能的三层架构:从应用层到基础服务层,解密智能革命" target="_blank">人工智能的三层架构:从应用层到基础服务层,解密智能革命</a> </li> <li> <span><a href="/chanpinsheji.html" target="_blank">[产品设计]</a></span> <a class="link-dark" href="/chanpinsheji/758166.html" title="一文讲清楚iOS的SKAN4.0" target="_blank">一文讲清楚iOS的SKAN4.0</a> </li> </ul> </div> <!-- E 最近更新 --> </div> <!-- S 热门标签 --> <div class="panel panel-default hot-tags"> <div class="panel-heading"> <h3 class="panel-title">热门标签</h3> </div> <div class="panel-body"> <div class="tags"> <a href="/channel/数量.html" class="tag" target="_blank"> <span>数量</span></a> <a href="/channel/AI技术趋势.html" class="tag" target="_blank"> <span>AI技术趋势</span></a> <a href="/channel/用户角色.html" class="tag" target="_blank"> <span>用户角色</span></a> <a href="/channel/心智游移.html" class="tag" target="_blank"> <span>心智游移</span></a> <a href="/channel/自然生态系统.html" class="tag" target="_blank"> <span>自然生态系统</span></a> <a href="/channel/会员权益.html" class="tag" target="_blank"> <span>会员权益</span></a> <a href="/channel/AirDrop.html" class="tag" target="_blank"> <span>AirDrop</span></a> <a href="/channel/hashmap.html" class="tag" target="_blank"> <span>hashmap</span></a> <a href="/channel/小龙虾.html" class="tag" target="_blank"> <span>小龙虾</span></a> <a href="/channel/焦虑.html" class="tag" target="_blank"> <span>焦虑</span></a> <a href="/channel/危机处理.html" class="tag" target="_blank"> <span>危机处理</span></a> <a href="/channel/发展.html" class="tag" target="_blank"> <span>发展</span></a> <a href="/channel/微信群折叠.html" class="tag" target="_blank"> <span>微信群折叠</span></a> <a href="/channel/toast.html" class="tag" target="_blank"> <span>toast</span></a> <a href="/channel/测评新算法.html" class="tag" target="_blank"> <span>测评新算法</span></a> <a href="/channel/改版.html" class="tag" target="_blank"> <span>改版</span></a> <a href="/channel/wireshark.html" class="tag" target="_blank"> <span>wireshark</span></a> <a href="/channel/投放方式.html" class="tag" target="_blank"> <span>投放方式</span></a> <a href="/channel/音频播放动效.html" class="tag" target="_blank"> <span>音频播放动效</span></a> <a href="/channel/timer.html" class="tag" target="_blank"> <span>timer</span></a> <a href="/channel/女性商业.html" class="tag" target="_blank"> <span>女性商业</span></a> <a href="/channel/古典自媒体.html" class="tag" target="_blank"> <span>古典自媒体</span></a> <a href="/channel/海外博主.html" class="tag" target="_blank"> <span>海外博主</span></a> <a href="/channel/repeater.html" class="tag" target="_blank"> <span>repeater</span></a> <a href="/channel/转账.html" class="tag" target="_blank"> <span>转账</span></a> <a href="/channel/万能钥匙.html" class="tag" target="_blank"> <span>万能钥匙</span></a> <a href="/channel/秋招.html" class="tag" target="_blank"> <span>秋招</span></a> <a href="/channel/快服务.html" class="tag" target="_blank"> <span>快服务</span></a> <a href="/channel/个人演讲.html" class="tag" target="_blank"> <span>个人演讲</span></a> <a href="/channel/客户共识.html" class="tag" target="_blank"> <span>客户共识</span></a> </div> </div> </div> <!-- E 热门标签 --> </aside> </div> </div> </main> <footer> <div id="footer"> <div class="container"> <div class="row footer-inner"> <div class="col-xs-12"> <div class="footer-logo pull-left mr-4"> <a href="/"><i class="fa fa-bookmark"></i></a> </div> <div class="pull-left"> Copyright © 2025 All rights reserved. 超级产品经理 <a href="https://beian.miit.gov.cn" target="_blank" rel="noopener">浙ICP备14026978号-4</a> <ul class="list-unstyled list-inline mt-2"> <li><a href="/p/aboutus.html" target="_blank">关于网站</a></li> <li><a href="/contactus.html" rel="nofollow" target="_blank">联系我们</a></li> </ul> </div> </div> </div> </div> </div> </footer> <div id="floatbtn"> <!-- S 浮动按钮 --> <a class="hover" href="/index/cms.archives/post.html" target="_blank"> <i class="iconfont icon-pencil"></i> <em>立即<br>投稿</em> </a> <div class="floatbtn-item floatbtn-share"> <i class="iconfont icon-share"></i> <div class="floatbtn-wrapper" style="height:50px;top:0"> <div class="social-share" data-initialized="true" data-mode="prepend"> <a href="#" class="social-share-icon icon-weibo" target="_blank"></a> <a href="#" class="social-share-icon icon-qq" target="_blank"></a> <a href="#" class="social-share-icon icon-qzone" target="_blank"></a> <a href="#" class="social-share-icon icon-wechat"></a> </div> </div> </div> <a href="javascript:;"> <i class="iconfont icon-qrcode"></i> <div class="floatbtn-wrapper"> <div class="qrcode"><img src="https://www.imspm.com/assets/img/gongzhonghao.jpg"></div> <p>微信公众账号</p> <p>微信扫一扫加关注</p> </div> </a> <a id="back-to-top" class="hover" href="javascript:;"> <i class="iconfont icon-backtotop"></i> <em>返回<br>顶部</em> </a> <!-- E 浮动按钮 --> </div> <script type="text/javascript" src="/assets/libs/jquery/dist/jquery.min.js?v=1.0.10"></script> <script type="text/javascript" src="/assets/libs/bootstrap/dist/js/bootstrap.min.js?v=1.0.10"></script> <script type="text/javascript" src="/assets/libs/fastadmin-layer/dist/layer.js?v=1.0.10"></script> <script type="text/javascript" src="/assets/libs/art-template/dist/template-native.js?v=1.0.10"></script> <script type="text/javascript" src="/assets/addons/cms/js/jquery.autocomplete.js?v=1.0.10"></script> <script type="text/javascript" src="/assets/addons/cms/js/swiper.min.js?v=1.0.10"></script> <script type="text/javascript" src="/assets/addons/cms/js/share.min.js?v=1.0.10"></script> <script type="text/javascript" src="/assets/addons/cms/js/cms.js?v=1.0.10"></script> <script type="text/javascript" src="/assets/addons/cms/js/common.js?v=1.0.10"></script> </body> </html>