scrapy爬虫架构介绍和初试

一、scrapy简介

Scrapy 是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容或者各种图片。下图显示了Scrapy的大体架构,其中包含了scheduler、item pipeline、downloader、spider以及engine这几个组件模块,而其中的绿色箭头则说明了整套系统的数据处理流程。

下面就来一个个解释每个组件的作用及数据的处理过程。

scrapy-admin.py startproject blog_crawl 

二、组件说明:

    1、ScrapyEngine(Scrapy引擎

   Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。

    2、Scheduler(调度)

    调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返还给他们。

    3、Downloader(下载器)

    下载器的主要职责是抓取网页并将网页内容返还给蜘蛛( Spiders)

    4、Spiders(蜘蛛)

    蜘蛛是有Scrapy用户自己定义用来解析网页并抓取制定URL返回的内容的类,每个蜘蛛都能处理一个域名或一组域名。换句话说就是用来定义特定网站的抓取和解析规则

    蜘蛛的整个抓取流程(周期)是这样的:

   (1)首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。第一个请求是通过调用start_requests()方法。该方法默认从start_urls中的Url中生成请求,并执行解析来调用回调函数。

   (2)在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭代。这些请求也将包含一个回调,然后被Scrapy下载,然后有指定的回调处理。

   (3)在回调函数中,你解析网站的内容,同程使用的是Xpath选择器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜欢的程序),并生成解析的数据项。

   (4)最后,从蜘蛛返回的项目通常会进驻到项目管道。

5、Item Pipeline(项目管道)

    项目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。每个项目管道的组件都是有一个简单的方法组成的Python类。他们获取了项目并执行他们的方法,同时他们还需要确定的是是否需要在项目管道中继续执行下一步或是直接丢弃掉不处理。

 

项目管道通常执行的过程有:

清洗HTML数据

验证解析到的数据(检查项目是否包含必要的字段)

检查是否是重复数据(如果重复就删除)

将解析到的数据存储到数据库中

6、Downloadermiddlewares(下载器中间件)

    下载中间件是位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。它提供了一个自定义的代码的方式来拓展 Scrapy的功能。下载中间器是一个处理请求和响应的钩子框架。他是轻量级的,对Scrapy尽享全局控制的底层的系统。

7、Spider middlewares(蜘蛛中间件)

    蜘蛛中间件是介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。它提供一个自定义代码的方式来拓展Scrapy的功能。蛛中间件是一个挂接到Scrapy的蜘蛛处理机制的框架,你可以插入自定义的代码来处理发送给蜘蛛的请求和返回蜘蛛获取的响应内容和项目。

8、Schedulermiddlewares(调度中间件)

    调度中间件是介于Scrapy引擎和调度之间的中间件,主要工作是处从Scrapy引擎发送到调度的请求和响应。他提供了一个自定义的代码来拓展Scrapy的功能。

 

三、数据处理流程

Scrapy的整个数据处理流程由Scrapy引擎进行控制,其主要的运行方式为:

 

1引擎打开一个域名,蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL

2引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。

3引擎从调度那获取接下来进行爬取的页面。

4调度将下一个爬取的URL返回给引擎,引擎将他们通过下载中间件发送到下载器。

5当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。

6引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。

7蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。

8引擎将抓取到的项目项目管道,并向调度发送请求。

系统重复第二步后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系

 

scrapy能够很好的处理问题,它通过几个组件完成不同的部分,将类似下载网页数据的这些通用操作封装起来,减少了我们编写爬虫时的难度,并且各个部件之间通过异步来处理,能够最大限度利用了网络带宽。我们只需要按照它的要求来实现几个模块就可以了。

fromscrapy.spider importBaseSpider

 

classtest(BaseSpider):

    name ="test"

    allowed_domains =["hao123.com"]

    start_urls =["http://www.hao123.com"]

 

    defparse(self,response):

        printresponse.url

四、爬虫通常的做法

通常的爬取数据的处理的流程是:

    1. 将一个开始的网页url存放到list

    2. 不断从list中取出url进行数据获取

    3. 在获取到的网页数据中的链接都存放到list里面

    4. 不断重复23步骤

#encoding=utf-8

 

__author__='dragon'

 

importurllib2

importos

importpymongo

importtime

importhashlib

 

