转自http://www.jianshu.com/p/a8aad3bf4dc4


Scrapy介绍

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。抓取网页的一般方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。
Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。

整体架构


  • 引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务。

  • 调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。

  • 下载器(Downloader),用于下载网页内容,并将网页内容返回给蜘蛛。

  • 蜘蛛(Spiders),蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。

  • 项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

  • 下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。

  • 蜘蛛中间件(Spider Middlewares),介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。

  • 调度中间件(Scheduler Middlewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

爬取流程

上图绿线是数据流向,首先从初始URL开始,Scheduler会将其交给Downloader进行下载,下载之后会交给Spider进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回Scheduler;另一种是需要保存的数据,它们则被送到Item Pipeline那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。

数据流

Scrapy中的数据流由执行引擎控制,其过程如下:

  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,引擎关闭该网站。

Scrapy项目基本流程

默认的Scrapy项目结构

使用全局命令startproject创建项目,在project_name文件夹下创建一个名为project_name的Scrapy项目。

scrapy startproject myproject

虽然可以被修改,但所有的Scrapy项目默认有类似于下边的文件结构:

scrapy.cfg
myproject/
    __init__.py
    items.py
    pipelines.py
    settings.py
    spiders/
        __init__.py
        spider1.py
        spider2.py        ...

scrapy.cfg 存放的目录被认为是 项目的根目录 。该文件中包含python模块名的字段定义了项目的设置。

定义要抓取的数据

Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
类似在ORM中做的一样,您可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个Item。
首先根据需要从dmoz.org(DMOZ网站是一个著名的开放式分类目录(Open DirectoryProject),由来自世界各地的志愿者共同维护与建设的最大的全球目录社区)获取到的数据对item进行建模。 我们需要从dmoz中获取名字,url,以及网站的描述。 对此,在item中定义相应的字段。编辑items.py 文件:

import scrapyclass DmozItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

使用项目命令genspider创建Spider

scrapy genspider [-t template]

在当前项目中创建spider。
这仅仅是创建spider的一种快捷方法。该方法可以使用提前定义好的模板来生成spider。您也可以自己创建spider的源码文件。

$ scrapy genspider -l
Available templates:
  basic
  crawl
  csvfeed
  xmlfeed

$ scrapy genspider -d basicimport scrapyclass $classname(scrapy.Spider):
    name = "$name"
    allowed_domains = ["$domain"]
    start_urls = (        'http://www.$domain/',
        )    def parse(self, response):
        pass$ scrapy genspider -t basic example example.com
Created spider 'example' using template 'basic' in module:
  mybot.spiders.example

编写提取item数据的Spider

Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。
其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。
为了创建一个Spider,您必须继承 scrapy.Spider 类,且定义以下三个属性:

  • name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。

  • start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。

  • parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

import scrapyclass DmozSpider(scrapy.spider.Spider):
    name = "dmoz"    #唯一标识,启动spider时即指定该名称
    allowed_domains = ["dmoz.org"]
    start_urls = [        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]    def parse(self, response):
        filename = response.url.split("/")[-2]        with open(filename, 'wb') as f:
            f.write(response.body)

进行爬取

执行项目命令crawl,启动Spider:

scrapy crawl dmoz

在这个过程中:
Scrapy为Spider的 start_urls 属性中的每个URL创建了 scrapy.Request 对象,并将 parse 方法作为回调函数(callback)赋值给了Request。
Request对象经过调度,执行生成 scrapy.http.Response 对象并送回给spider parse() 方法。

通过选择器提取数据

Selectors选择器简介:
Scrapy提取数据有自己的一套机制。它们被称作选择器(seletors),因为他们通过特定的 XPath 或者 CSS 表达式来“选择” HTML文件中的某个部分。
XPath 是一门用来在XML文件中选择节点的语言,也可以用在HTML上。 CSS 是一门将HTML文档样式化的语言。选择器由它定义,并与特定的HTML元素的样式相关连。

XPath表达式的例子和含义:

  • /html/head/title: 选择HTML文档中 标签内的 元素</p></li> <li><p>/html/head/title/text(): 选择上面提到的 <title> 元素的文字</p></li> <li><p>//td: 选择所有的 <td> 元素</p></li> <li><p>//div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素</p></li> </ul> </blockquote> <p><strong>提取数据:</strong><br>观察HTML源码并确定合适的XPath表达式。<br>在查看了网页的源码后,您会发现网站的信息是被包含在 第二个</p> <ul class="list-paddingleft-2"> <li><p>元素中。</p></li> <li><br></li> <li><p>我们可以通过这段代码选择该页面中网站列表里所有</p></li> <li><p>元素:<br>response.xpath('//ul/li')</p><p>Item 对象是自定义的python字典。 您可以使用标准的字典语法来获取到其每个字段的值。<br>一般来说,Spider将会将爬取到的数据以 Item 对象返回。所以为了将爬取的数据返回,我们最终的代码将是:</p><pre class="hljs python">import scrapyfrom tutorial.items import DmozItemclass DmozSpider(scrapy.Spider):     name = "dmoz"     allowed_domains = ["dmoz.org"]     start_urls = [        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"     ]    def parse(self, response):         for sel in response.xpath('//ul/li'):             item = DmozItem()             item['title'] = sel.xpath('a/text()').extract()             item['link'] = sel.xpath('a/@href').extract()             item['desc'] = sel.xpath('text()').extract()            yield item</pre><p>现在对dmoz.org进行爬取将会产生 DmozItem 对象。</p><h3>保存数据</h3><p>最简单存储爬取的数据的方式是使用 Feed exports:</p> <blockquote> <p>scrapy crawl dmoz -o items.json</p> </blockquote><p>该命令将采用 JSON 格式对爬取的数据进行序列化,生成 items.json 文件。<br> 如果需要对爬取到的item做更多更为复杂的操作,您可以编写 Item Pipeline 。类似于我们在创建项目时对Item做的,用于您编写自己的 tutorial/pipelines.py 也被创建。不过如果您仅仅想要保存item,您不需要实现任何的pipeline。</p><h2>补充提示:Windows平台安装Scrapy的特别要求</h2><p>Windows specific installation notes<br>Windows平台下,安装Scrapy之前首先要进行以下操作:</p> <blockquote></blockquote><h2>小结</h2><p>第一篇关于Scrapy的文章主要依据Scrapy 0.24的中文文档,了解、熟悉Scrapy的使用和基本概念,在后面的相关文章中,将进一步加入自己的思考和自行编写的程序,期待能在这个过程中提高自己,也希望能对看到这些文章的读者有用。</p><h2>参考资料</h2><p>Scrapy架构概览<br>初窥Scrapy<br>Scrapy入门教程<br>如何入门 Python 爬虫</p><p><strong>转载请注明作者Jason Ding及其出处</strong><br>Github博客主页(http://jasonding1354.github.io/)<br>CSDN博客(http://blog.csdn.net/jasonding1354)<br>简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)</p> <ul class="list-paddingleft-2" style="list-style-type:square;"> <li><p>安装OpenSSL<br>在Win32 OpenSSL page中下载安装Visual C++ 2008 redistributables和对应的OpenSSL安装包,并把其可执行文件目录“*\openssl-win32\bin”加入到环境变量Path中</p></li> <li><p>安装Scrapy依赖的二进制包<br>pywin32<br>Twisted<br>zope.interface<br>lxml<br>pyOpenSSL</p></li> </ul></li> </ul> <p><br><br></p> <p>文/JasonDing(简书作者)<br>原文链接:http://www.jianshu.com/p/a8aad3bf4dc4<br>著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。</p> <p><br></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1176814920168189952"></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">你可能感兴趣的:(Scrapy)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1770937145754714112.htm" title="强大的开源网络爬虫框架Scrapy的基本介绍(入门级)" target="_blank">强大的开源网络爬虫框架Scrapy的基本介绍(入门级)</a> <span class="text-muted">铁松溜达py</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>Scrapy是一个强大的开源网络爬虫框架,用于从网站上抓取数据。它基于Twisted异步网络框架,可以高效地处理并发请求和数据处理。以下是Scrapy框架的一些重要特点和功能:1.**灵活的架构**:-Scrapy提供了灵活的架构,可以轻松地定义和定制爬虫逻辑、数据提取规则和数据处理流程。2.**高性能**:-Scrapy使用Twisted异步网络框架,能够高效地处理并发请求和数据处理,从而实现高</div> </li> <li><a href="/article/1767269888956628992.htm" title="scrapy 爬取当当网-图书排行榜-多条件爬取" target="_blank">scrapy 爬取当当网-图书排行榜-多条件爬取</a> <span class="text-muted">韩小禹</span> <div>自学爬虫框架scrapy,爬取当当网-图书排行榜练手目标:爬取当当网-图书畅销榜中的图书数据,要求各种条件的数据都要有。dangdang.pngspider#-*-coding:utf-8-*-importscrapyfromdd_book.itemsimportDdBookItemfromseleniumimportwebdriverfromselenium.common.exceptionsi</div> </li> <li><a href="/article/1766553407537111040.htm" title="Python爬虫项目(附源码)70个Python爬虫练手实例!" target="_blank">Python爬虫项目(附源码)70个Python爬虫练手实例!</a> <span class="text-muted">硬核Python</span> <a class="tag" taget="_blank" href="/search/%E8%81%8C%E4%B8%9A%E4%B8%8E%E5%8F%91%E5%B1%95/1.htm">职业与发展</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>文章目录Python爬虫项目70例(一):入门级Python爬虫项目70例(二):pyspiderPython爬虫项目70例(三):scrapyPython爬虫项目70例(四):手机抓取相关Python爬虫项目70例(五):爬虫进阶部分Python爬虫项目70例(六):验证码识别技术Python爬虫项目70例(七):反爬虫技术读者福利1、Python所有方向的学习路线2、Python课程视频3、精</div> </li> <li><a href="/article/1762687665506967552.htm" title="Scrapy与分布式开发(1.1):课程导学" target="_blank">Scrapy与分布式开发(1.1):课程导学</a> <span class="text-muted">九月镇灵将</span> <a class="tag" taget="_blank" href="/search/%E6%89%93%E9%80%A0%E9%AB%98%E6%95%88%E7%88%AC%E8%99%AB%E7%B3%BB%E7%BB%9F/1.htm">打造高效爬虫系统</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>Scrapy与分布式开发:从入门到精通,打造高效爬虫系统课程大纲在这个专栏中,我们将一起探索Scrapy框架的魅力,以及如何通过Scrapy-Redis实现分布式爬虫的开发。在本课程导学中,我们将为您简要介绍课程的学习目标、内容安排以及学习方法,帮助您更好地了解本专栏的学习框架和重点。学习目标掌握网页抓取核心技术与知识,包括常用请求库、提取库;掌握Scrapy框架的基础知识和核心功能,包括爬虫设计</div> </li> <li><a href="/article/1762225819926749184.htm" title="分布式scrapy_redis源码总结,及其架构" target="_blank">分布式scrapy_redis源码总结,及其架构</a> <span class="text-muted">Python之战</span> <div>分布式scrapy的组件源码介绍完了,大致总结一下,相关组件目录如下:《RedisSpider的调度队列实现过程及其源码》《scrapy中scrapy_redis分布式内置pipeline源码及其工作原理》《scrapy分布式调度源码及其实现过程》《scrapy分布式Spider源码分析及实现过程》《scrapy分布式去重组件源码及其实现过程》《scrapy_redis中序列化源码及其在程序设计中</div> </li> <li><a href="/article/1759767130875719680.htm" title="python从小白到大师-第一章Python应用(五)应用领域与常见包-爬虫" target="_blank">python从小白到大师-第一章Python应用(五)应用领域与常见包-爬虫</a> <span class="text-muted">安城安</span> <a class="tag" taget="_blank" href="/search/%E5%9F%BA%E6%9C%AC%E8%AF%AD%E8%A8%80%E6%95%99%E7%A8%8B/1.htm">基本语言教程</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>目录一.爬虫1.1urllib1.2requests1.3scrapy1.4pySpider总结一.爬虫1.1urlliburllib是Python标准库中的一个模块,它提供了一组用于处理URL(统一资源定位符)的函数和类。通过urllib,我们可以方便地进行URL的解析、访问和处理。该模块主要包括以下几个子模块:urllib.request:用于发送HTTP请求和获取远程数据的模块。urllib</div> </li> <li><a href="/article/1759714390724145152.htm" title="Python招聘信息爬虫+数据分析+可视化系统+薪资预测+岗位推荐(大数据项目)计算机毕业设计 源码下载" target="_blank">Python招聘信息爬虫+数据分析+可视化系统+薪资预测+岗位推荐(大数据项目)计算机毕业设计 源码下载</a> <span class="text-muted">计算机毕业设计指导</span> <div>boss直聘招聘信息爬虫+数据分析+可视化系统+薪资预测+岗位推荐(大数据项目)计算机毕业设计源码下载一、开发技术pycharm、MySQL数据库/sqlite3数据库、Python3.x版本、Flask框架、Scrapy框架、词云、echartsanconda3、chrome_driver1、开发框架前端htmlcssajax后端flaskrequestspandas数据库mysql二、功能招聘</div> </li> <li><a href="/article/1759666429893898240.htm" title="爬虫学习笔记-scrapy链接提取器爬取读书网链接写入MySQL数据库" target="_blank">爬虫学习笔记-scrapy链接提取器爬取读书网链接写入MySQL数据库</a> <span class="text-muted">DevCodeMemo</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>1.终端运行scrapystartprojectscrapy_read,创建项目2.登录读书网,选择国学(随便点一个)3.复制链接(后面修改为包括其他页)4.创建爬虫文件,并打开5.滑倒下方翻页处,右键2,点击检查,查看到a标签网址,复制6.修改爬虫文件规则allow(正则表达式),'\d'表示数字,'+'表示多个,'\.'使'.'生效7.在parse_item中编写打印,scrapycrawlr</div> </li> <li><a href="/article/1759666176637628416.htm" title="爬虫学习笔记-scrapy爬取电影天堂(双层网址嵌套)" target="_blank">爬虫学习笔记-scrapy爬取电影天堂(双层网址嵌套)</a> <span class="text-muted">DevCodeMemo</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>1.终端运行scrapystartprojectmovie,创建项目2.接口查找3.终端cd到spiders,cdscrapy_carhome/scrapy_movie/spiders,运行scrapygenspidermvhttps://dy2018.com/4.打开mv,编写代码,爬取电影名和网址5.用爬取的网址请求,使用meta属性传递name,callback调用自定义的parse_sec</div> </li> <li><a href="/article/1759665922135650304.htm" title="爬虫学习笔记-scrapy爬取当当网" target="_blank">爬虫学习笔记-scrapy爬取当当网</a> <span class="text-muted">DevCodeMemo</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>1.终端运行scrapystartprojectscrapy_dangdang,创建项目2.接口查找3.cd100个案例/Scrapy/scrapy_dangdang/scrapy_dangdang/spiders到文件夹下,创建爬虫程序4.items定义ScrapyDangdangItem的数据结构(要爬取的数据)src,name,price5.爬取src,name,price数据导入items</div> </li> <li><a href="/article/1759663765428727808.htm" title="python3爬虫--入门篇3--url去重策略" target="_blank">python3爬虫--入门篇3--url去重策略</a> <span class="text-muted">布口袋_天晴了</span> <div>1.访问过的url保存到数据库中[频繁存取,时间消耗高]2.将访问过的url保存到set中,只需要o(1)的代价[内存的占用量会较高]3.url经过md5等哈希后保存到set中。[Scrapy默认采用md5方法压缩url的,内存占用会大大减小]4.用bitmap方法,将访问过的url通过hash函数映射到某一位[压缩更多,极大节省内存,但哈希冲突的可能性还是比较大]5.bloomfilter方法对</div> </li> <li><a href="/article/1759427245648195584.htm" title="基于python的分布式爬虫框架_基于scrapy-redis的通用分布式爬虫框架" target="_blank">基于python的分布式爬虫框架_基于scrapy-redis的通用分布式爬虫框架</a> <span class="text-muted">summer_ccs</span> <div>spiderman基于scrapy-redis的通用分布式爬虫框架目录demo采集效果爬虫元数据cluster模式standalone模式kafka实时采集监控功能自动建表自动生成爬虫代码,只需编写少量代码即可完成分布式爬虫自动存储元数据,分析统计和补爬都很方便适合多站点开发,每个爬虫独立定制,互不影响调用方便,可以根据传参自定义采集的页数以及启用的爬虫数量扩展简易,可以根据需要选择采集模式,单机</div> </li> <li><a href="/article/1759426729413259264.htm" title="手写myscrapy(二)" target="_blank">手写myscrapy(二)</a> <span class="text-muted">semicolon_hello</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>我们看一下scrapy的系统架构设计方法和思路:模块化设计:Scrapy采用模块化设计,将整个系统划分为多个独立的模块,包括引擎(Engine)、调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)、项目管道(ItemPipeline)等。每个模块都负责处理特定的任务,并通过标准化的接口与其他模块进行通信。这种设计使得Scrapy的各个部分可以独立开发、测试和扩展,提</div> </li> <li><a href="/article/1759426728029138944.htm" title="Python爬虫开发:Scrapy框架与Requests库" target="_blank">Python爬虫开发:Scrapy框架与Requests库</a> <span class="text-muted">数据小爬虫</span> <a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%95%86api/1.htm">电商api</a><a class="tag" taget="_blank" href="/search/api/1.htm">api</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%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/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>Python爬虫开发中有两个非常流行的工具:Scrapy框架和Requests库。它们各自有自己的优点和适用场景。ScrapyScrapy是一个为了爬取网站并提取结构化数据而编写的应用框架,可以非常方便地实现网页信息的抓取。Scrapy提供了多种可配置、可重用的组件,如调度器、下载器、爬虫和管道等,使得开发者可以快速地构建出稳定、高效的网络爬虫。Scrapy的主要特点包括:异步处理:Scrapy基</div> </li> <li><a href="/article/1759423906034298880.htm" title="Day 25 25.2 Scrapy框架之分布式爬虫(scrapy_redis)" target="_blank">Day 25 25.2 Scrapy框架之分布式爬虫(scrapy_redis)</a> <span class="text-muted">Chimengmeng</span> <a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>分布式爬虫(scrapy_redis)分布式爬虫是指将一个大型的爬虫任务分解成多个子任务,由多个爬虫进程或者多台机器同时执行的一种爬虫方式。在分布式爬虫中,每个爬虫进程或者机器都具有独立的爬取能力,可以独立地爬取指定的网页或者网站,然后将爬取到的数据进行汇总和处理。分布式爬虫相对于单机爬虫的优势在于:高效性:分布式爬虫可以同时爬取多个网页或者网站,从而大大提高爬取速度和效率。可扩展性:分布式爬虫可</div> </li> <li><a href="/article/1759422750478381056.htm" title="基于scrapy框架的单机爬虫与分布式爬虫" target="_blank">基于scrapy框架的单机爬虫与分布式爬虫</a> <span class="text-muted">Jesse_Kyrie</span> <a class="tag" taget="_blank" href="/search/python%E7%88%AC%E8%99%AB%E7%BB%BC%E5%90%88/1.htm">python爬虫综合</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>我们知道,对于scrapy框架来说,不仅可以单机构建复杂的爬虫项目,还可以通过简单的修改,将单机版爬虫改为分布式的,大大提高爬取效率。下面我就以一个简单的爬虫案例,介绍一下如何构建一个单机版的爬虫,并做简单修改,使其实现分布式功能。需求分析访问页面,并实现1-10页的页面爬取,并保存到data目录下解析页面,并获取到图片链接,并下载图片,保存到imgs目录下单机版爬虫准备爬虫项目使用命令构建爬虫项</div> </li> <li><a href="/article/1757800234714415104.htm" title="使用scrapy爬取时遇到错误TypeError: 'builtin_function_or_method' object is not subscriptable" target="_blank">使用scrapy爬取时遇到错误TypeError: 'builtin_function_or_method' object is not subscriptable</a> <span class="text-muted">悟饭哪</span> <div>我的代码是这样写的defparse(self,response):sel=scrapy.selector.Selector(response)sites=sel.xpath('//div[@class="title-and-desc"]')items=[]forsiteinsites:item=DmozItem()item['title']=site.xpath('a/div/text()').e</div> </li> <li><a href="/article/1757729932668059648.htm" title="python从入门到精通(二十二):python爬虫框架使用" target="_blank">python从入门到精通(二十二):python爬虫框架使用</a> <span class="text-muted">HACKNOE</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pycharm/1.htm">pycharm</a> <div>selenium自动化scrapy框架pyspider框架爬虫验证码动态渲染页面爬取模拟登录AutoScraper</div> </li> <li><a href="/article/1757697845906915328.htm" title="Scrapy创建项目" target="_blank">Scrapy创建项目</a> <span class="text-muted">anasdi</span> <div>一、打开一个新的文件夹二、设置当前环境(把安装了scrapy库的python环境放进去)三、创建scrapy项目此时你的demo下多了一个demo1项目了四、创建一只爬虫(这个是最重要的,没爬虫哪来的爬取信息--)</div> </li> <li><a href="/article/1757615832013225984.htm" title="Scrapy | 全方位解析Scrapy框架!" target="_blank">Scrapy | 全方位解析Scrapy框架!</a> <span class="text-muted">谢小磊</span> <div>1、架构介绍Scrapy使用了Twisted异步网络库来处理网络通讯。整体架构大致如下:model.PNG它可以分为如下的几个部分:Engine。引擎,处理整个系统的数据流处理、触发事务,是整个框架的核心。Item。项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成该Item对象。Scheduler。调度器,接受引擎发过来的请求并将其加入队列中,在引擎再次请求的时候将请求提供给引擎。Downl</div> </li> <li><a href="/article/1757611599645917184.htm" title="scrapy中调用自定义方法" target="_blank">scrapy中调用自定义方法</a> <span class="text-muted">format_b1d8</span> <div>在项目中有一个需求,就是需要根据不同的id进行不同的切片,好不容易找到了对应的关系,本来想可以在parse中直接调用,然后再自定义方法中直接yield,理论上感觉应该是这样的:parse界面自定义方法想在get_detail方法中直接yield去下一个回调方法,但是运行发现根本去不了回调方法里面,头疼...后来经查询,scrapy只支持yield方式传递Request,FormRequest对象,</div> </li> <li><a href="/article/1757594907024834560.htm" title="Python学习之路-爬虫提高:scrapy基础" target="_blank">Python学习之路-爬虫提高:scrapy基础</a> <span class="text-muted">geobuins</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>Python学习之路-爬虫提高:scrapy基础为什么要学习scrapy通过前面的学习,我们已经能够解决90%的爬虫问题了,那么scrapy是为了解决剩下的10%的问题么,不是,scrapy框架能够让我们的爬虫效率更高什么是scrapyScrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取。Scrapy使用了Twisted['twɪstɪd]</div> </li> <li><a href="/article/1757594523652866048.htm" title="Python学习之路-爬虫提高:scrapy使用" target="_blank">Python学习之路-爬虫提高:scrapy使用</a> <span class="text-muted">geobuins</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>Python学习之路-爬虫提高:scrapy使用scrapy项目实现流程创建一个scrapy项目:scrapystartprojectmySpider生成一个爬虫:scrapygenspideritcast"itcast.cn提取数据:完善spider,使用xpath等方法保存数据:pipeline中保存数据创建scrapy项目下面以抓取传智师资库来学习scrapy的入门使用:http://www</div> </li> <li><a href="/article/1757395710732419072.htm" title="Scrapy爬虫爬取书籍网站信息(二)" target="_blank">Scrapy爬虫爬取书籍网站信息(二)</a> <span class="text-muted">无情Array</span> <a class="tag" taget="_blank" href="/search/Python%E8%AF%AD%E8%A8%80/1.htm">Python语言</a><a class="tag" taget="_blank" href="/search/Scrapy%E7%88%AC%E8%99%AB/1.htm">Scrapy爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>上文中我们了解到了如何在网页中的源代码中查找到相关信息,接下来进行页面爬取工作:1、首先创建一个Scrapy项目,取名为toscrape_book,接下来创建Spider文件以及Spider类,步骤如下:整个Scrapy框架建于D盘下的pycodes文件夹中,并在文件夹下的Spider文件中建立一个名为books的爬虫文件。2、在实现Spider之前,先定义封装书籍信息的Item类,在toscra</div> </li> <li><a href="/article/1757379972567154688.htm" title="python scrapy 模拟登录(使用selenium自动登录)" target="_blank">python scrapy 模拟登录(使用selenium自动登录)</a> <span class="text-muted">SkTj</span> <div>常用1、scrapystartprojectsi放chromedriver.exe到si/si文件夹里2、visettings.pyUSER_AGENT='Mozilla/5.0(Macintosh;IntelMacOSX10_8_3)AppleWebKit/536.5(KHTML,likeGecko)Chrome/19.0.1084.54Safari/536.5'ROBOTSTXT_OBEY=F</div> </li> <li><a href="/article/1757345336667422720.htm" title="如何爬虫开发工具" target="_blank">如何爬虫开发工具</a> <span class="text-muted">命令执行</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>爬虫开发工具是帮助开发者实现爬虫功能的软件或库。下面介绍一些常用的爬虫开发工具:1.Python:Python是一种非常流行的编程语言,也是爬虫开发的首选语言。在Python中,有许多用于爬虫开发的库,如Requests、BeautifulSoup、Scrapy等。2.Scrapy:Scrapy是一个功能强大的Python爬虫框架,提供了高效的爬取、处理和存储数据的功能。它可以帮助开发者快速搭建起</div> </li> <li><a href="/article/1757023973977112576.htm" title="[韩顺平]python笔记" target="_blank">[韩顺平]python笔记</a> <span class="text-muted">超级用户 root</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/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>AI工程师、运维工程师python排名逐年上升,为什么?python对大数据分析、人工智能中关键的机器学习、深度学习都提供有力的支持Python支持最庞大的代码库,功能超强数据分析:numpy/pandas/os机器学习:tensorflow/scikit-learn/theano爬虫:urllib/reques/bs4/scrapy网页开发:Django/falsk/web运维:saltstac</div> </li> <li><a href="/article/1757022621582508032.htm" title="爬虫协议" target="_blank">爬虫协议</a> <span class="text-muted">部落大圣</span> <div>今天才知道爬虫协议,我也是服了自己。之前就是在scrapy库下设置里,接触到爬虫协议。就是简单的是否遵守。今天在听网络课堂才知道很多网站都有,里面允许你做的操作,不允许的操作。如爬取多个页面,给你建议的网络延迟时间等。如果不遵循你就要小心了,很可能封你的IP[爬虫协议][https://baike.baidu.com/item/robots%E5%8D%8F%E8%AE%AE/2483797?fr</div> </li> <li><a href="/article/1756984227871604736.htm" title="[Scrapy-6] XPath使用的一个坑" target="_blank">[Scrapy-6] XPath使用的一个坑</a> <span class="text-muted">禅与发现的乐趣</span> <div>先上代码:importscrapyfromscrapy.selectorimportSelectorclassQuoteSpider(scrapy.Spider):name="quotes"start_urls=["http://quotes.toscrape.com/"]defparse(self,response):quotes=response.xpath("//div[@class='qu</div> </li> <li><a href="/article/1756785242057752576.htm" title="sheng的学习笔记-网络爬虫scrapy框架" target="_blank">sheng的学习笔记-网络爬虫scrapy框架</a> <span class="text-muted">coldstarry</span> <a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6%E5%88%86%E6%9E%90/1.htm">框架分析</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a> <div>基础知识:scrapy介绍何为框架,就相当于一个封装了很多功能的结构体,它帮我们把主要的结构给搭建好了,我们只需往骨架里添加内容就行。scrapy框架是一个为了爬取网站数据,提取数据的框架,我们熟知爬虫总共有四大部分,请求、响应、解析、存储,scrapy框架都已经搭建好了。scrapy是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架,scrapy使用了一种</div> </li> <li><a href="/article/67.htm" title="jvm调优总结(从基本概念 到 深度优化)" target="_blank">jvm调优总结(从基本概念 到 深度优化)</a> <span class="text-muted">oloz</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</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/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a> <div>JVM参数详解:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html   Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 </div> </li> <li><a href="/article/194.htm" title="【Scala十六】Scala核心十:柯里化函数" target="_blank">【Scala十六】Scala核心十:柯里化函数</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>本篇文章重点说明什么是函数柯里化,这个语法现象的背后动机是什么,有什么样的应用场景,以及与部分应用函数(Partial Applied Function)之间的联系   1. 什么是柯里化函数 A way to write functions with multiple parameter lists. For instance def f(x: Int)(y: Int) is a </div> </li> <li><a href="/article/321.htm" title="HashMap" target="_blank">HashMap</a> <span class="text-muted">dalan_123</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>HashMap在java中对很多人来说都是熟的;基于hash表的map接口的非同步实现。允许使用null和null键;同时不能保证元素的顺序;也就是从来都不保证其中的元素的顺序恒久不变。 1、数据结构     在java中,最基本的数据结构无外乎:数组 和 引用(指针),所有的数据结构都可以用这两个来构造,HashMap也不例外,归根到底HashMap就是一个链表散列的数据</div> </li> <li><a href="/article/448.htm" title="Java Swing如何实时刷新JTextArea,以显示刚才加append的内容" target="_blank">Java Swing如何实时刷新JTextArea,以显示刚才加append的内容</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%9B%B4%E6%96%B0/1.htm">更新</a><a class="tag" taget="_blank" href="/search/swing/1.htm">swing</a><a class="tag" taget="_blank" href="/search/JTextArea/1.htm">JTextArea</a> <div>在代码中执行完textArea.append("message")后,如果你想让这个更新立刻显示在界面上而不是等swing的主线程返回后刷新,我们一般会在该语句后调用textArea.invalidate()和textArea.repaint()。 问题是这个方法并不能有任何效果,textArea的内容没有任何变化,这或许是swing的一个bug,有一个笨拙的办法可以实现</div> </li> <li><a href="/article/575.htm" title="servlet或struts的Action处理ajax请求" target="_blank">servlet或struts的Action处理ajax请求</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>其实处理ajax的请求非常简单,直接看代码就行了: //如果用的是struts //HttpServletResponse response = ServletActionContext.getResponse(); // 设置输出为文字流 response.setContentType("text/plain"); // 设置字符集 res</div> </li> <li><a href="/article/702.htm" title="FineReport的公式编辑框的语法简介" target="_blank">FineReport的公式编辑框的语法简介</a> <span class="text-muted">老A不折腾</span> <a class="tag" taget="_blank" href="/search/finereport/1.htm">finereport</a><a class="tag" taget="_blank" href="/search/%E5%85%AC%E5%BC%8F/1.htm">公式</a><a class="tag" taget="_blank" href="/search/%E6%80%BB%E7%BB%93/1.htm">总结</a> <div>FINEREPORT用到公式的地方非常多,单元格(以=开头的便被解析为公式),条件显示,数据字典,报表填报属性值定义,图表标题,轴定义,页眉页脚,甚至单元格的其他属性中的鼠标悬浮提示内容都可以写公式。 简单的说下自己感觉的公式要注意的几个地方:   1.if语句语法刚接触感觉比较奇怪,if(条件式子,值1,值2),if可以嵌套,if(条件式子1,值1,if(条件式子2,值2,值3)</div> </li> <li><a href="/article/829.htm" title="linux mysql 数据库乱码的解决办法" target="_blank">linux mysql 数据库乱码的解决办法</a> <span class="text-muted">墙头上一根草</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><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%E4%B9%B1%E7%A0%81/1.htm">数据库乱码</a> <div>linux 上mysql数据库区分大小写的配置 lower_case_table_names=1 1-不区分大小写 0-区分大小写   修改/etc/my.cnf 具体的修改内容如下:   [client] default-character-set=utf8   [mysqld] datadir=/var/lib/mysql socket=/va</div> </li> <li><a href="/article/956.htm" title="我的spring学习笔记6-ApplicationContext实例化的参数兼容思想" target="_blank">我的spring学习笔记6-ApplicationContext实例化的参数兼容思想</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Spring+3/1.htm">Spring 3</a> <div>ApplicationContext能读取多个Bean定义文件,方法是: ApplicationContext appContext = new ClassPathXmlApplicationContext( new String[]{“bean-config1.xml”,“bean-config2.xml”,“bean-config3.xml”,“bean-config4.xml</div> </li> <li><a href="/article/1083.htm" title="mysql 基准测试之sysbench" target="_blank">mysql 基准测试之sysbench</a> <span class="text-muted">annan211</span> <a class="tag" taget="_blank" href="/search/%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95/1.htm">基准测试</a><a class="tag" taget="_blank" href="/search/mysql%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95/1.htm">mysql基准测试</a><a class="tag" taget="_blank" href="/search/MySQL%E6%B5%8B%E8%AF%95/1.htm">MySQL测试</a><a class="tag" taget="_blank" href="/search/sysbench/1.htm">sysbench</a> <div>1 执行如下命令,安装sysbench-0.5: tar xzvf sysbench-0.5.tar.gz  cd sysbench-0.5  chmod +x autogen.sh  ./autogen.sh  ./configure --with-mysql --with-mysql-includes=/usr/local/mysql</div> </li> <li><a href="/article/1210.htm" title="sql的复杂查询使用案列与技巧" target="_blank">sql的复杂查询使用案列与技巧</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0/1.htm">函数</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E9%A1%B5/1.htm">数据分页</a><a class="tag" taget="_blank" href="/search/%E5%90%88%E5%B9%B6%E6%9F%A5%E8%AF%A2/1.htm">合并查询</a> <div>  本片博客使用的数据库表是oracle中的scott用户表;          -------------------  自然连接查询           查询 smith 的上司(两种方法) &</div> </li> <li><a href="/article/1337.htm" title="深入学习Thread类" target="_blank">深入学习Thread类</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a> <div>一.             线程的名字 下面来看一下Thread类的name属性,它的类型是String。它其实就是线程的名字。在Thread类中,有String getName()和void setName(String)两个方法用来设置和获取这个属性的值。 同时,Thr</div> </li> <li><a href="/article/1464.htm" title="JSON串转换成Map以及如何转换到对应的数据类型" target="_blank">JSON串转换成Map以及如何转换到对应的数据类型</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/fastjson/1.htm">fastjson</a><a class="tag" taget="_blank" href="/search/net.sf.json/1.htm">net.sf.json</a> <div>        在实际开发中,难免会碰到JSON串转换成Map的情况,下面来看看这方面的实例。另外,由于fastjson只支持JDK1.5及以上版本,因此在JDK1.4的项目中可以采用net.sf.json来处理。 一.fastjson实例 JsonUtil.java package com.study; impor</div> </li> <li><a href="/article/1591.htm" title="【RPC框架HttpInvoker一】HttpInvoker:Spring自带RPC框架" target="_blank">【RPC框架HttpInvoker一】HttpInvoker:Spring自带RPC框架</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>HttpInvoker是Spring原生的RPC调用框架,HttpInvoker同Burlap和Hessian一样,提供了一致的服务Exporter以及客户端的服务代理工厂Bean,这篇文章主要是复制粘贴了Hessian与Spring集成一文,【RPC框架Hessian四】Hessian与Spring集成   在 【RPC框架Hessian二】Hessian 对象序列化和反序列化一文中</div> </li> <li><a href="/article/1718.htm" title="【Mahout二】基于Mahout CBayes算法的20newsgroup的脚本分析" target="_blank">【Mahout二】基于Mahout CBayes算法的20newsgroup的脚本分析</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Mahout/1.htm">Mahout</a> <div>#!/bin/bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information re</div> </li> <li><a href="/article/1845.htm" title="nginx三种获取用户真实ip的方法" target="_blank">nginx三种获取用户真实ip的方法</a> <span class="text-muted">ronin47</span> <div>随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能还加上了CDN加速,但是随之也遇到一个问题:nginx如何获取用户的真实IP地址,如果后端是apache,请跳转到<apache获取用户真实IP地址>,如果是后端真实服务器是nginx,那么继续往下看。 实例环境: 用户IP 120.22.11.11 </div> </li> <li><a href="/article/1972.htm" title="java-判断二叉树是不是平衡" target="_blank">java-判断二叉树是不是平衡</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>参考了 http://zhedahht.blog.163.com/blog/static/25411174201142733927831/ 但是用java来实现有一个问题。 由于Java无法像C那样“传递参数的地址,函数返回时能得到参数的值”,唯有新建一个辅助类:AuxClass import ljn.help.*; public class BalancedBTree { </div> </li> <li><a href="/article/2099.htm" title="BeanUtils.copyProperties VS PropertyUtils.copyProperties" target="_blank">BeanUtils.copyProperties VS PropertyUtils.copyProperties</a> <span class="text-muted">诸葛不亮</span> <a class="tag" taget="_blank" href="/search/PropertyUtils/1.htm">PropertyUtils</a><a class="tag" taget="_blank" href="/search/BeanUtils/1.htm">BeanUtils</a> <div> BeanUtils.copyProperties VS  PropertyUtils.copyProperties  作为两个bean属性copy的工具类,他们被广泛使用,同时也很容易误用,给人造成困然;比如:昨天发现同事在使用BeanUtils.copyProperties copy有integer类型属性的bean时,没有考虑到会将null转换为0,而后面的业</div> </li> <li><a href="/article/2226.htm" title="[金融与信息安全]最简单的数据结构最安全" target="_blank">[金融与信息安全]最简单的数据结构最安全</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>       现在最流行的数据库的数据存储文件都具有复杂的文件头格式,用操作系统的记事本软件是无法正常浏览的,这样的情况会有什么问题呢?        从信息安全的角度来看,如果我们数据库系统仅仅把这种格式的数据文件做异地备份,如果相同版本的所有数据库管理系统都同时被攻击,那么</div> </li> <li><a href="/article/2353.htm" title="vi区段删除" target="_blank">vi区段删除</a> <span class="text-muted">Cwind</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/vi/1.htm">vi</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E6%AE%B5%E5%88%A0%E9%99%A4/1.htm">区段删除</a> <div>区段删除是编辑和分析一些冗长的配置文件或日志文件时比较常用的操作。简记下vi区段删除要点备忘。   vi概述    引文中并未将末行模式单独列为一种模式。单不单列并不重要,能区分命令模式与末行模式即可。   vi区段删除步骤: 1. 在末行模式下使用:set nu显示行号 非必须,随光标移动vi右下角也会显示行号,能够正确找到并记录删除开始行</div> </li> <li><a href="/article/2480.htm" title="清除tomcat缓存的方法总结" target="_blank">清除tomcat缓存的方法总结</a> <span class="text-muted">dashuaifu</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>用tomcat容器,大家可能会发现这样的问题,修改jsp文件后,但用IE打开 依然是以前的Jsp的页面。 出现这种现象的原因主要是tomcat缓存的原因。 解决办法如下: 在jsp文件头加上 <meta http-equiv="Expires" content="0"> <meta http-equiv="kiben&qu</div> </li> <li><a href="/article/2607.htm" title="不要盲目的在项目中使用LESS CSS" target="_blank">不要盲目的在项目中使用LESS CSS</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/less/1.htm">less</a> <div> 如果你还不知道LESS CSS是什么东西,可以看一下这篇文章,是我一朋友写给新人看的《CSS——LESS》   不可否认,LESS CSS是个强大的工具,它弥补了css没有变量、无法运算等一些“先天缺陷”,但它似乎给我一种错觉,就是为了功能而实现功能。   比如它的引用功能 ? .rounded_corners{     </div> </li> <li><a href="/article/2734.htm" title="[入门]更上一层楼" target="_blank">[入门]更上一层楼</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/yii2/1.htm">yii2</a> <div>更上一层楼 通篇阅读完整个“入门”部分,你就完成了一个完整 Yii 应用的创建。在此过程中你学到了如何实现一些常用功能,例如通过 HTML 表单从用户那获取数据,从数据库中获取数据并以分页形式显示。你还学到了如何通过 Gii 去自动生成代码。使用 Gii 生成代码把 Web 开发中多数繁杂的过程转化为仅仅填写几个表单就行。 本章将介绍一些有助于更好使用 Yii 的资源: </div> </li> <li><a href="/article/2861.htm" title="Apache HttpClient使用详解" target="_blank">Apache HttpClient使用详解</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/httpclient/1.htm">httpclient</a><a class="tag" taget="_blank" href="/search/http%E5%8D%8F%E8%AE%AE/1.htm">http协议</a> <div>Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会</div> </li> <li><a href="/article/2988.htm" title="zxing二维码扫描功能" target="_blank">zxing二维码扫描功能</a> <span class="text-muted">gundumw100</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/zxing/1.htm">zxing</a> <div>经常要用到二维码扫描功能 现给出示例代码 import com.google.zxing.WriterException; import com.zxing.activity.CaptureActivity; import com.zxing.encoding.EncodingHandler; import android.app.Activity; import an</div> </li> <li><a href="/article/3115.htm" title="纯HTML+CSS带说明的黄色导航菜单" target="_blank">纯HTML+CSS带说明的黄色导航菜单</a> <span class="text-muted">ini</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/hovertree/1.htm">hovertree</a> <div>HoverTree带说明的CSS菜单:纯HTML+CSS结构链接带说明的黄色导航   在线体验效果:http://hovertree.com/texiao/css/1.htm代码如下,保存到HTML文件可以看到效果:   <!DOCTYPE html > <html > <head> <title>HoverTree</div> </li> <li><a href="/article/3242.htm" title="fastjson初始化对性能的影响" target="_blank">fastjson初始化对性能的影响</a> <span class="text-muted">kane_xie</span> <a class="tag" taget="_blank" href="/search/fastjson/1.htm">fastjson</a><a class="tag" taget="_blank" href="/search/%E5%BA%8F%E5%88%97%E5%8C%96/1.htm">序列化</a> <div>之前在项目中序列化是用thrift,性能一般,而且需要用编译器生成新的类,在序列化和反序列化的时候感觉很繁琐,因此想转到json阵营。对比了jackson,gson等框架之后,决定用fastjson,为什么呢,因为看名字感觉很快。。。   网上的说法:   fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。 </div> </li> <li><a href="/article/3369.htm" title="基于Mybatis封装的增删改查实现通用自动化sql" target="_blank">基于Mybatis封装的增删改查实现通用自动化sql</a> <span class="text-muted">mengqingyu</span> <a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a> <div>1.基于map或javaBean的增删改查可实现不写dao接口和实现类以及xml,有效的提高开发速度。 2.支持自定义注解包括主键生成、列重复验证、列名、表名等 3.支持批量插入、批量更新、批量删除 <bean id="dynamicSqlSessionTemplate" class="com.mqy.mybatis.support.Dynamic</div> </li> <li><a href="/article/3496.htm" title="js控制input输入框的方法封装(数字,中文,字母,浮点数等)" target="_blank">js控制input输入框的方法封装(数字,中文,字母,浮点数等)</a> <span class="text-muted">qifeifei</span> <a class="tag" taget="_blank" href="/search/javascript+js/1.htm">javascript js</a> <div>在项目开发的时候,经常有一些输入框,控制输入的格式,而不是等输入好了再去检查格式,格式错了就报错,体验不好。 /** 数字,中文,字母,浮点数(+/-/.) 类型输入限制,只要在input标签上加上 jInput="number,chinese,alphabet,floating" 备注:floating属性只能单独用*/     funct</div> </li> <li><a href="/article/3623.htm" title="java 计时器应用" target="_blank">java 计时器应用</a> <span class="text-muted">tangqi609567707</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/timer/1.htm">timer</a> <div>mport java.util.TimerTask;   import java.util.Calendar;   public class MyTask extends TimerTask {        private static final int </div> </li> <li><a href="/article/3750.htm" title="erlang输出调用栈信息" target="_blank">erlang输出调用栈信息</a> <span class="text-muted">wudixiaotie</span> <a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a> <div>在erlang otp的开发中,如果调用第三方的应用,会有有些错误会不打印栈信息,因为有可能第三方应用会catch然后输出自己的错误信息,所以对排查bug有很大的阻碍,这样就要求我们自己打印调用的栈信息。用这个函数:erlang:process_display (self (), backtrace).需要注意这个函数只会输出到标准错误输出。 也可以用这个函数:erlang:get_s</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>