defmyspider(startweb, keyword):

    list=[startweb]

    curindex =0

    Keyword =keyword

 

    #网络上MongoHQ

    #con = pymongo.Connection("paulo.mongohq.com",10042)

    #db = con.mytest

    #db.authenticate("dragon","dragon")

    #db.urllist.drop()

 

    #本地数据库

    con =pymongo.Connection("localhost", 27017)

    db =con.mytest

 

    whilecurindex < len(list):

        url =list[curindex]

        print"list count =", len(list), "  curcheck ",curindex

        print"try to visit ", url

 

        headers =('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/29.0.1547.66 Safari/537.36')

 

        try:

            opener =urllib2.build_opener()

            opener.addheaders =[headers]

            openness =opener.open(url, None, 30)

            data =openness.read()

            opener.close()

        except:

            print"some error ..."

            curindex +=1

            continue

 

        print"finish get data..."

 

        os.remove("d:/test.txt")

        file=open("d:/test.txt","a")

        print>> file, data

        file.close()

 

        myfile      =open("d:/test.txt", "r")

        mystring    =myfile.read()

        myfile.close()

 

        #找到标题

        title       =""

        headstart   =mystring.find("")

        headend     =mystring.find("")

        ifheadstart < 0:

            headstart   =mystring.find("")

            headend     =mystring.find("")

 

        ifheadstart > 0:

            titlestart  =mystring.find("")</span></p> <p><span style="color:#40AA53;">            </span><span style="color:#333333;">titleend    =</span><span style="color:#333333;">mystring.find("")

            iftitlestart < 0:

                titlestart  =mystring.find("")</span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">titleend    =</span><span style="color:#333333;">mystring.find("")

 

            iftitleend >titlestart andtitlestart < headend andtitleend < headend:

                title =mystring[titlestart+len(""):titleend]</span></p> <p><span style="color:#333333;"> </span></p> <p><span style="color:#40AA53;">        </span><span style="color:#333333;">dbdata =</span><span style="color:#333333;">{"title":"", "url":"","time":""}</span></p> <p><span style="color:#333333;"> </span></p> <p><span style="color:#40AA53;">        </span><span style="color:#333333;">try:</span></p> <p><span style="color:#40AA53;">            </span><span style="color:#333333;">title =</span><span style="color:#333333;">title.decode("utf-8").encode("utf-8")</span></p> <p><span style="color:#40AA53;">        </span><span style="color:#333333;">except:</span></p> <p><span style="color:#40AA53;">            </span><span style="color:#333333;">try:</span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">title =</span><span style="color:#333333;">title.decode("gbk").encode("utf-8")</span></p> <p><span style="color:#40AA53;">            </span><span style="color:#333333;">except:</span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">pass</span></p> <p><span style="color:#333333;"> </span></p> <p><span style="color:#333333;"> </span></p> <p><span style="color:#40AA53;">        </span><span style="color:#333333;">dbdata["title"] =</span><span style="color:#333333;">title</span></p> <p><span style="color:#40AA53;">        </span><span style="color:#333333;">dbdata["url"] =</span><span style="color:#333333;">url</span></p> <p><span style="color:#40AA53;">        </span><span style="color:#333333;">dbdata["time"] =</span><span style="color:#333333;">time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))</span></p> <p><span style="color:#40AA53;">        </span><span style="color:#333333;">try:</span></p> <p><span style="color:#40AA53;">            </span><span style="color:#333333;">db.urllist.insert(dbdata)</span></p> <p><span style="color:#40AA53;">        </span><span style="color:#333333;">except:</span></p> <p><span style="color:#40AA53;">            </span><span style="color:#333333;">print</span><span style="color:#333333;">"insert error"</span></p> <p><span style="color:#333333;"> </span></p> <p><span style="color:#40AA53;">        </span><span style="color:#333333;">if</span><span style="color:#333333;">len(mystring) >0:</span></p> <p><span style="color:#40AA53;">            </span><span style="color:#333333;">while</span><span style="color:#333333;">len(mystring) > 0:</span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">start =</span><span style="color:#333333;">mystring.find("href=\"")</span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">if</span><span style="color:#333333;">start <=</span><span style="color:#333333;">0:</span></p> <p><span style="color:#40AA53;">                    </span><span style="color:#333333;">break</span></p> <p><span style="color:#333333;"> </span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">substring =</span><span style="color:#333333;">mystring[start+6:]</span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">end =</span><span style="color:#333333;">substring.find("\"")</span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">weblink =</span><span style="color:#333333;">substring[:end]</span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">if</span><span style="color:#333333;">Keyword !=</span><span style="color:#333333;">"":</span></p> <p><span style="color:#40AA53;">                    </span><span style="color:#333333;">if</span><span style="color:#333333;">weblink.find(Keyword)>=</span><span style="color:#333333;">0</span><span style="color:#333333;">and</span><span style="color:#333333;">list.count(weblink) <=</span><span style="color:#333333;">0:</span></p> <p><span style="color:#40AA53;">                        </span><span style="color:#333333;">list.append(weblink)</span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">elif</span><span style="color:#333333;">0</span><span style="color:#333333;">>weblink.find("video.sina.com.cn") \</span></p> <p><span style="color:#40AA53;">                    </span><span style="color:#333333;">and</span><span style="color:#333333;">0</span><span style="color:#333333;">>weblink.find("video.baidu.com") \</span></p> <p><span style="color:#40AA53;">                    </span><span style="color:#333333;">and</span><span style="color:#333333;">0</span><span style="color:#333333;"><=</span><span style="color:#333333;">weblink.find("http:") \</span></p> <p><span style="color:#40AA53;">                    </span><span style="color:#333333;">and</span><span style="color:#333333;">0</span><span style="color:#333333;">>=</span><span style="color:#333333;">list.count(weblink):</span></p> <p><span style="color:#333333;"> </span></p> <p><span style="color:#40AA53;">                    </span><span style="color:#333333;">list.append(weblink)</span></p> <p><span style="color:#333333;"> </span></p> <p><span style="color:#40AA53;">                </span><span style="color:#333333;">mystring =</span><span style="color:#333333;">mystring[start+6:]</span></p> <p><span style="color:#333333;"> </span></p> <p><span style="color:#40AA53;">        </span><span style="color:#333333;">curindex +=</span><span style="color:#333333;">1</span></p> <p><span style="color:#333333;"> </span></p> <p><span style="color:#333333;">if</span><span style="color:#333333;">__name__ ==</span><span style="color:#333333;">'__main__':</span></p> <p><span style="color:#40AA53;">    </span><span style="color:#333333;">myspider("http://www.hao123.com","hao123")</span></p> <h1>五、scrapy优势</h1> <p>scrapy结构清晰,可以很方便得修改它来实现更复杂的需求</p> <p><strong><span style="color:rgb(68,68,67);">快速的</span><span style="color:rgb(68,68,67);">link extracto</span></strong></p> <p>首先从初始 URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider 分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到 Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。parse 方法是我们需要定义的回调函数,默认的 request 得到 response 之后会调用这个回调函数,我们需要在这里对页面进行解析,返回两种结果(需要进一步 crawl 的链接和需要保存的数据),让我感觉有些奇怪的是,它的接口定义里这两种结果竟然是混杂在一个 list 里返回的,不太清楚这里为何这样设计<strong>。</strong></p> <p><strong><span style="color:#5B9BD5;">Scrapy</span><span style="color:#5B9BD5;">为每一个</span><span style="color:#5B9BD5;">start_urls</span><span style="color:#5B9BD5;">创建一个</span><span style="color:#5B9BD5;">scrapy.http.Request</span><span style="color:#5B9BD5;">对象,并将爬虫的</span><span style="color:#5B9BD5;">parse</span><span style="color:#5B9BD5;">方法指定为回调函数。这些</span></strong><span style="color:#5B9BD5;">Request</span><span style="color:#5B9BD5;">首先被调度</span><span style="color:#5B9BD5;">,</span><span style="color:#5B9BD5;">然后被执行</span><span style="color:#5B9BD5;">,</span><span style="color:#5B9BD5;">之后通过</span><span style="color:#5B9BD5;">parse()</span><span style="color:#5B9BD5;">方法</span><span style="color:#5B9BD5;">,</span><span style="color:#5B9BD5;">将</span><span style="color:#5B9BD5;">scrapy.http.Response</span><span style="color:#5B9BD5;">对象被返回</span><span style="color:#5B9BD5;">,</span><span style="color:#5B9BD5;">结果也被反馈给爬虫。</span></p> <h1>六、<em><span>XPath selectors</span></em></h1> <p>Scrapy使用的是<span>XPath</span>表达式,通常叫做<em><span>XPath selectors</span></em>。</p> <p>这里有一些表达式的例子和它们相关的含义:</p> <p><span style="color:#5B9BD5;">/html/head/title: </span><span style="color:#5B9BD5;">选择</span><span style="color:#5B9BD5;"><title></span><span style="color:#5B9BD5;">元素</span><span style="color:#5B9BD5;">,</span><span style="color:#5B9BD5;">在</span><span style="color:#5B9BD5;">HTML</span><span style="color:#5B9BD5;">文档的</span><span style="color:#5B9BD5;"><head></span><span style="color:#5B9BD5;">元素里</span></p> <p><span style="color:#5B9BD5;">/html/head/title/text(): </span><span style="color:#5B9BD5;">选择</span><span style="color:#5B9BD5;"><title></span><span style="color:#5B9BD5;">元素里面的文本</span></p> <p><span style="color:#5B9BD5;">//td: </span><span style="color:#5B9BD5;">选择所有的</span><span style="color:#5B9BD5;"><td></span><span style="color:#5B9BD5;">元素</span></p> <p><span style="color:#5B9BD5;">//div[@class="mine"]: </span><span style="color:#5B9BD5;">选择所有的</span><span style="color:#5B9BD5;">div</span><span style="color:#5B9BD5;">元素里面</span><span style="color:#5B9BD5;">class</span><span style="color:#5B9BD5;">属性为</span><span style="color:#5B9BD5;">mine</span><span style="color:#5B9BD5;">的</span></p> <p>为了更好使用XPaths, Scrapy提供了一个<span>XPathSelector</span>类,它有两种方式, <span>HtmlXPathSelector</span>(HTML相关数据)和<span>XmlXPathSelector</span>(XML相关数据)。如果你想使用它们,你必须实例化一个<span>Response</span>对象。</p> <p><span style="color:#808080;">x </span>= HtmlXPathSelector(response)</p> <p>选择器有三种方法(点击方法你能够看见完整的API文档)。</p> <p><span style="color:#3E62A6;">select()</span>: 返回选择器的列表,每一个select表示一个xpath表达式选择的节点。</p> <p><span style="color:#3E62A6;">extract()</span>: 返回一个unicode字符串 ,该字符串XPath选择器返回的数据。</p> <p><span style="color:#3E62A6;">re()</span>: 返回unicode字符串列表,字符串作为参数由正则表达式提取出来。</p> <p> </p> <p>每个select()调用返回一个selectors列表,所以我们可以结合select()去挖掘更深的点:</p> <p>sites = hxs.select('//ul/li')</p> <p>for site in sites:</p> <p>    title = site.select('a/text()').extract()</p> <p>    link = site.select('a/@href').extract()</p> <p>    desc = site.select('text()').extract()</p> <p>    print title, link, desc</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1187965982006681600"></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/1835435506645692416.htm" title="00. 这里整理了最全的爬虫框架(Java + Python)" target="_blank">00. 这里整理了最全的爬虫框架(Java + Python)</a> <span class="text-muted">有一只柴犬</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E7%B3%BB%E5%88%97/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/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>目录1、前言2、什么是网络爬虫3、常见的爬虫框架3.1、java框架3.1.1、WebMagic3.1.2、Jsoup3.1.3、HttpClient3.1.4、Crawler4j3.1.5、HtmlUnit3.1.6、Selenium3.2、Python框架3.2.1、Scrapy3.2.2、BeautifulSoup+Requests3.2.3、Selenium3.2.4、PyQuery3.2</div> </li> <li><a href="/article/1835412560413814784.htm" title="python爬取微信小程序数据,python爬取小程序数据" target="_blank">python爬取微信小程序数据,python爬取小程序数据</a> <span class="text-muted">2301_81900439</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>大家好,小编来为大家解答以下问题,python爬取微信小程序数据,python爬取小程序数据,现在让我们一起来看看吧!Python爬虫系列之微信小程序实战基于Scrapy爬虫框架实现对微信小程序数据的爬取首先,你得需要安装抓包工具,这里推荐使用Charles,至于怎么使用后期有时间我会出一个事例最重要的步骤之一就是分析接口,理清楚每一个接口功能,然后连接起来形成接口串思路,再通过Spider的回调</div> </li> <li><a href="/article/1835375495567470592.htm" title="如何在电商平台上使用API接口数据优化商品价格" target="_blank">如何在电商平台上使用API接口数据优化商品价格</a> <span class="text-muted">weixin_43841111</span> <a class="tag" taget="_blank" href="/search/api/1.htm">api</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/1.htm">数据挖掘</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>利用API接口数据来优化电商商品价格是一个涉及数据收集、分析、策略制定以及实时调整价格的过程。这不仅能提高市场竞争力,还能通过精准定价最大化利润。以下是一些关键步骤和策略,用于通过API接口数据优化电商商品价格:1.数据收集竞争对手价格监控:使用API接口(如Scrapy、BeautifulSoup等工具结合Python进行网页数据抓取,或使用专门的API服务如PriceIntelligence、</div> </li> <li><a href="/article/1835342718067372032.htm" title="Python精选200Tips:121-125" target="_blank">Python精选200Tips:121-125</a> <span class="text-muted">AnFany</span> <a class="tag" taget="_blank" href="/search/Python200%2BTips/1.htm">Python200+Tips</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Spendyourtimeonself-improvement121Requests-简化的HTTP请求处理发送GET请求发送POST请求发送PUT请求发送DELETE请求会话管理处理超时文件上传122BeautifulSoup-网页解析和抓取解析HTML和XML文档查找单个标签查找多个标签使用CSS选择器查找标签提取文本修改文档内容删除标签处理XML文档123Scrapy-强大的网络爬虫框架示例</div> </li> <li><a href="/article/1835067814621310976.htm" title="10个高效的Python爬虫框架,你用过几个?" target="_blank">10个高效的Python爬虫框架,你用过几个?</a> <span class="text-muted">进击的C语言</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapyscrapy官网:https://scrapy.org/scrapy中文文档:https://www.osgeo.cn/scrapy/intro/oScrapy是一个为了爬取网站数据,提取结构性数据而编写的</div> </li> <li><a href="/article/1834696618260131840.htm" title="Windows下安装Scrapy出现的问题及其解决方法" target="_blank">Windows下安装Scrapy出现的问题及其解决方法</a> <span class="text-muted">咸甜怪</span> <div>Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。在安装Scrapy模块时,pipinstallScrapy出现了以下报错:error:MicrosoftVisualC++14.0isrequired.Getitwith"MicrosoftVisualC++BuildTools":http://landinghub.visua</div> </li> <li><a href="/article/1833135256425820160.htm" title="基础爬虫 requests selenium aiohttp BeautifulSoup pyQuery Xpath&CssSelector" target="_blank">基础爬虫 requests selenium aiohttp BeautifulSoup pyQuery Xpath&CssSelector</a> <span class="text-muted">肯定是疯了</span> <div>http://47.101.52.166/blog/back/python/%E7%88%AC%E8%99%AB.html请求requestsseleniumaiohttp*处理BeautifulSouppyQueryXpath&CssSelector*存储pymysqlPyMongoredisaiomysql*Scrapy</div> </li> <li><a href="/article/1832459858708885504.htm" title="Python爬虫实战" target="_blank">Python爬虫实战</a> <span class="text-muted">weixin_34007879</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>引言网络爬虫是抓取互联网信息的利器,成熟的开源爬虫框架主要集中于两种语言Java和Python。主流的开源爬虫框架包括:1.分布式爬虫框架:Nutch2.Java单机爬虫框架:Crawler4j,WebMagic,WebCollector、Heritrix3.python单机爬虫框架:scrapy、pyspiderNutch是专为搜索引擎设计的的分布式开源框架,上手难度高,开发复杂,基本无法满足快</div> </li> <li><a href="/article/1832038298164490240.htm" title="python爬亚马逊数据_python爬虫----(6. scrapy框架,抓取亚马逊数据)" target="_blank">python爬亚马逊数据_python爬虫----(6. scrapy框架,抓取亚马逊数据)</a> <span class="text-muted">weixin_39628342</span> <a class="tag" taget="_blank" href="/search/python%E7%88%AC%E4%BA%9A%E9%A9%AC%E9%80%8A%E6%95%B0%E6%8D%AE/1.htm">python爬亚马逊数据</a> <div>利用xpath()分析抓取数据还是比较简单的,只是网址的跳转和递归等比较麻烦。耽误了好久,还是豆瓣好呀,URL那么的规范。唉,亚马逊URL乱七八糟的....可能对url理解还不够.amazon├──amazon│├──__init__.py│├──__init__.pyc│├──items.py│├──items.pyc│├──msic││├──__init__.py││└──pad_urls.p</div> </li> <li><a href="/article/1831801918628917248.htm" title="2024年Python最新Python爬虫教程-新浪微博分布式爬虫分享(2)" target="_blank">2024年Python最新Python爬虫教程-新浪微博分布式爬虫分享(2)</a> <span class="text-muted">2401_84584682</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/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/%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A/1.htm">新浪微博</a> <div>开发语言:Python2.7开发环境:64位Windows8系统,4G内存,i7-3612QM处理器。数据库:MongoDB3.2.0、Redis3.0.501(Python编辑器:Pycharm;MongoDB管理工具:MongoBooster;Redis管理工具:RedisStudio)爬虫框架使用Scrapy,使用scrapy_redis和Redis实现分布式。分布式中有一台机充当Maste</div> </li> <li><a href="/article/1831737376133705728.htm" title="python分布式集群ray_GitHub - Leesire-Python/jd_spider: 两只蠢萌京东的分布式爬虫." target="_blank">python分布式集群ray_GitHub - Leesire-Python/jd_spider: 两只蠢萌京东的分布式爬虫.</a> <span class="text-muted">weixin_39781930</span> <a class="tag" taget="_blank" href="/search/python%E5%88%86%E5%B8%83%E5%BC%8F%E9%9B%86%E7%BE%A4ray/1.htm">python分布式集群ray</a> <div>使用scrapy,scrapy-redis,graphite实现的京东分布式爬虫,以mongodb实现底层存储。分布式实现,解决带宽和性能的瓶颈,提高爬取的效率。实现scrapy-redis对进行url的去重以及调度,利用redis的高效和易于扩展能够轻松实现高效率下载:当redis存储或者访问速度遇到瓶颈时,可以通过增大redis集群数和爬虫集群数量改善版本支持现在支持Py2和Py3,但是需要注</div> </li> <li><a href="/article/1831538591046660096.htm" title="spiderkeeper 部署&操作" target="_blank">spiderkeeper 部署&操作</a> <span class="text-muted">VictorChi</span> <div>前言最近发现了一个spdierkeeper的库,这个库的主要用途是在于.配合这scrpyd管理你的爬虫,支持一键式部署,定时采集任务,启动,暂停等一系列的操作.简单来说将scrapyd的api进行封装,最大限度减少你跟命令行交互次数.不得说这个是很棒的事情.https://github.com/DormyMo/SpiderKeeperSpiderKeeper的github连接环境配置由于scrap</div> </li> <li><a href="/article/1831523093407952896.htm" title="爬虫进阶之人见人爱的Scrapy框架--Scrapy入门" target="_blank">爬虫进阶之人见人爱的Scrapy框架--Scrapy入门</a> <span class="text-muted">我真的超级好</span> <div>不要重复造轮子,这是学习Python以来听得最多的一句话,无非就是叫我们要灵活运用现有的库,毕竟Python的一大特点就是拥有功能强大强大而种类丰富的库。那么在爬虫领域要灵活使用哪个轮子呢?--当然是目前最火的爬虫框架Scrapy。笔者通过慕课网免费课程《Python最火爬虫框架Scrapy入门与实践》+书籍《精通Scrapy网络爬虫》+度娘+CSDN完成自学,其中遇到诸多困难(要么太深入没看懂,</div> </li> <li><a href="/article/1830763727864033280.htm" title="苹果笔记本macbook pro如何安装python_Mac OS系统下的安装" target="_blank">苹果笔记本macbook pro如何安装python_Mac OS系统下的安装</a> <span class="text-muted">weixin_39884074</span> <a class="tag" taget="_blank" href="/search/%E8%8B%B9%E6%9E%9C%E7%AC%94%E8%AE%B0%E6%9C%ACmacbook/1.htm">苹果笔记本macbook</a><a class="tag" taget="_blank" href="/search/pro%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85python/1.htm">pro如何安装python</a> <div>如果你使用的是苹果电脑,可能希望在MacOS系统下使用Scrapy,那么如何在MacOS下安装Scrapy呢?由于Python3已经是发展趋势,所以我们使用的Python版本是Python3。MacOS自带2.X版本的Python,我们可以打开终端,输入python–V命令进行查看,如下所示。itcastdeMacBook-Pro:~itcast$python-VPython2.7.10可以看到,</div> </li> <li><a href="/article/1830703226035466240.htm" title="Scrapy框架架构---学习笔记" target="_blank">Scrapy框架架构---学习笔记</a> <span class="text-muted">怪猫訷</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>Scrapy框架架构Scrapy框架介绍:写一个爬虫,需要做很多的事情。比如:发送网络请求、数据解析、数据存储、反反爬虫机制(更换ip代理、设置请求头等)、异步请求等。这些工作如果每次都要自己从零开始写的话,比较浪费时间。因此Scrapy把一些基础的东西封装好了,在他上面写爬虫可以变的更加的高效(爬取效率和开发效率)。因此真正在公司里,一些上了量的爬虫,都是使用Scrapy框架来解决。Scrapy</div> </li> <li><a href="/article/1830701210613673984.htm" title="Scrapy ---心得" target="_blank">Scrapy ---心得</a> <span class="text-muted">auo8191</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>scrapy框架基础-框架:具有很多功能,且具有很强通用性的项目模板-环境安装:#环境准备linux系统pip3installscrapywindows系统1pip3installwheel2下载Twisted-19.2.0-cp36-cp36m-win-amd64.whl3进入下载目录,执行pip3installTwisted‑19.2.0‑cp36‑cp36m‑win_amd64.whl4pi</div> </li> <li><a href="/article/1830554250489458688.htm" title="Scrapy添加代理IP池:自动化爬虫的秘密武器" target="_blank">Scrapy添加代理IP池:自动化爬虫的秘密武器</a> <span class="text-muted">天启代理ip</span> <a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">自动化</a> <div>在网络爬虫的世界里,IP地址的频繁更换是防止被目标网站封禁的有效手段。通过在Scrapy中添加代理IP池,你可以轻松实现自动化的IP切换,提高数据抓取的效率和稳定性。今天,我们就来详细讲解一下如何在Scrapy中添加代理IP池,让你的爬虫更加智能和高效。什么是代理IP池?代理IP池是指一组可以轮换使用的代理IP地址集合。通过在爬虫中使用代理IP池,你可以在每次请求时随机选择一个代理IP,从而避免因</div> </li> <li><a href="/article/1829933213783519232.htm" title="ADB投屏_最强开源投屏神器,跨平台电脑控制+文件传输——scrcpy" target="_blank">ADB投屏_最强开源投屏神器,跨平台电脑控制+文件传输——scrcpy</a> <span class="text-muted">weixin_39777637</span> <a class="tag" taget="_blank" href="/search/ADB%E6%8A%95%E5%B1%8F/1.htm">ADB投屏</a> <div>介绍scrcpy是一个开源的跨平台投屏神器,支持Linux、Windows以及MacOS(本文介绍的scrapy不是Python下的那个爬虫框架),scrcpy在Github上非常的受欢迎,Stars数高达34k+,能达到这个量级的都是非常受欢迎的项目。scrcpy可通过数据线(或通过TCP/IP——wifi)显示和控制连接的Android设备,它不需要任何root访问权限!Github开源地址h</div> </li> <li><a href="/article/1829759762623983616.htm" title="Python爬虫系列总结" target="_blank">Python爬虫系列总结</a> <span class="text-muted">qformat</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Python爬虫系列总结包含(Scrapy框架介绍)文章目录Python爬虫系列总结包含(Scrapy框架介绍)一、前言二、Python爬虫的基础三、Python爬虫进阶四、简易爬虫总结五、Python爬虫框架六、爬虫部署一、前言随着WEB2.0时代的到来,网络已经成为了人们获取信息的重要途径,而爬虫技术可以让我们从海量的网络数据中快速地获取我们想要的信息。Python是一种简单易学、功能强大的编</div> </li> <li><a href="/article/1829759005682135040.htm" title="scrapy学习笔记0827" target="_blank">scrapy学习笔记0827</a> <span class="text-muted">github_czy</span> <a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</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.总之先启动先安装scrapy,pipinstallscrapy创建scrapy项目,生成的项目结构应该如图所示,scrapystartprojectexample选择需要爬取的页面并分析,这里选定的页面是Allproducts|BookstoScrape-Sandbox一个供给爬虫学者练手的网站,我们需要爬取上面的书籍信息,解析我们需要的内容在那一段html标签里可以使用浏览器自带的开发者工具</div> </li> <li><a href="/article/1829710111099154432.htm" title="scrapy中pipeline获取settings参数的方法" target="_blank">scrapy中pipeline获取settings参数的方法</a> <span class="text-muted">极客探索者</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/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/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/1.htm">网络爬虫</a> <div>1、在scrapy的pipeline中,获取settings参数,可使用如下方式:defopen_spider(self,spider):settings=spider.settingsweb_dir_dict=settings.get('WEB_DIR_DICT',{})也可以采用如下方式:fromscrapy.utils.projectimportget_project_settings###</div> </li> <li><a href="/article/1829219593504256000.htm" title="scrapy学习笔记0828-下" target="_blank">scrapy学习笔记0828-下</a> <span class="text-muted">github_czy</span> <a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</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.爬取动态页面我们遇见的大多数网站不大可能会是单纯的静态网站,实际中更常见的是JavaScript通过HTTP请求跟网站动态交互获取数据(AJAX),然后使用数据更新HTML页面。爬取此类动态网页需要先执行页面中的JavaScript代码渲染页面,再进行爬取。在这里我们采用scrapy官方推荐的Splash渲染引擎,我们需要通过docker来安装splash并使其运行起来,这里就暂时不展开,安装</div> </li> <li><a href="/article/1828944653949431808.htm" title="探索TV-Crawler:一款强大的电视节目爬虫框架" target="_blank">探索TV-Crawler:一款强大的电视节目爬虫框架</a> <span class="text-muted">孔旭澜Renata</span> <div>探索TV-Crawler:一款强大的电视节目爬虫框架项目简介是一个由Python编写的开源项目,其目标是抓取各大电视台的节目信息并进行整理。对于那些热衷于规划观影时间或想要了解最新电视节目内容的人来说,这是一个非常实用的工具。开发者可以通过此项目轻松获取电视节目的播出时间、频道和标题等数据。技术分析1.Python与ScrapyTV-Crawler基于Python的强大网络爬虫框架Scrapy构建</div> </li> <li><a href="/article/1828842278760837120.htm" title="Scrapy入门学习" target="_blank">Scrapy入门学习</a> <span class="text-muted">晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/%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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>文章目录Scrapy一.Scrapy简介二.Scrapy的安装1.进入项目所在目录2.安装软件包Scrapy3.验证是否安装成功三.Scrapy的基础使用1.创建项目2.在tutorial/spiders目录下创建保存爬虫代码的项目文件3.运行爬虫4.利用css选择器+ScrapyShell提取数据例如:Scrapy一.Scrapy简介Scrapy是一个用于抓取网站和提取结构化数据的应用程序框架,</div> </li> <li><a href="/article/1828642710043586560.htm" title="scrapy爬取知乎的中添加代理ip" target="_blank">scrapy爬取知乎的中添加代理ip</a> <span class="text-muted">虔诚XY</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>都是伪代码,不要直接复制,进攻参考ip都不可以使用,只是我自己写的格式。zhihu.pyproxy_pool=[{'HTTP':'182.253.112.43:8080'}]defstart_requests(self):proxy_addr=random.choice(proxy_pool)yieldRequest('.........,meta={'proxy':proxy_addr})set</div> </li> <li><a href="/article/1828082175908605952.htm" title="python用scrapy爬虫豆瓣_python爬虫框架scrapy 豆瓣实战" target="_blank">python用scrapy爬虫豆瓣_python爬虫框架scrapy 豆瓣实战</a> <span class="text-muted">weixin_39745724</span> <div>Scrapy官方介绍是Anopensourceandcollaborativeframeworkforextractingthedatayouneedfromwebsites.Inafast,simple,yetextensibleway.意思就是一个开源和协作框架,用于以快速,简单,可扩展的方式从网站中提取所需的数据。环境准备本文项目使用环境及工具如下python3scrapymongodbpy</div> </li> <li><a href="/article/1827373611703431168.htm" title="scrapy框架--快速了解" target="_blank">scrapy框架--快速了解</a> <span class="text-muted">金灰</span> <a class="tag" taget="_blank" href="/search/%23/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><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a> <div>免责声明:本文仅做分享~目录介绍:5大核心组件:安装scrapy:创建到启动:修改日志配置:settings.py修改君子协议配置:伪装浏览器头:让代码去终端执行:数据保存:1-基于命令2-基于管道文档:介绍:5大核心组件:Scrapy是一个开源的Python框架,用于抓取网站数据并进行数据处理。Scrapy是一个快速、高效的框架,可以用来构建快速、可扩展的爬虫。Scrapy框架的主要组件包括:1</div> </li> <li><a href="/article/1827102356848865280.htm" title="7个必须掌握的Python爬虫框架" target="_blank">7个必须掌握的Python爬虫框架</a> <span class="text-muted">需要什么私信我</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>Python已经成为了最受欢迎的编程语言之一,并且在爬虫方面也有了广泛的应用。如果你想成为一名优秀的爬虫开发者,那么你必须熟练掌握一些Python爬虫框架。本文将介绍7个必须掌握的Python爬虫框架,它们都是目前比较热门的框架。Scrapy:Scrapy是一个Python编写的高级爬虫框架,可以用于爬取各种网站的数据。它具有高度的可扩展性和灵活性,还有强大的数据处理和存储功能。Beautiful</div> </li> <li><a href="/article/1827097059493244928.htm" title="Python 爬虫框架" target="_blank">Python 爬虫框架</a> <span class="text-muted">BugLovers</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>Python中有许多强大且主流的爬虫框架,这些框架提供了更高级的功能,使得开发和维护爬虫变得更加容易。以下是一些常用的爬虫框架:1.Scrapy-简介:Scrapy是Python最流行的爬虫框架之一,设计用于快速、高效地从网站中提取数据。它支持各种功能,如处理请求、解析HTML、处理分页、去重、以及保存数据等。-特点:-支持多线程,性能高效。-内置支持XPath、CSS选择器。-具有丰富的扩展插件</div> </li> <li><a href="/article/1827015510068391936.htm" title="如何让python爬虫的数据可视化?" target="_blank">如何让python爬虫的数据可视化?</a> <span class="text-muted">喝汽水么</span> <a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/1.htm">计算机网络</a> <div>Python爬虫数据可视化是一个涉及多个步骤的过程,主要包括数据抓取、数据处理、以及使用可视化库进行数据展示。以下是一个基本的流程介绍和示例,帮助你理解如何使用Python实现这一过程。第一步:数据抓取首先,你需要使用Python的爬虫库(如requests和BeautifulSoup,或者更高级的Scrapy)来抓取网页数据。这里以requests和BeautifulSoup为例:importr</div> </li> <li><a href="/article/103.htm" title="SAX解析xml文件" target="_blank">SAX解析xml文件</a> <span class="text-muted">小猪猪08</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>1.创建SAXParserFactory实例 2.通过SAXParserFactory对象获取SAXParser实例 3.创建一个类SAXParserHander继续DefaultHandler,并且实例化这个类 4.SAXParser实例的parse来获取文件     public static void main(String[] args) { //</div> </li> <li><a href="/article/230.htm" title="为什么mysql里的ibdata1文件不断的增长?" target="_blank">为什么mysql里的ibdata1文件不断的增长?</a> <span class="text-muted">brotherlamp</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/linux%E8%BF%90%E7%BB%B4/1.htm">linux运维</a><a class="tag" taget="_blank" href="/search/linux%E8%B5%84%E6%96%99/1.htm">linux资料</a><a class="tag" taget="_blank" href="/search/linux%E8%A7%86%E9%A2%91/1.htm">linux视频</a><a class="tag" taget="_blank" href="/search/linux%E8%BF%90%E7%BB%B4%E8%87%AA%E5%AD%A6/1.htm">linux运维自学</a> <div>我们在 Percona 支持栏目经常收到关于 MySQL 的 ibdata1 文件的这个问题。 当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌就开始了 —— 就是说磁盘快要满了。 一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 innodbfileper_table,所以问题是: ibdata1存了什么? 当你启用了 i</div> </li> <li><a href="/article/357.htm" title="Quartz-quartz.properties配置" target="_blank">Quartz-quartz.properties配置</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a> <div>其实Quartz JAR文件的org.quartz包下就包含了一个quartz.properties属性配置文件并提供了默认设置。如果需要调整默认配置,可以在类路径下建立一个新的quartz.properties,它将自动被Quartz加载并覆盖默认的设置。   下面是这些默认值的解释 #-----集群的配置 org.quartz.scheduler.instanceName =</div> </li> <li><a href="/article/484.htm" title="informatica session的使用" target="_blank">informatica session的使用</a> <span class="text-muted">18289753290</span> <a class="tag" taget="_blank" href="/search/workflow/1.htm">workflow</a><a class="tag" taget="_blank" href="/search/session/1.htm">session</a><a class="tag" taget="_blank" href="/search/log/1.htm">log</a><a class="tag" taget="_blank" href="/search/Informatica/1.htm">Informatica</a> <div>如果希望workflow存储最近20次的log,在session里的Config  Object设置,log  options做配置,save  session log :sessions  run  ;savesessio log for  these runs:20 session下面的source 里面有个tracing </div> </li> <li><a href="/article/611.htm" title="Scrapy抓取网页时出现CRC check failed 0x471e6e9a != 0x7c07b839L的错误" target="_blank">Scrapy抓取网页时出现CRC check failed 0x471e6e9a != 0x7c07b839L的错误</a> <span class="text-muted">酷的飞上天空</span> <a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a> <div>Scrapy版本0.14.4 出现问题现象: ERROR: Error downloading <GET http://xxxxx  CRC check failed   解决方法   1.设置网络请求时的header中的属性'Accept-Encoding': '*;q=0'   明确表示不支持任何形式的压缩格式,避免程序的解压</div> </li> <li><a href="/article/738.htm" title="java Swing小集锦" target="_blank">java Swing小集锦</a> <span class="text-muted">永夜-极光</span> <a class="tag" taget="_blank" href="/search/java+swing/1.htm">java swing</a> <div>1.关闭窗体弹出确认对话框   1.1   this.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE);   1.2   this.addWindowListener ( new WindowAdapter () { public void windo</div> </li> <li><a href="/article/865.htm" title="强制删除.svn文件夹" target="_blank">强制删除.svn文件夹</a> <span class="text-muted">随便小屋</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>          在windows上,从别处复制的项目中可能带有.svn文件夹,手动删除太麻烦,并且每个文件夹下都有。所以写了个程序进行删除。因为.svn文件夹在windows上是只读的,所以用File中的delete()和deleteOnExist()方法都不能将其删除,所以只能采用windows命令方式进行删除</div> </li> <li><a href="/article/992.htm" title="GET和POST有什么区别?及为什么网上的多数答案都是错的。" target="_blank">GET和POST有什么区别?及为什么网上的多数答案都是错的。</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/get+post/1.htm">get post</a> <div>     如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历      前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。     这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把G</div> </li> <li><a href="/article/1119.htm" title="谈谈新浪微博背后的那些算法" target="_blank">谈谈新浪微博背后的那些算法</a> <span class="text-muted">aoyouzi</span> <a class="tag" taget="_blank" href="/search/%E8%B0%88%E8%B0%88%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A%E8%83%8C%E5%90%8E%E7%9A%84%E9%82%A3%E4%BA%9B%E7%AE%97%E6%B3%95/1.htm">谈谈新浪微博背后的那些算法</a> <div>本文对微博中常见的问题的对应算法进行了简单的介绍,在实际应用中的算法比介绍的要复杂的多。当然,本文覆盖的主题并不全,比如好友推荐、热点跟踪等就没有涉及到。但古人云“窥一斑而见全豹”,希望本文的介绍能帮助大家更好的理解微博这样的社交网络应用。 微博是一个很多人都在用的社交应用。天天刷微博的人每天都会进行着这样几个操作:原创、转发、回复、阅读、关注、@等。其中,前四个是针对短博文,最后的关注和@则针</div> </li> <li><a href="/article/1246.htm" title="Connection reset 连接被重置的解决方法" target="_blank">Connection reset 连接被重置的解决方法</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/%E5%AD%97%E7%AC%A6%E6%B5%81/1.htm">字符流</a><a class="tag" taget="_blank" href="/search/%E8%BF%9E%E6%8E%A5%E8%A2%AB%E9%87%8D%E7%BD%AE/1.htm">连接被重置</a> <div>流是java的核心部分,,昨天在做android服务器连接服务器的时候出了问题,就将代码放到java中执行,结果还是一样连接被重置   被重置的代码如下;   客户端代码; package 通信软件服务器; import java.io.BufferedWriter; import java.io.OutputStream; import java.io.O</div> </li> <li><a href="/article/1373.htm" title="web.xml配置详解之filter" target="_blank">web.xml配置详解之filter</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/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/filter/1.htm">filter</a> <div>一.定义 <filter> <filter-name>encodingfilter</filter-name> <filter-class>com.my.app.EncodingFilter</filter-class> <init-param> <param-name>encoding<</div> </li> <li><a href="/article/1500.htm" title="Heritrix" target="_blank">Heritrix</a> <span class="text-muted">Bill_chen</span> <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/xml/1.htm">xml</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%88%B6%E9%80%A0/1.htm">制造</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/1.htm">配置管理</a> <div>作为纯Java语言开发的、功能强大的网络爬虫Heritrix,其功能极其强大,且扩展性良好,深受热爱搜索技术的盆友们的喜爱,但它配置较为复杂,且源码不好理解,最近又使劲看了下,结合自己的学习和理解,跟大家分享Heritrix的点点滴滴。 Heritrix的下载(http://sourceforge.net/projects/archive-crawler/)安装、配置,就不罗嗦了,可以自己找找资</div> </li> <li><a href="/article/1627.htm" title="【Zookeeper】FAQ" target="_blank">【Zookeeper】FAQ</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a> <div>1.脱离IDE,运行简单的Java客户端程序 #ZkClient是简单的Zookeeper~$ java -cp "./:zookeeper-3.4.6.jar:./lib/*" ZKClient    1. Zookeeper是的Watcher回调是同步操作,需要添加异步处理的代码 2. 如果Zookeeper集群跨越多个机房,那么Leader/</div> </li> <li><a href="/article/1754.htm" title="The user specified as a definer ('aaa'@'localhost') does not exist" target="_blank">The user specified as a definer ('aaa'@'localhost') does not exist</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/localhost/1.htm">localhost</a> <div>今天遇到一个客户BUG,当前的jdbc连接用户是root,然后部分删除操作都会报下面这个错误:The user specified as a definer ('aaa'@'localhost') does not exist 最后找原因发现删除操作做了触发器,而触发器里面有这样一句 /*!50017 DEFINER = ''aaa@'localhost' */  原来最初</div> </li> <li><a href="/article/1881.htm" title="javascript中showModelDialog刷新父页面" target="_blank">javascript中showModelDialog刷新父页面</a> <span class="text-muted">bozch</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%88%B7%E6%96%B0%E7%88%B6%E9%A1%B5%E9%9D%A2/1.htm">刷新父页面</a><a class="tag" taget="_blank" href="/search/showModalDialog/1.htm">showModalDialog</a> <div>在页面中使用showModalDialog打开模式子页面窗口的时候,如果想在子页面中操作父页面中的某个节点,可以通过如下的进行:       window.showModalDialog('url',self,‘status...’); // 首先中间参数使用self       在子页面使用w</div> </li> <li><a href="/article/2008.htm" title="编程之美-买书折扣" target="_blank">编程之美-买书折扣</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a> <div> import java.util.Arrays; public class BookDiscount { /**编程之美 买书折扣 书上的贪心算法的分析很有意思,我看了半天看不懂,结果作者说,贪心算法在这个问题上是不适用的。。 下面用动态规划实现。 哈利波特这本书一共有五卷,每卷都是8欧元,如果读者一次购买不同的两卷可扣除5%的折扣,三卷10%,四卷20%,五卷</div> </li> <li><a href="/article/2135.htm" title="关于struts2.3.4项目跨站执行脚本以及远程执行漏洞修复概要" target="_blank">关于struts2.3.4项目跨站执行脚本以及远程执行漏洞修复概要</a> <span class="text-muted">chenbowen00</span> <a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/WEB%E5%AE%89%E5%85%A8/1.htm">WEB安全</a> <div>因为近期负责的几个银行系统软件,需要交付客户,因此客户专门请了安全公司对系统进行了安全评测,结果发现了诸如跨站执行脚本,远程执行漏洞以及弱口令等问题。 下面记录下本次解决的过程以便后续 1、首先从最简单的开始处理,服务器的弱口令问题,首先根据安全工具提供的测试描述中发现应用服务器中存在一个匿名用户,默认是不需要密码的,经过分析发现服务器使用了FTP协议, 而使用ftp协议默认会产生一个匿名用</div> </li> <li><a href="/article/2262.htm" title="[电力与暖气]煤炭燃烧与电力加温" target="_blank">[电力与暖气]煤炭燃烧与电力加温</a> <span class="text-muted">comsci</span> <div>       在宇宙中,用贝塔射线观测地球某个部分,看上去,好像一个个马蜂窝,又像珊瑚礁一样,原来是某个国家的采煤区.....       不过,这个采煤区的煤炭看来是要用完了.....那么依赖将起燃烧并取暖的城市,在极度严寒的季节中...该怎么办呢?   &nbs</div> </li> <li><a href="/article/2389.htm" title="oracle O7_DICTIONARY_ACCESSIBILITY参数" target="_blank">oracle O7_DICTIONARY_ACCESSIBILITY参数</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>O7_DICTIONARY_ACCESSIBILITY参数控制对数据字典的访问.设置为true,如果用户被授予了如select any table等any table权限,用户即使不是dba或sysdba用户也可以访问数据字典.在9i及以上版本默认为false,8i及以前版本默认为true.如果设置为true就可能会带来安全上的一些问题.这也就为什么O7_DICTIONARY_ACCESSIBIL</div> </li> <li><a href="/article/2516.htm" title="比较全面的MySQL优化参考" target="_blank">比较全面的MySQL优化参考</a> <span class="text-muted">dengkane</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体分析了,可以参考本站的一些优化案例或者联系我,下方有我的联系方式。这是上篇。   1、硬件层相关优化   1.1、CPU相关   在服务器的BIOS设置中,可</div> </li> <li><a href="/article/2643.htm" title="C语言homework2,有一个逆序打印数字的小算法" target="_blank">C语言homework2,有一个逆序打印数字的小算法</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div>#h1#   0、完成课堂例子 1、将一个四位数逆序打印 1234 ==> 4321 实现方法一: # include <stdio.h> int main(void) { int i = 1234; int one = i%10; int two = i / 10 % 10; int three = i / 100 % 10; </div> </li> <li><a href="/article/2770.htm" title="apacheBench对网站进行压力测试" target="_blank">apacheBench对网站进行压力测试</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/apachebench/1.htm">apachebench</a> <div>   ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求。前段时间看到公司的开发人员也在用它作一些测试,看起来也不错,很简单,也很容易使用,所以今天花一点时间看了一下。 通过下面的一个简单的例子和注释,相信大家可以更容易理解这个工具的使用。 </div> </li> <li><a href="/article/2897.htm" title="2种办法让HashMap线程安全" target="_blank">2种办法让HashMap线程安全</a> <span class="text-muted">flyfoxs</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/jni/1.htm">jni</a> <div>多线程之--2种办法让HashMap线程安全 多线程之--synchronized 和reentrantlock的优缺点 多线程之--2种JAVA乐观锁的比较( NonfairSync VS. FairSync)     HashMap不是线程安全的,往往在写程序时需要通过一些方法来回避.其实JDK原生的提供了2种方法让HashMap支持线程安全.   </div> </li> <li><a href="/article/3024.htm" title="Spring Security(04)——认证简介" target="_blank">Spring Security(04)——认证简介</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a><a class="tag" taget="_blank" href="/search/%E8%AE%A4%E8%AF%81/1.htm">认证</a><a class="tag" taget="_blank" href="/search/%E8%BF%87%E7%A8%8B/1.htm">过程</a> <div>认证简介 目录 1.1     认证过程 1.2     Web应用的认证过程 1.2.1    ExceptionTranslationFilter 1.2.2    在request之间共享SecurityContext   1</div> </li> <li><a href="/article/3151.htm" title="Java 位运算" target="_blank">Java 位运算</a> <span class="text-muted">Javahuhui</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a> <div>// 左移( << ) 低位补0 // 0000 0000 0000 0000 0000 0000 0000 0110 然后左移2位后,低位补0: // 0000 0000 0000 0000 0000 0000 0001 1000 System.out.println(6 << 2);// 运行结果是24 // 右移( >> ) 高位补"</div> </li> <li><a href="/article/3278.htm" title="mysql免安装版配置" target="_blank">mysql免安装版配置</a> <span class="text-muted">ldzyz007</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>1、my-small.ini是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。 2、my-medium.ini是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。 3、my-large.ini是为专用于一个SQL数据</div> </li> <li><a href="/article/3405.htm" title="MFC和ado数据库使用时遇到的问题" target="_blank">MFC和ado数据库使用时遇到的问题</a> <span class="text-muted">你不认识的休道人</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/mfc/1.htm">mfc</a> <div>=================================================================== 第一个 =================================================================== try{ CString sql; sql.Format("select * from p</div> </li> <li><a href="/article/3532.htm" title="表单重复提交Double Submits" target="_blank">表单重复提交Double Submits</a> <span class="text-muted">rensanning</span> <a class="tag" taget="_blank" href="/search/double/1.htm">double</a> <div>可能发生的场景: *多次点击提交按钮 *刷新页面 *点击浏览器回退按钮 *直接访问收藏夹中的地址 *重复发送HTTP请求(Ajax) (1)点击按钮后disable该按钮一会儿,这样能避免急躁的用户频繁点击按钮。 这种方法确实有些粗暴,友好一点的可以把按钮的文字变一下做个提示,比如Bootstrap的做法: http://getbootstrap.co</div> </li> <li><a href="/article/3659.htm" title="Java String 十大常见问题" target="_blank">Java String 十大常见问题</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a> <div> 1.字符串比较,使用“==”还是equals()?   "=="判断两个引用的是不是同一个内存地址(同一个物理对象)。   equals()判断两个字符串的值是否相等。   除非你想判断两个string引用是否同一个对象,否则应该总是使用equals()方法。   如果你了解字符串的驻留(String Interning)则会更好地理解这个问题。    </div> </li> <li><a href="/article/3786.htm" title="SpringMVC 登陆拦截器实现登陆控制" target="_blank">SpringMVC 登陆拦截器实现登陆控制</a> <span class="text-muted">xp9802</span> <a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a> <div>思路,先登陆后,将登陆信息存储在session中,然后通过拦截器,对系统中的页面和资源进行访问拦截,同时对于登陆本身相关的页面和资源不拦截。   实现方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 </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>