scrapy框架_Scrapy爬虫框架总结入门篇

scrapy框架_Scrapy爬虫框架总结入门篇_第1张图片

点击上方「蓝字」关注 testing

c83634a3d744fc2b5af6e9cdb752f78e.png


 01 

引言

hello,好久不见!最近接了几个兼职,然后都涉及到了爬虫,在这里简单介绍下Scrapy框架的使用。

那么,爬虫除了Scrapy框架外,还有pyspider框架,当然了,也可以利用基础去实现这些框架的功能。为什么这里单单就介绍Scrapy框架呢?

我们来说说pyspider框架。我们可以利用pyspider框架可以快速的完成爬虫的编写。除了快捷性外,pyspider也有一些缺点,比如可配置化程度不高,异常处理能力有限等。它对于一些反爬程度非常强的网站爬取显得力不从心。

而Scrapy框架的功能是非常强大的,爬取效率高,扩展组件多。可配置和可扩展程度相对来说是非常高的,Scrapy几乎可以应对所有反爬网站,它是目前 Python使用最广泛的爬虫框架。

说到这里,就知道testing为什么单独介绍Scrapy框架了吧!对pyspider有兴趣的也可以自己百度了解下。下面进入正题~


 02 

Scrapy介绍

Scrapy是基于Twisted的异步处理框架,是纯Python实现的爬虫框架,Scrapy的架构清晰,模块之间的耦合程度低,可扩展性极强。可以灵活完成各种需求, 我们只需要定制开发几个模块就可以轻松实现一个爬虫。

下面我们来看看Scrapy框架的架构图

scrapy框架_Scrapy爬虫框架总结入门篇_第2张图片

Engine引擎:处理整个系统的数据流处理、触发事务,是整个框架的核心。

Item:项它定义了爬取结果的数据结构,爬取的数据会被赋值成该Item对象。

Scheduler调度器:接受引擎发过来的请求并将其加入队列中,在引擎再次请求的时候将请求提供给引擎。

Downloader下载器:下载网页内容,并将网页内容返回给蜘蛛。

Spiders蜘蛛:其内定义了爬取的逻辑和网页的解析规则 ,它主要负责解析响应并生成提取结果和新的请求。

Item Pipeline项目管道:负责处理由蜘蛛从网页中抽取的项目,它的主要任务是清洗、验证和存储数据。

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

Spider Middlewares蜘蛛中间件:位于引擎和蜘蛛 之间的钩子框架,主要处理蜘蛛输入的响应和输出的结果及新的请求。

我们可以根据上面图来看看Scrapy的详细数据流走向。

1、爬虫引擎获得初始请求开始抓取。

2、爬虫引擎开始请求调度程序,并准备对下一次的请求进行抓取。

3、爬虫调度器返回下一个请求给爬虫引擎。

4、引擎请求发送到下载器,通过下载中间件下载网络数据。

5、一旦下载器完成页面下载,将下载结果返回给爬虫引擎。

6、引擎将下载器的响应通过中间件返回给爬虫进行处理。

7、爬虫处理响应,并通过中间件返回处理后的items,以及新的请求给引擎。

8、引擎发送处理后的items到项目管道,然后把处理结果返回给调度器,调度器计划处理下一个请求抓取。

9、重复该过程(继续步骤1),直到爬取完所有的url请求。

通过多个组件的相互协作、不同组件完成工作的不同、组件对异步处理的支持, Scrapy最大限度地利用了网络带宽,大大提高了数据爬取和处理的效率。

 03 

Scrapy入门

创建项目及Spider

接下来,以某家五和地铁站附近租房房源为例说明Scrapy的使用。

Scrapy框架是通过命令行来创建项目的,代码编写还是需要IDE。下面,我们来创建下项目

scrapy startproject scrapy_test    # scrapy-test为项目名D:\Python\WorkingInterval>scrapy startproject scrapy_testNew Scrapy project 'scrapy_test', using template directory 'd:\python\python37\lib\site-packages\scrapy\templates\project', created in:    D:\Python\WorkingInterval\scrapy_testYou can start your first spider with:    cd scrapy_test    scrapy genspider example example.com

scrapy框架_Scrapy爬虫框架总结入门篇_第3张图片

创建项目后用IDE打开项目,我们发现Scrapy的项目结构是这样的,下面介绍下Scrapy的项目结构:

scrapy.cfg:Scrapy项目的配置文件,其内定义了项目的配置文件路径、部署相关信息等内容。

items.py:定义 Item 数据结构,所有的Item的定义都可以放这里。

pipelines.py:定义了Item Pipeline的实现,所有的Item Pipeline的实现都可以放这里。

settings.py:定义项目的全局配置。

middlewares.py:定义Spider Middlewares和Downloader Middlewares的实现。

spiders:包含一个个Spider的实现,每个Spider都有一个文件。

好了,接下来创建项目完了后需要创建Spider。Spider是自己定义的类,Scrapy用它来从网页里抓取内容,并解析抓取的结果。不过这个类必须继承Scrapy提供的Spider类scrapy.Spider,还要定义Spider 的名称和起始请求,以及怎样处理爬取后的结果的方法。

当然了,也可以使用命令行创建一个Spider。比如要生成testing这个Spider,可以执行下面命令:

cd scrapy_testscrapy genspider testing(Spider名) sz.lianjia.com(域名)   #创建一个Spid

创建成功后我们看看spiders中有什么变化,spiders中多了一个spider(testing.py)。它就是刚刚创建的 Spider。内容如下所示:

# -*- coding: utf-8 -*-import scrapyclass TestingSpider(scrapy.Spider):    name = 'testing'    allowed_domains = ['sz.lianjia.com']    start_urls = ['http://sz.lianjia.com/']    def parse(self, response):        pass

我们发现,在Spider(testing.py)文件中有3个属性及1个方法。那么,这3个属性及1个方法表示什么呢?

name:每个项目唯一的名字,用来区分不同的Spiderallowed_domains:允许爬取的域名,如果初始或后续的请求链接不是这个域名下的,则请求链接会被过滤start_urls:包含了Spider在启动时爬取的url列表,初始请求是由它来定义的parse:Spider的一个方法,默认情况下,被调用时 start_urls 里面的链接构成的请求完成下载执行后,返回的响应就会作为唯一的参数传递给这个函数 该方法负责解析返回的响应、提取数据或者进一步生成要处理的请求。

其实,这个Spider(testing.py)我们现在就可以运行了,我们可以通过scrapy crawl Spider_name去运行一个Spider。我们来看看效果:

# Spider代码# -*- coding: utf-8 -*-import scrapyclass TestingSpider(scrapy.Spider):    name = 'testing'    allowed_domains = ['sz.lianjia.com']    start_urls = ['https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/']    def parse(self, response):        print(response.text)
scrapy crawl testing   # 运行Spider,testing为Spider
# 结果,只截取了部分2020-10-08 21:28:52 [scrapy.utils.log] INFO: Scrapy 2.3.0 started (bot: scrapy_test)2020-10-08 21:28:52 [scrapy.utils.log] INFO: Versions: lxml 4.5.2.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 20.3.0, Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1h  22 Sep 2020), cryptography 3.1.1, Platform Windows-10-10.0.19041-SP02020-10-08 21:28:52 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor2020-10-08 21:28:52 [scrapy.crawler] INFO: Overridden settings:{'BOT_NAME': 'scrapy_test', 'NEWSPIDER_MODULE': 'scrapy_test.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['scrapy_test.spiders']}2020-10-08 21:28:52 [scrapy.extensions.telnet] INFO: Telnet Password: 503fe683dbe0c5282020-10-08 21:28:52 [scrapy.middleware] INFO: Enabled extensions:['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.logstats.LogStats']2020-10-08 21:28:52 [scrapy.middleware] INFO: Enabled downloader middlewares:['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats']2020-10-08 21:28:52 [scrapy.middleware] INFO: Enabled spider middlewares:['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware']2020-10-08 21:28:52 [scrapy.middleware] INFO: Enabled item pipelines:[]2020-10-08 21:28:52 [scrapy.core.engine] INFO: Spider opened2020-10-08 21:28:52 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)2020-10-08 21:28:52 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:60232020-10-08 21:28:53 [scrapy.core.engine] DEBUG: Crawled (200)  (referer: None)2020-10-08 21:28:53 [scrapy.core.engine] DEBUG: Crawled (200)  (referer: None)                        深圳租房信息_深圳出租房源|房屋出租价格【深圳贝壳租房】title></code></pre> 
    <p>我们可以看到上面是把整个网页都爬下来了。那么,我们怎么爬我想要爬的呢?爬下来之后我又该怎么保存呢?接下来介绍下Item及怎么解析response。</p> 
    <h2></h2> 
    <p>Item</p> 
    <p><strong></strong>Item 是保存爬取数据的容器,它的使用方法和字典类似;不过,相比字典, Item 多了额外的保护机制,可以避免拼写错误或者定义字段错误。</p> 
    <p>创建 Item需要继承scrapy.Item 类,并且定义类型为scrapy.Field的字段。我们来观察目标网站,我们可以获取到到内容有标题、标签、图片、价格,分别定义为:title、label、picture、price。</p> 
    <p><a href="http://img.e-com-net.com/image/info8/3bdc29de1af24bdf964e35a06f4b26c7.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/3bdc29de1af24bdf964e35a06f4b26c7.jpg" alt="scrapy框架_Scrapy爬虫框架总结入门篇_第4张图片" width="650" height="321" style="border:1px solid black;"></a></p> 
    <p>定义Item ,此时将items.py修改如下:</p> 
    <pre class="has"><code># -*- coding: utf-8 -*-# Define here the models for your scraped items## See documentation in:# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass ScrapyTestItem(scrapy.Item):    # define the fields for your item here like:    # name = scrapy.Field()    title = scrapy.Field()   # 标题    label = scrapy.Field()   # 标签    picture = scrapy.Field()  # 图片    price = scrapy.Field()   # 价格</code></pre> 接下来爬取时我们会使用到这个 Item 
    <h2></h2> 
    <p>response解析</p> 
    <p><strong></strong>在前面Spider提到过,Spider(testing.py)文件中有一个parse方法。方法中默认有一个resposne的参数。resposne就是start_urls列表里面的链接爬取后的结果。所以在parse方法中,我们可以直接对response变量包含的内容进行解析,我们可以浏览请求结果的网页源代码及进一步解析源代码内容,拿到我们想要的数据。</p> 那么,我们现在来看看我们需要提取的内容,也就是html文件源码。 
    <p><a href="http://img.e-com-net.com/image/info8/825dbeab53194bbfbfdb01b2479f2b71.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/825dbeab53194bbfbfdb01b2479f2b71.jpg" alt="scrapy框架_Scrapy爬虫框架总结入门篇_第5张图片" width="650" height="321" style="border:1px solid black;"></a></p> 
    <p>F12打开开发者模式进行元素定位,发现房源列表都在下面这个标签下:</p> 
    <pre class="has"><code></code></pre> 
    <div> 
     <code>class="content w1150" id="content"><code># 接下来我们就可以进入这个标签下,然后提取到</code></code> 
     <div> 
      <code><code>class="content__list">节点下的每个房源的title、label、picture、pric</code></code> 
      <p><code><code>那么,具体怎么提呢?我们可以选择使用CSS或者Xpath提取,具体如下:</code></code></p> 
      <code><code></code></code> 
      <pre class="has"><code><code><code># -*- coding: utf-8 -*-import scrapyclass TestingSpider(scrapy.Spider):    name = 'testing'    allowed_domains = ['sz.lianjia.com']    start_urls = ['https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/']    def parse(self, response):        picture_url = 'https://sz.lianjia.com'        for contents in response.css('.content.w1150'):            for content_list in contents.css('.content__list'):                for content in content_list.css('.content__list--item'):                    print(content.css('.content__list--item--aside::attr(title)').extract_first())                    print(picture_url + str(content.css('.content__list--item--aside::attr(href)').extract_first()))                    for label_list in content.css('.content__list--item--main'):                        print(label_list.css('.content__list--item--des a::text').extract_first())                        print(label_list.css('.content__list--item-price em::text').extract_first())</code></code></code></pre> 
      <code><code>这里利用了css选择器选取所有的contents然后依次往下循环,最后拿到房源列表。拿到房源列表后在取对应的字段值。其实和下面代码一样直接拿到房源列表也是可以的,我这里采用先取最外层元素的方式是为了更任意理解。</code></code> 
      <pre class="has"><code><code><code># -*- coding: utf-8 -*-import scrapyclass TestingSpider(scrapy.Spider):    name = 'testing'    allowed_domains = ['sz.lianjia.com']    start_urls = ['https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/']    def parse(self, response):        picture_url = 'https://sz.lianjia.com'        # 获取content__list--item节点下的全部标签,返回scrapy.selector.unified.Selector类型                for content in content_list.css('.content__list--item'):                    # 获取content__list--item--aside中的title属性。::后面是方法,属性是想获取的页面属性key,如title、href等                    # content.css('.content__list--item--aside::attr(title)')返回的是一个列表,所以还需要extract_first()方法                    # 获取第一个元素,如果需要获取所有标签可使用extract()方法                    print(content.css('.content__list--item--aside::attr(title)').extract_first())                    print(picture_url + str(content.css('.content__list--item--aside::attr(href)').extract_first()))                    for label_list in content.css('.content__list--item--main'):                        # 获取content__list--item--des标签节点下a标签的文本值,如:                        # <em>3500</em> 元/月                        # label_list.css('.content__list--item-price em::text').extract_first()取出来的值就是3500                        print(label_list.css('.content__list--item--des a::text').extract_first())                        print(label_list.css('.content__list--item-price em::text').extract_first())        </code></code></code></pre> 
      <code><code></code></code> 
      <h2><code><code></code></code></h2> 
      <code><code></code></code> 
      <p><code><code>使用item</code></code></p> 
      <code><code></code></code> 
      <p><code><code>写好之后我们来运行一下,使用print打印出来发现结果是:</code></code></p> 
      <code><code></code></code> 
      <pre class="has"><code><code><code>整租·泓瀚苑 2室1厅 东南https://sz.lianjia.com/zufang/SZ2399746901261164544.html龙岗区3500整租·佳华领汇广场king公馆 1室1厅 东南https://sz.lianjia.com/zufang/SZ2493457203546570752.html龙岗区4500整租·绿怡居 1室1厅 北https://sz.lianjia.com/zufang/SZ2529042762431733760.html龙岗区3500整租·祥龙花园 1室1厅 南https://sz.lianjia.com/zufang/SZ2579510967029202944.html龙岗区1600整租·阳明公寓 2室1厅 西北https://sz.lianjia.com/zufang/SZ2546299208399323136.html龙岗区3600整租·万家华庭 1室0厅 南https://sz.lianjia.com/zufang/SZ2601424595965976576.html龙岗区1600整租·德润荣君府 1室1厅 西南https://sz.lianjia.com/zufang/SZ2557857645281419264.html龙岗区3500整租·佳华领汇广场king公馆 1室1厅 复式 东https://sz.lianjia.com/zufang/SZ2565981889160814592.html龙岗区4200# 上面结果只截取了一部分</code></code></code></pre> 
      <code><code></code></code> 
      <p><code><code>上文定义了 Item ,接下来就要使用它了。Item 可以理解为一个字典,我们在声明时需要实例化。然后用刚刚解析出来的数据赋给对应item的每一个字段,然后yield返回即可。代码如下:</code></code></p> 
      <code><code></code></code> 
      <pre class="has"><code><code><code># -*- coding: utf-8 -*-import scrapyfrom scrapy_test.items import ScrapyTestItemclass TestingSpider(scrapy.Spider):    name = 'testing'    allowed_domains = ['sz.lianjia.com']    start_urls = ['https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/']    def parse(self, response):        picture_url = 'https://sz.lianjia.com'        for contents in response.css('.content.w1150'):            for content_list in contents.css('.content__list'):                # 获取content__list--item节点下的全部标签,返回scrapy.selector.unified.Selector类型                for content in content_list.css('.content__list--item'):                    item = ScrapyTestItem()                    # 获取content__list--item--aside中的title属性。::后面是方法,属性是想获取的页面属性key,如title、href等                    # content.css('.content__list--item--aside::attr(title)')返回的是一个列表,所以还需要extract_first()方法                    # 获取第一个元素,如果需要获取所有标签可使用extract()方法                    item['title'] = content.css('.content__list--item--aside::attr(title)').extract_first()                    item['picture'] = picture_url + str(content.css('.content__list--item--aside::attr(href)').extract_first())                    for label_list in content.css('.content__list--item--main'):                        # 获取content__list--item--des标签节点下a标签的文本值,如:                        # <em>3500</em> 元/月                        # label_list.css('.content__list--item-price em::text').extract_first()取出来的值就是3500                        item['label'] = label_list.css('.content__list--item--des a::text').extract_first()                        item['price'] = label_list.css('.content__list--item-price em::text').extract_first()</code></code></code></pre> 
      <code><code></code></code> 
      <p><code><code>这样item就封装完成了。那么,我们来看看结果。</code></code></p> 
      <code><code></code></code> 
      <pre class="has"><code><code><code>2020-10-11 13:15:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2272373282206384128.html', 'price': '2160', 'title': '合租·信义嘉御山 5居室 东卧'}2020-10-11 13:15:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2203357333265063936.html', 'price': '1530', 'title': '合租·富豪花园 3居室 南卧'}</code></code></code></pre> 
      <code><code></code></code> 
      <p><code><code>在爬取网页的时候肯定不止一页内容,肯定有很多页内容。那么,我们怎么爬取下一页内容呢?下面我们说一说scrapy的Request方法。</code></code></p> 
      <code><code></code></code> 
      <h2><code><code></code></code></h2> 
      <code><code></code></code> 
      <p><code><code>scrapy.Request方法</code></code></p> 
      <code><code></code></code> 
      <p><code><code>完整代码:</code></code></p> 
      <code><code></code></code> 
      <pre class="has"><code><code><code># -*- coding: utf-8 -*-import scrapyfrom scrapy_test.items import ScrapyTestItemclass TestingSpider(scrapy.Spider):    name = 'testing'    allowed_domains = ['sz.lianjia.com']    start_urls = ['https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/']    def parse(self, response):        picture_url = 'https://sz.lianjia.com'        for contents in response.css('.content.w1150'):            for content_list in contents.css('.content__list'):                # 获取content__list--item节点下的全部标签,返回scrapy.selector.unified.Selector类型                for content in content_list.css('.content__list--item'):                    item = ScrapyTestItem()                    # 获取content__list--item--aside中的title属性。::后面是方法,属性是想获取的页面属性key,如title、href等                    # content.css('.content__list--item--aside::attr(title)')返回的是一个列表,所以还需要extract_first()方法                    # 获取第一个元素,如果需要获取所有标签可使用extract()方法                    item['title'] = content.css('.content__list--item--aside::attr(title)').extract_first()                    item['picture'] = picture_url + str(content.css('.content__list--item--aside::attr(href)').extract_first())                    for label_list in content.css('.content__list--item--main'):                        # 获取content__list--item--des标签节点下a标签的文本值,如:                        # <em>3500</em> 元/月                        # label_list.css('.content__list--item-price em::text').extract_first()取出来的值就是3500                        item['label'] = label_list.css('.content__list--item--des a::text').extract_first()                        item['price'] = label_list.css('.content__list--item-price em::text').extract_first()                    yield item        url = response.css('.content__pg .next::attr(href)').extract_first()        url = response.urljoin(url)        # scrapy.Request有二个参数,通过 url callback 构造一个新的请求,callback表示回调函数,这里还是使用 parse()        # 方法。当运行yield scrapy.Request(url=url, callback=self.parse)时,响应会重新经过parse方法处理,得        # 到第二页的解析结果,然后爬取下一页的数据。这样脚本就进入了一个循环,会爬到最后一页才结束        yield scrapy.Request(url=url, callback=self.parse)</code></code></code></pre> 
      <code><code></code></code> 
      <h2><code><code></code></code></h2> 
      <code><code></code></code> 
      <p><code><code>结语</code></code></p> 
      <code><code><strong></strong>接下来,我们一个简单的爬虫脚本就完成。我们 来运行一下看看</code></code> 
      <pre class="has"><code><code><code>2020-10-11 13:22:47 [scrapy.utils.log] INFO: Scrapy 2.3.0 started (bot: scrapy_test)2020-10-11 13:22:47 [scrapy.utils.log] INFO: Versions: lxml 4.5.2.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 20.3.0, Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1h  22 Sep 2020), cryptography 3.1.1, Platform Windows-10-10.0.19041-SP02020-10-11 13:22:47 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor2020-10-11 13:22:47 [scrapy.crawler] INFO: Overridden settings:{
          'BOT_NAME': 'scrapy_test', 'NEWSPIDER_MODULE': 'scrapy_test.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['scrapy_test.spiders']}2020-10-11 13:22:47 [scrapy.extensions.telnet] INFO: Telnet Password: 4562180fedffa7842020-10-11 13:22:47 [scrapy.middleware] INFO: Enabled extensions:['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.logstats.LogStats']2020-10-11 13:22:47 [scrapy.middleware] INFO: Enabled downloader middlewares:['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats']2020-10-11 13:22:47 [scrapy.middleware] INFO: Enabled spider middlewares:['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware']2020-10-11 13:22:47 [scrapy.middleware] INFO: Enabled item pipelines:[]2020-10-11 13:22:47 [scrapy.core.engine] INFO: Spider opened2020-10-11 13:22:47 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)2020-10-11 13:22:47 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:60232020-10-11 13:22:48 [scrapy.core.engine] DEBUG: Crawled (200) //sz.lianjia.com/robots.txt> (referer: None)2020-10-11 13:22:48 [scrapy.core.engine] DEBUG: Crawled (200) //sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/> (referer: None)2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2399746901261164544.html', 'price': '3500', 'title': '整租·泓瀚苑 2室1厅 东南'}2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2558567086729740288.html', 'price': '2650', 'title': '整租·星窝青年创享社区(五和店) 1室1厅 东/东南/南'}2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2529042762431733760.html', 'price': '3500', 'title': '整租·绿怡居 1室1厅 北'}2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2557769429706883072.html', 'price': '2150', 'title': '整租·星窝青年创享社区(五和店) 1室1厅 东'}2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2546299208399323136.html', 'price': '3600', 'title': '整租·阳明公寓 2室1厅 西北'}2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2558648762940014592.html', 'price': '1980', 'title': '整租·星窝青年创享社区(五和店) 1室1厅 南'}2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2557857645281419264.html', 'price': '3500', 'title': '整租·德润荣君府 1室1厅 西南'}2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2565981889160814592.html', 'price': '4200', 'title': '整租·佳华领汇广场king公馆 1室1厅 复式 东'}2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2357150381735690240.html', 'price': '4300', 'title': '整租·佳华领汇广场king公馆 1室1厅 东'}2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2502001268382236672.html', 'price': '4800', 'title': '整租·润创兴时代公寓 2室1厅 南'}2020-10-11 13:22:49 [scrapy.core.scraper] DEBUG: Scraped from <200 https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/>{
          'label': '龙岗区', 'picture': 'https://sz.lianjia.com/zufang/SZ2561359607196811264.html', 'price': '7000', 'title': '整租·万科四季花城六期 3室2厅 南'}</code></code></code></pre> 
      <code><code>好了,因为时间问题,关于scrapy框架的内容本篇文章就说到这里。下期在说爬取后数据的保存及scrapy框架各组件的一个使用,886~</code></code> 
      <p><code><code><strong><strong> 04 </strong></strong></code></code></p> 
      <code><code></code></code> 
      <p><code><code><strong><strong>番外-往期推荐</strong></strong></code></code></p> 
      <code><code></code></code> 
      <p><code><code>性能测试系列:聊一聊性能测试、聊一聊性能测试指标一、聊一聊性能测试指标二、聊一聊性能测试计划、聊一聊性能测试方案</code></code></p> 
      <code><code></code></code> 
      <p><code><code>grafana系列:基于Docker搭建Grafana监控数据库资源、基于Docker搭建Grafana监控Linux服务器资源</code></code></p> 
      <code><code></code></code> 
      <p><code><code>docker系列:docker介绍、docker入门及使用、docker深入一</code></code></p> 
      <code><code></code></code> 
      <p><code><code>2T免费学习资源:2T免费各领域学习资源</code></code></p> 
      <code><code><a href="http://img.e-com-net.com/image/info8/4d7acf33a67c441e90f5ebf4838910dd.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/4d7acf33a67c441e90f5ebf4838910dd.jpg" alt="scrapy框架_Scrapy爬虫框架总结入门篇_第6张图片" width="650" height="171" style="border:1px solid black;"></a></code></code> 
      <p><code><code><a href="http://img.e-com-net.com/image/info8/724ff66197c4483880ddcaf8722640a1.gif" target="_blank"><img src="http://img.e-com-net.com/image/info8/724ff66197c4483880ddcaf8722640a1.gif" alt="scrapy框架_Scrapy爬虫框架总结入门篇_第7张图片" width="639" height="272" style="border:1px solid black;"></a><strong></strong></code></code></p> 
      <code><code> </code></code> 
     </div> 
     <code><code> </code></code> 
    </div> 
    <code></code> 
   </div> 
  </div> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1387657889824460800"></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框架,scrapy爬虫)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1949897938671038464.htm"
                           title="Scrapy 爬虫 IP 被封问题的解决方案" target="_blank">Scrapy 爬虫 IP 被封问题的解决方案</a>
                        <span class="text-muted">杨胜增</span>
<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/tcp%2Fip/1.htm">tcp/ip</a>
                        <div>Scrapy爬虫IP被封问题的解决方案在使用Scrapy进行网络爬虫开发时,IP被封是一个常见的问题。当爬虫频繁地向目标网站发送请求时,目标网站可能会检测到异常流量,并将爬虫的IP地址加入黑名单,导致后续请求无法正常访问。本文将详细介绍Scrapy爬虫IP被封问题的原因及解决方案。问题描述在运行Scrapy爬虫时,可能会遇到以下类似的情况:请求返回403Forbidden错误,表示服务器拒绝了请求</div>
                    </li>
                    <li><a href="/article/1948832023917424640.htm"
                           title="【JS逆向基础】script框架" target="_blank">【JS逆向基础】script框架</a>
                        <span class="text-muted">是星凡呢</span>
<a class="tag" taget="_blank" href="/search/python%E4%B8%8EJS%E9%80%86%E5%90%91/1.htm">python与JS逆向</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/JS%E9%80%86%E5%90%91/1.htm">JS逆向</a>
                        <div>scrapy框架1,基本介绍Scrapy一个开源和协作的框架,其最初是为了页面抓取(更确切来说,网络抓取)所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如AmazonAssociatesWebServices)或者通用的网络爬虫。Scrapy是基于twisted</div>
                    </li>
                    <li><a href="/article/1947229364403892224.htm"
                           title="Python Scrapy爬取办公用品网站数据的策略" target="_blank">Python Scrapy爬取办公用品网站数据的策略</a>
                        <span class="text-muted">Python编程之道</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%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a>
                        <div>1.引入与连接想象一下,你是一家办公用品公司的市场调研人员,需要了解竞争对手的产品价格、种类等信息。如果手动去各个办公用品网站收集这些数据,那将是一项极其繁琐且耗时的工作。而Python的Scrapy框架就像是一个不知疲倦的超级助手,能帮你快速、高效地从众多网站抓取所需数据。你可能已经对Python有了一定的了解,知道它是一门功能强大且应用广泛的编程语言。Scrapy则是Python中专门用于网络</div>
                    </li>
                    <li><a href="/article/1946951089626607616.htm"
                           title="Python医疗大数据实战:基于Scrapy-Redis的医院评价数据分布式爬虫设计与实现" target="_blank">Python医疗大数据实战:基于Scrapy-Redis的医院评价数据分布式爬虫设计与实现</a>
                        <span class="text-muted">Python爬虫项目</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a>
                        <div>摘要本文将详细介绍如何使用Python构建一个高效的医院评价数据爬虫系统。我们将从爬虫基础讲起,逐步深入到分布式爬虫架构设计,使用Scrapy框架结合Redis实现分布式爬取,并采用最新的反反爬技术确保数据采集的稳定性。文章包含完整的代码实现、性能优化方案以及数据处理方法,帮助读者掌握医疗大数据采集的核心技术。关键词:Python爬虫、Scrapy-Redis、分布式爬虫、医疗大数据、反反爬技术1</div>
                    </li>
                    <li><a href="/article/1946950457867956224.htm"
                           title="分布式爬虫架构:Scrapy-Redis+Redis集群实现百万级数据采集" target="_blank">分布式爬虫架构:Scrapy-Redis+Redis集群实现百万级数据采集</a>
                        <span class="text-muted">傻啦嘿哟</span>
<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/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                        <div>目录当单机爬虫遇到百万数据量架构设计核心原理分布式任务调度弹性去重机制Redis集群部署实践集群规模计算高可用配置Scrapy项目改造分布式爬虫编写百万级数据优化策略流量控制机制动态IP代理数据存储优化实战案例分析监控与维护集群健康检查日志分析架构演进方向当单机爬虫遇到百万数据量想象你正在搭建一个电商价格监控系统,需要每天抓取十万条商品数据。使用传统Scrapy框架时,单台服务器每天最多只能处理3</div>
                    </li>
                    <li><a href="/article/1946597816889569280.htm"
                           title="python分布式爬虫打造搜索引擎--------scrapy实现" target="_blank">python分布式爬虫打造搜索引擎--------scrapy实现</a>
                        <span class="text-muted">weixin_30515513</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/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/1.htm">开发工具</a>
                        <div>http://www.cnblogs.com/jinxiao-pu/p/6706319.html最近在网上学习一门关于scrapy爬虫的课程,觉得还不错,以下是目录还在更新中,我觉得有必要好好的做下笔记,研究研究。第1章课程介绍1-1python分布式爬虫打造搜索引擎简介07:23第2章windows下搭建开发环境2-1pycharm的安装和简单使用10:272-2mysql和navicat的安装</div>
                    </li>
                    <li><a href="/article/1946578902734401536.htm"
                           title="网络爬虫-07" target="_blank">网络爬虫-07</a>
                        <span class="text-muted">YEGE学AI算法</span>
<a class="tag" taget="_blank" href="/search/Python-%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/1.htm">Python-网络爬虫</a>
                        <div>网络爬虫-07)**Spider06回顾****scrapy框架****完成scrapy项目完整流程****我们必须记住****爬虫项目启动方式****数据持久化存储****Spider07笔记****分布式爬虫****scrapy_redis详解****腾讯招聘分布式改写****机器视觉与tesseract****补充-滑块缺口验证码案例****豆瓣网登录****Fiddler抓包工具****移</div>
                    </li>
                    <li><a href="/article/1941879794656407552.htm"
                           title="Python Scrapy的爬虫中间件开发" target="_blank">Python Scrapy的爬虫中间件开发</a>
                        <span class="text-muted">AI天才研究院</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/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a>
                        <div>PythonScrapy爬虫中间件开发:从原理到实战的深度解析关键词Scrapy中间件、爬虫扩展、请求响应处理、反爬绕过、中间件生命周期、钩子函数、分布式爬取摘要本文系统解析Scrapy爬虫中间件(SpiderMiddleware)的开发方法论,覆盖从基础概念到高级实践的全链路知识。通过第一性原理推导中间件的核心机制,结合层次化架构分析(理论→设计→实现→应用),提供生产级代码示例与可视化流程模型</div>
                    </li>
                    <li><a href="/article/1941525949925355520.htm"
                           title="Python爬虫:Scrapy报错:ModuleNotFoundError: No module named ‘scrapy.contrib‘" target="_blank">Python爬虫:Scrapy报错:ModuleNotFoundError: No module named ‘scrapy.contrib‘</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/bug/1.htm">bug</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</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>项目场景:今天,又开始自学Python爬虫Scrapy框架辽,爬爬爬于是又导包报错辽,,,问题描述:提示:第一行导入scrapy.contrib时报错了。原因分析:百度:找到类似的问题和解决方式:#bug:fromscrapytest.NewsItemsimportNewsItem#改为#debug:fromscrapytest.scrapytest.itemsimportNewsItem思考:重</div>
                    </li>
                    <li><a href="/article/1940253092926779392.htm"
                           title="Python - 爬虫;Scrapy框架之插件Extensions(四)" target="_blank">Python - 爬虫;Scrapy框架之插件Extensions(四)</a>
                        <span class="text-muted">MinggeQingchun</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/Scrapy/1.htm">Scrapy</a><a class="tag" taget="_blank" href="/search/extensions/1.htm">extensions</a>
                        <div>阅读本文前先参考https://blog.csdn.net/MinggeQingchun/article/details/145904572在Scrapy中,扩展(Extensions)是一种插件,允许你添加额外的功能到你的爬虫项目中。这些扩展可以在项目的不同阶段执行,比如启动、关闭、处理请求、处理响应等。Extensions官网文档:Extensions—Scrapy2.12.0document</div>
                    </li>
                    <li><a href="/article/1937094765413724160.htm"
                           title="基于Python的智能招聘信息聚合爬虫开发实战:Scrapy+Selenuim+AI解析" target="_blank">基于Python的智能招聘信息聚合爬虫开发实战:Scrapy+Selenuim+AI解析</a>
                        <span class="text-muted">Python爬虫项目</span>
<a class="tag" taget="_blank" href="/search/2025%E5%B9%B4%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/1.htm">2025年爬虫实战项目</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/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>摘要本文将详细介绍如何使用Python构建一个功能强大的智能招聘信息聚合爬虫系统。我们将结合Scrapy框架、Selenium自动化、反反爬技术、自然语言处理和数据存储等多项技术,实现从多个招聘网站高效抓取、清洗和存储招聘数据。文章包含完整的代码实现和架构设计,适合中高级Python开发者学习现代爬虫开发技术。关键词:Python爬虫、招聘信息聚合、Scrapy、Selenium、反反爬技术、数据</div>
                    </li>
                    <li><a href="/article/1936936309041983488.htm"
                           title="Python爬虫进阶必看!Scrapy框架实战:从架构解析到反爬突破的完整指南" target="_blank">Python爬虫进阶必看!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/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a>
                        <div>引言你是否遇到过这样的场景?想爬取豆瓣电影Top250的完整数据(电影名、评分、导演、上映时间),用requests+BeautifulSoup写了200行代码,却被以下问题困扰:手动管理请求队列,并发效率低;频繁请求被封IP,需手动切换代理;数据提取逻辑分散,清洗和存储代码混杂;遇到JS动态加载的页面,无法直接解析。这些问题的解决方案,藏在Python爬虫的“瑞士军刀”——Scrapy框架中。它</div>
                    </li>
                    <li><a href="/article/1936876045034647552.htm"
                           title="基于Python的智能宠物用品信息爬虫实战:Scrapy+Playwright+AI解析" target="_blank">基于Python的智能宠物用品信息爬虫实战:Scrapy+Playwright+AI解析</a>
                        <span class="text-muted">Python爬虫项目</span>
<a class="tag" taget="_blank" href="/search/2025%E5%B9%B4%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/1.htm">2025年爬虫实战项目</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/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>摘要本文将详细介绍如何使用Python构建一个高效的宠物用品信息爬虫系统,结合Scrapy框架、Playwright无头浏览器和AI解析技术,实现对各大电商平台宠物用品数据的自动化采集与分析。文章包含6000余字的技术解析和完整代码实现,适合中高级Python开发者学习现代爬虫技术。1.爬虫技术选型与架构设计现代网络爬虫面临三大挑战:动态内容加载、反爬虫机制和数据结构化。我们的解决方案采用分层架构</div>
                    </li>
                    <li><a href="/article/1936856494926524416.htm"
                           title="Python爬虫(六):Scrapy框架" target="_blank">Python爬虫(六):Scrapy框架</a>
                        <span class="text-muted">随机森林404</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/scrapy/1.htm">scrapy</a>
                        <div>"Scrapy到底该怎么学?"今天,我将用这篇万字长文,带你从零开始掌握Scrapy框架的核心用法,并分享我在实际项目中的实战经验!建议收藏⭐!一、Scrapy简介:为什么选择它?1.1ScrapyvsRequests+BeautifulSoup很多新手会问:“我已经会用Requests+BeautifulSoup了,为什么还要学Scrapy?”对比项Requests+BS4Scrapy性能同步请</div>
                    </li>
                    <li><a href="/article/1936829392852414464.htm"
                           title="Python网络爬虫:Scrapy框架的全面解析" target="_blank">Python网络爬虫:Scrapy框架的全面解析</a>
                        <span class="text-muted">4.0啊</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%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/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/ipython/1.htm">ipython</a>
                        <div>Python网络爬虫:Scrapy框架的全面解析一、引言在当今互联网的时代,数据是最重要的资源之一。为了获取这些数据,我们经常需要编写网络爬虫来从各种网站上抓取信息。Python作为一种强大的编程语言,拥有许多用于网络爬虫的工具和库。其中,Scrapy是一个功能强大且灵活的开源网络爬虫框架,它提供了一种高效的方式来爬取网站并提取所需的数据。本文将深入探讨Scrapy框架的核心概念、使用方法以及高级</div>
                    </li>
                    <li><a href="/article/1936826619515695104.htm"
                           title="Python爬虫进阶:Scrapy+Playwright+智能解析高效爬取B站游戏实况视频数据" target="_blank">Python爬虫进阶:Scrapy+Playwright+智能解析高效爬取B站游戏实况视频数据</a>
                        <span class="text-muted">Python爬虫项目</span>
<a class="tag" taget="_blank" href="/search/2025%E5%B9%B4%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/1.htm">2025年爬虫实战项目</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/%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><a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F/1.htm">游戏</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a>
                        <div>摘要本文将深入讲解如何构建一个高性能B站游戏实况视频爬虫系统,涵盖从逆向工程到分布式部署的全流程。项目采用Scrapy框架作为核心,集成Playwright处理动态渲染,使用智能解析技术应对B站反爬机制,结合MongoDB和Elasticsearch构建数据存储与检索系统,最终实现每小时可处理10万+视频数据的专业级采集方案。1.B站数据生态分析1.1游戏区数据价值热门游戏实时监测UP主影响力评估</div>
                    </li>
                    <li><a href="/article/1936646483591884800.htm"
                           title="Python 爬虫实战:英雄联盟赛事数据爬取(Scrapy+Playwright + 多源数据融合)" target="_blank">Python 爬虫实战:英雄联盟赛事数据爬取(Scrapy+Playwright + 多源数据融合)</a>
                        <span class="text-muted">Python核芯</span>
<a class="tag" taget="_blank" href="/search/Python%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/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/scrapy/1.htm">scrapy</a>
                        <div>引言在电竞数据分析领域,英雄联盟(LeagueofLegends)赛事数据具有极高的商业价值。本文将通过一个完整的实战案例,演示如何使用Scrapy框架结合Playwright库,实现多源赛事数据的爬取与融合。项目涵盖动态渲染页面处理、分布式爬虫架构、数据清洗整合等核心技术点,最终构建一个可扩展的电竞数据采集平台。一、技术选型分析1.1为什么选择Scrapy+Playwright组合?Scrapy</div>
                    </li>
                    <li><a href="/article/1935917243078602752.htm"
                           title="Scrapy爬虫实战:如何用Rules实现高效数据采集" target="_blank">Scrapy爬虫实战:如何用Rules实现高效数据采集</a>
                        <span class="text-muted">梦想画家</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B7%A5%E7%A8%8B/1.htm">数据分析工程</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><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/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                        <div>Scrapy是一个强大的Python爬虫框架,而其中的Rules类则为爬虫提供了更高级的控制方式。本文将详细介绍如何在Scrapy中使用Rules,以及各个参数的具体作用,并结合实际场景说明Rules的必要性。为什么需要Rules?在Web爬取过程中,网站的结构往往复杂多样,包含各种不同的组件、部分和子部分。手动编写每个请求和响应的处理逻辑不仅繁琐,而且容易出错。Rules类的引入正是为了解决这些</div>
                    </li>
                    <li><a href="/article/1935907661098840064.htm"
                           title="python数据可视化之美 豆瓣_Python数据可视化:豆瓣电影TOP250" target="_blank">python数据可视化之美 豆瓣_Python数据可视化:豆瓣电影TOP250</a>
                        <span class="text-muted">weixin_39599046</span>
<a class="tag" taget="_blank" href="/search/python%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E4%B9%8B%E7%BE%8E/1.htm">python数据可视化之美</a><a class="tag" taget="_blank" href="/search/%E8%B1%86%E7%93%A3/1.htm">豆瓣</a>
                        <div>作者:法纳斯特,Python爱好者,专注爬虫,数据分析及可视化微信公众号:法纳斯特(ID:walker398)豆瓣电影TOP250,对于众多爬虫爱好者,应该并不陌生。很多人都会以此作为第一个练手的小项目。当然这也多亏了豆瓣的包容,没有加以太多的反爬措施,对新手比较友好。本期通过Scrapy框架,对豆瓣电影TOP250信息进行爬取。同时对获取的数据进行可视化分析,给大家带来一个不一样的TOP250。</div>
                    </li>
                    <li><a href="/article/1934452549608337408.htm"
                           title="python基于spark的新闻推荐系统数据分析可视化爬虫的设计与实现pycharm毕业设计项目" target="_blank">python基于spark的新闻推荐系统数据分析可视化爬虫的设计与实现pycharm毕业设计项目</a>
                        <span class="text-muted">QQ_188083800</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a>
                        <div>目录具体实现截图课题项目源码功能介绍可定制设计功能创新点开发流程Scrapy爬虫框架爬虫核心代码展示论文书写大纲详细视频演示源码获取具体实现截图课题项目源码功能介绍基于Python大数据技术进行网络爬虫的设计,框架使用Scrapy.系统设计支持以下技术栈前端开发框架:vue.js数据库mysql版本不限后端语言框架支持:1java(SSM/springboot)-idea/eclipse2.pyt</div>
                    </li>
                    <li><a href="/article/1933240574391939072.htm"
                           title="巧用Scrapy:开启热门网站数据抓取之旅" target="_blank">巧用Scrapy:开启热门网站数据抓取之旅</a>
                        <span class="text-muted"></span>

                        <div>目录一、Scrapy爬虫初相识二、搭建Scrapy爬虫环境2.1安装Python2.2安装Scrapy三、创建Scrapy爬虫项目3.1项目初始化3.2定义爬虫四、热门网站数据爬取实战4.1解析网页数据4.2处理翻页4.3数据存储五、应对反爬虫策略5.1常见反爬虫机制5.2解决方案六、优化爬虫性能6.1多线程与异步处理6.2调整爬取频率七、爬虫部署与维护7.1部署到服务器7.2监控与维护八、总结与</div>
                    </li>
                    <li><a href="/article/1933235909352812544.htm"
                           title="Python Scrapy:抓取学术网站数据的有效途径" target="_blank">Python Scrapy:抓取学术网站数据的有效途径</a>
                        <span class="text-muted">AI天才研究院</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/wpf/1.htm">wpf</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a>
                        <div>基于PythonScrapy的学术网站数据抓取技术:原理、架构与实践指南关键词Scrapy框架、学术数据抓取、网络爬虫架构、反爬对抗策略、数据结构化处理、分布式爬虫、法律合规性摘要本指南系统解析基于PythonScrapy框架实现学术网站数据抓取的核心技术。从Scrapy的底层原理到学术场景的定制化改造,覆盖概念基础、理论框架、架构设计、实现机制、实际应用及高级考量全流程。通过第一性原理推导揭示爬</div>
                    </li>
                    <li><a href="/article/1932657092284444672.htm"
                           title="python 多线程 异步爬虫_python scrapy框架是异步还是多线程?" target="_blank">python 多线程 异步爬虫_python 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/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E6%AD%A5%E7%88%AC%E8%99%AB/1.htm">异步爬虫</a>
                        <div>小伙伴们很喜欢给小编出各种难题,比如今天关于框架,有小伙伴在浏览时,看到别人咨询异步还有多线程,因为自己也不是很理解,于是把问题转发给小编看,小编仔细看了下,虽然跟我们现在课程学习并没有什么相互关联的内容,但是既然这么感兴趣,以及为了解决小伙伴疑惑,决定为大家讲解下。什么是异步:工作涉及一次执行多个IO操作。什么是多线程:多线程:允许单个任务分成不同的部分运行相互之间是有一定的相似之处的,那我们接</div>
                    </li>
                    <li><a href="/article/1929630113964552192.htm"
                           title="Python 爬虫开发" target="_blank">Python 爬虫开发</a>
                        <span class="text-muted">cliffordl</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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>文章目录1.常用库安装2.基础爬虫开发2.1.使用requests获取网页内容2.2.使用BeautifulSoup解析HTML2.3.处理登录与会话3.进阶爬虫开发3.1.处理动态加载内容(Selenium)3.2.使用Scrapy框架3.3.分布式爬虫(Scrapy-Redis)4.爬虫优化与反反爬策略4.1.常见反爬机制及应对4.2.代理IP使用示例4.3.随机延迟与请求头Beautiful</div>
                    </li>
                    <li><a href="/article/1929528726098341888.htm"
                           title="用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)" target="_blank">用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)</a>
                        <span class="text-muted">猫头虎</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/opencv/1.htm">opencv</a><a class="tag" taget="_blank" href="/search/scipy/1.htm">scipy</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/beautifulsoup/1.htm">beautifulsoup</a><a class="tag" taget="_blank" href="/search/numpy/1.htm">numpy</a>
                        <div>用Python写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)摘要本文是一篇面向爬虫爱好者的超详细Python爬虫入门教程,涵盖了从基础到进阶的所有关键技术点:使用Requests与BeautifulSoup实现静态网页数据抓取,运用lxml、XPath、CSS选择器等高效解析技术,深入Scrapy框架搭建分布式爬虫项目,掌握Selenium和Playwri</div>
                    </li>
                    <li><a href="/article/1929432398525689856.htm"
                           title="Python高频面试题 - Scrapy爬虫框架高级五道题 上" target="_blank">Python高频面试题 - Scrapy爬虫框架高级五道题 上</a>
                        <span class="text-muted">孤寒者</span>
<a class="tag" taget="_blank" href="/search/Python%E5%85%A8%E6%A0%88%E7%B3%BB%E5%88%97%E6%95%99%E7%A8%8B/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/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E9%A2%91%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">高频面试题</a>
                        <div>目录:每篇前言:✅1.如何实现Scrapy的分布式抓取?使用scrapy-redis有什么注意事项?✅使用scrapy-redis可以将Scrapy转化为**分布式调度系统**:✅核心配置(settings.py):✅Spider改写方式:⚠️注意事项:✅2.Scrapy如何处理动态网页?如何与Selenium集成?✅动态网页的两种处理方式:✅Selenium集成方式:✅3.你如何设计一个支持增量</div>
                    </li>
                    <li><a href="/article/1929355504312709120.htm"
                           title="Python爬虫进阶:Scrapy框架与异步编程深度实践" target="_blank">Python爬虫进阶:Scrapy框架与异步编程深度实践</a>
                        <span class="text-muted">灏瀚星空</span>
<a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/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/scrapy/1.htm">scrapy</a>
                        <div>Python爬虫进阶:Scrapy框架与异步编程深度实践一、前言:为什么要学习框架与异步编程?在数据驱动的时代,爬虫技术已成为获取信息的核心手段。对于初学者,掌握基础的requests库可完成简单数据采集。但面对以下场景时:百万级数据抓取复杂反爬机制对抗分布式采集集群搭建每秒数百请求的效率提升需要更专业的工具与方法。本文将深入讲解Scrapy框架的工程化实践,并通过异步编程实现性能突破。掌握这些技</div>
                    </li>
                    <li><a href="/article/1929195384492584960.htm"
                           title="python爬虫scrapy入门看这篇就够了_Python网络爬虫4 - scrapy入门" target="_blank">python爬虫scrapy入门看这篇就够了_Python网络爬虫4 - scrapy入门</a>
                        <span class="text-muted">weixin_39977136</span>

                        <div>scrapy作为一款强大的爬虫框架,当然要好好学习一番,本文便是本人学习和使用scrapy过后的一个总结,内容比较基础,算是入门笔记吧,主要讲述scrapy的基本概念和使用方法。scrapyframework首先附上scrapy经典图如下:scrapy框架包含以下几个部分ScrapyEngine引擎Spiders爬虫Scheduler调度器Downloader下载器ItemPipeline项目管道</div>
                    </li>
                    <li><a href="/article/1927907987595259904.htm"
                           title="基于Scrapy的天猫商品数据爬取与分析实战(含API签名破解与可视化)" target="_blank">基于Scrapy的天猫商品数据爬取与分析实战(含API签名破解与可视化)</a>
                        <span class="text-muted">灏瀚星空</span>
<a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/1.htm">爬虫学习记录</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/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a>
                        <div>基于Scrapy的天猫商品数据爬取与分析实战(含API签名破解与可视化)本文以华为Mate60Pro为例,详细介绍如何使用Scrapy框架爬取天猫商品数据,涵盖API签名破解、反爬应对、数据存储及可视化全流程,适合爬虫进阶学习者实践。一、抓包分析:定位天猫商品API1.1目标与工具目标:获取华为Mate60Pro的价格、销量等数据工具:Chrome开发者工具(F12)、Mitmproxy(可选)1</div>
                    </li>
                    <li><a href="/article/1926901362520551424.htm"
                           title="Python Scrapy:使用Scrapy Downloader Middleware进行响应处理" target="_blank">Python Scrapy:使用Scrapy Downloader Middleware进行响应处理</a>
                        <span class="text-muted">Python编程之道</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/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a>
                        <div>PythonScrapy:使用ScrapyDownloaderMiddleware进行响应处理关键词:PythonScrapy、DownloaderMiddleware、响应处理、爬虫框架、中间件摘要:本文深入探讨了在PythonScrapy框架中使用DownloaderMiddleware进行响应处理的相关技术。首先介绍了Scrapy框架及DownloaderMiddleware的背景知识,接着</div>
                    </li>
                                <li><a href="/article/7.htm"
                                       title="LeetCode[位运算] - #137 Single Number II" target="_blank">LeetCode[位运算] - #137 Single Number II</a>
                                    <span class="text-muted">Cwind</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Algorithm/1.htm">Algorithm</a><a class="tag" taget="_blank" href="/search/LeetCode/1.htm">LeetCode</a><a class="tag" taget="_blank" href="/search/%E9%A2%98%E8%A7%A3/1.htm">题解</a><a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a>
                                    <div>原题链接:#137 Single Number II  
要求: 
给定一个整型数组,其中除了一个元素之外,每个元素都出现三次。找出这个元素 
注意:算法的时间复杂度应为O(n),最好不使用额外的内存空间 
  
难度:中等 
  
分析: 
与#136类似,都是考察位运算。不过出现两次的可以使用异或运算的特性 n XOR n = 0, n XOR 0 = n,即某一</div>
                                </li>
                                <li><a href="/article/134.htm"
                                       title="《JavaScript语言精粹》笔记" target="_blank">《JavaScript语言精粹》笔记</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div>0、JavaScript的简单数据类型包括数字、字符创、布尔值(true/false)、null和undefined值,其它值都是对象。 
1、JavaScript只有一个数字类型,它在内部被表示为64位的浮点数。没有分离出整数,所以1和1.0的值相同。 
2、NaN是一个数值,表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它本身。可以用函数isNaN(number)检测NaN,但是</div>
                                </li>
                                <li><a href="/article/261.htm"
                                       title="你应该更新的Java知识之常用程序库" target="_blank">你应该更新的Java知识之常用程序库</a>
                                    <span class="text-muted">Kai_Ge</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>在很多人眼中,Java 已经是一门垂垂老矣的语言,但并不妨碍 Java 世界依然在前进。如果你曾离开 Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老 Java 中的新东西。 
Guava 
Guava[gwɑ:və],一句话,只要你做Java项目,就应该用Guava(Github)。 
guava 是 Google 出品的一套 Java 核心库,在我看来,它甚至应该</div>
                                </li>
                                <li><a href="/article/388.htm"
                                       title="HttpClient" target="_blank">HttpClient</a>
                                    <span class="text-muted">120153216</span>
<a class="tag" taget="_blank" href="/search/httpclient/1.htm">httpclient</a>
                                    <div>/**
 * 可以传对象的请求转发,对象已流形式放入HTTP中
 */
public static Object doPost(Map<String,Object> parmMap,String url)
	{
		Object object = null;
		HttpClient hc = new HttpClient();
		
		String fullURL </div>
                                </li>
                                <li><a href="/article/515.htm"
                                       title="Django model字段类型清单" target="_blank">Django model字段类型清单</a>
                                    <span class="text-muted">2002wmj</span>
<a class="tag" taget="_blank" href="/search/django/1.htm">django</a>
                                    <div>Django 通过 models 实现数据库的创建、修改、删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长。你通常不需要直接使用这个字段;如果你不指定主键的话,系统会自动添加一个主键字段到你的model。(参阅自动主键字段)  BooleanField:布尔字段,管理工具里会自动将其描述为checkbox。  Cha</div>
                                </li>
                                <li><a href="/article/642.htm"
                                       title="在SQLSERVER中查找消耗CPU最多的SQL" target="_blank">在SQLSERVER中查找消耗CPU最多的SQL</a>
                                    <span class="text-muted">357029540</span>
<a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a>
                                    <div>返回消耗CPU数目最多的10条语句 
 
SELECT TOP 10 
   total_worker_time/execution_count AS avg_cpu_cost, plan_handle, 
   execution_count, 
   (SELECT SUBSTRING(text, statement_start_of</div>
                                </li>
                                <li><a href="/article/769.htm"
                                       title="Myeclipse项目无法部署,Undefined exploded archive location" target="_blank">Myeclipse项目无法部署,Undefined exploded archive location</a>
                                    <span class="text-muted">7454103</span>
<a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/MyEclipse/1.htm">MyEclipse</a>
                                    <div>做个备忘! 
 
错误信息为: 
      Undefined exploded archive location 
 
 
原因: 
          在工程转移过程中,导致工程的配置文件出错; 
 
 
解决方法: 
   </div>
                                </li>
                                <li><a href="/article/896.htm"
                                       title="GMT时间格式转换" target="_blank">GMT时间格式转换</a>
                                    <span class="text-muted">adminjun</span>
<a class="tag" taget="_blank" href="/search/GMT/1.htm">GMT</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E8%BD%AC%E6%8D%A2/1.htm">时间转换</a>
                                    <div>普通的时间转换问题我这里就不再罗嗦了,我想大家应该都会那种低级的转换问题吧,现在我向大家总结一下如何转换GMT时间格式,这种格式的转换方法网上还不是很多,所以有必要总结一下,也算给有需要的朋友一个小小的帮助啦。 
1、可以使用 
SimpleDateFormat SimpleDateFormat    
EEE-三位星期 
d-天 
MMM-月 
yyyy-四位年 
</div>
                                </li>
                                <li><a href="/article/1023.htm"
                                       title="Oracle数据库新装连接串问题" target="_blank">Oracle数据库新装连接串问题</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/oracle%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">oracle数据库</a>
                                    <div>割接新装了数据库,客户端登陆无问题,apache/cgi-bin程序有问题,sqlnet.log日志如下: 
Fatal NI connect error 12170. 
  VERSION INFORMATION:         TNS for Linux: Version 10.2.0.4.0 - Product</div>
                                </li>
                                <li><a href="/article/1150.htm"
                                       title="回顾java数组复制" target="_blank">回顾java数组复制</a>
                                    <span class="text-muted">ayaoxinchao</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a>
                                    <div>在写这篇文章之前,也看了一些别人写的,基本上都是大同小异。文章是对java数组复制基础知识的回顾,算是作为学习笔记,供以后自己翻阅。首先,简单想一下这个问题:为什么要复制数组?我的个人理解:在我们在利用一个数组时,在每一次使用,我们都希望它的值是初始值。这时我们就要对数组进行复制,以达到原始数组值的安全性。java数组复制大致分为3种方式:①for循环方式 ②clone方式 ③arrayCopy方</div>
                                </li>
                                <li><a href="/article/1277.htm"
                                       title="java web会话监听并使用spring注入" target="_blank">java web会话监听并使用spring注入</a>
                                    <span class="text-muted">bewithme</span>
<a class="tag" taget="_blank" href="/search/Java+Web/1.htm">Java Web</a>
                                    <div>  
      在java web应用中,当你想在建立会话或移除会话时,让系统做某些事情,比如说,统计在线用户,每当有用户登录时,或退出时,那么可以用下面这个监听器来监听。 
       
import java.util.ArrayList;
import java.ut</div>
                                </li>
                                <li><a href="/article/1404.htm"
                                       title="NoSQL数据库之Redis数据库管理(Redis的常用命令及高级应用)" target="_blank">NoSQL数据库之Redis数据库管理(Redis的常用命令及高级应用)</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a>
                                    <div>一 .Redis常用命令 
        Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在Linux终端使用。 
        a.键值相关命令 
        b.服务器相关命令 
1.键值相关命令 
      &</div>
                                </li>
                                <li><a href="/article/1531.htm"
                                       title="java枚举序列化问题" target="_blank">java枚举序列化问题</a>
                                    <span class="text-muted">bingyingao</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%9E%9A%E4%B8%BE/1.htm">枚举</a><a class="tag" taget="_blank" href="/search/%E5%BA%8F%E5%88%97%E5%8C%96/1.htm">序列化</a>
                                    <div>对象在网络中传输离不开序列化和反序列化。而如果序列化的对象中有枚举值就要特别注意一些发布兼容问题: 
 
 
1.加一个枚举值 
新机器代码读分布式缓存中老对象,没有问题,不会抛异常。 
 
老机器代码读分布式缓存中新对像,反序列化会中断,所以在所有机器发布完成之前要避免出现新对象,或者提前让老机器拥有新增枚举的jar。 
 
 
 
  2.删一个枚举值 
新机器代码读分布式缓存中老对象,反序列</div>
                                </li>
                                <li><a href="/article/1658.htm"
                                       title="【Spark七十八】Spark Kyro序列化" target="_blank">【Spark七十八】Spark Kyro序列化</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a>
                                    <div>当使用SparkContext的saveAsObjectFile方法将对象序列化到文件,以及通过objectFile方法将对象从文件反序列出来的时候,Spark默认使用Java的序列化以及反序列化机制,通常情况下,这种序列化机制是很低效的,Spark支持使用Kyro作为对象的序列化和反序列化机制,序列化的速度比java更快,但是使用Kyro时要注意,Kyro目前还是有些bug。 
 
 Spark</div>
                                </li>
                                <li><a href="/article/1785.htm"
                                       title="Hybridizing OO and Functional Design" target="_blank">Hybridizing OO and Functional Design</a>
                                    <span class="text-muted">bookjovi</span>
<a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a><a class="tag" taget="_blank" href="/search/haskell/1.htm">haskell</a>
                                    <div>  推荐博文:
Tell Above, and Ask Below - Hybridizing OO and Functional Design  
文章中把OO和FP讲的深入透彻,里面把smalltalk和haskell作为典型的两种编程范式代表语言,此点本人极为同意,smalltalk可以说是最能体现OO设计的面向对象语言,smalltalk的作者Alan kay也是OO的最早先驱,</div>
                                </li>
                                <li><a href="/article/1912.htm"
                                       title="Java-Collections Framework学习与总结-HashMap" target="_blank">Java-Collections Framework学习与总结-HashMap</a>
                                    <span class="text-muted">BrokenDreams</span>
<a class="tag" taget="_blank" href="/search/Collections/1.htm">Collections</a>
                                    <div>        开发中常常会用到这样一种数据结构,根据一个关键字,找到所需的信息。这个过程有点像查字典,拿到一个key,去字典表中查找对应的value。Java1.0版本提供了这样的类java.util.Dictionary(抽象类),基本上支持字典表的操作。后来引入了Map接口,更好的描述的这种数据结构。 
 &nb</div>
                                </li>
                                <li><a href="/article/2039.htm"
                                       title="读《研磨设计模式》-代码笔记-职责链模式-Chain Of Responsibility" target="_blank">读《研磨设计模式》-代码笔记-职责链模式-Chain Of Responsibility</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a>
                                    <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ 
 
 
 
 




/**
 * 业务逻辑:项目经理只能处理500以下的费用申请,部门经理是1000,总经理不设限。简单起见,只同意“Tom”的申请
 * bylijinnan
 */
abstract class Handler {
	/* </div>
                                </li>
                                <li><a href="/article/2166.htm"
                                       title="Android中启动外部程序" target="_blank">Android中启动外部程序</a>
                                    <span class="text-muted">cherishLC</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                                    <div>1、启动外部程序 
引用自: 
http://blog.csdn.net/linxcool/article/details/7692374 
 
//方法一
Intent intent=new Intent();
//包名 包名+类名(全路径)
intent.setClassName("com.linxcool", "com.linxcool.PlaneActi</div>
                                </li>
                                <li><a href="/article/2293.htm"
                                       title="summary_keep_rate" target="_blank">summary_keep_rate</a>
                                    <span class="text-muted">coollyj</span>
<a class="tag" taget="_blank" href="/search/SUM/1.htm">SUM</a>
                                    <div>
BEGIN  
      /*DECLARE  minDate varchar(20) ;
      DECLARE  maxDate varchar(20) ;*/
      DECLARE  stkDate varchar(20) ;

      DECLARE done int default -1; 
			/* 游标中 注册服务器地址 */  
      DE</div>
                                </li>
                                <li><a href="/article/2420.htm"
                                       title="hadoop hdfs 添加数据目录出错" target="_blank">hadoop hdfs 添加数据目录出错</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/hdfs/1.htm">hdfs</a><a class="tag" taget="_blank" href="/search/%E6%89%A9%E5%AE%B9/1.htm">扩容</a>
                                    <div>由于原来配置的hadoop data目录快要用满了,故准备修改配置文件增加数据目录,以便扩容,但由于疏忽,把core-site.xml, hdfs-site.xml配置文件dfs.datanode.data.dir 配置项增加了配置目录,但未创建实际目录,重启datanode服务时,报如下错误: 
 
2014-11-18 08:51:39,128 WARN org.apache.hadoop.h</div>
                                </li>
                                <li><a href="/article/2547.htm"
                                       title="grep 目录级联查找" target="_blank">grep 目录级联查找</a>
                                    <span class="text-muted">dongwei_6688</span>
<a class="tag" taget="_blank" href="/search/grep/1.htm">grep</a>
                                    <div>       在Mac或者Linux下使用grep进行文件内容查找时,如果给定的目标搜索路径是当前目录,那么它默认只搜索当前目录下的文件,而不会搜索其下面子目录中的文件内容,如果想级联搜索下级目录,需要使用一个“-r”参数: 
grep -n -r "GET" . 
  
上面的命令将会找出当前目录“.”及当前目录中所有下级目录</div>
                                </li>
                                <li><a href="/article/2674.htm"
                                       title="yii 修改模块使用的布局文件" target="_blank">yii 修改模块使用的布局文件</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a><a class="tag" taget="_blank" href="/search/layouts/1.htm">layouts</a>
                                    <div>方法一:yii模块默认使用系统当前的主题布局文件,如果在主配置文件中配置了主题比如:  'theme'=>'mythm',   那么yii的模块就使用 protected/themes/mythm/views/layouts 下的布局文件;   如果未配置主题,那么 yii的模块就使用  protected/views/layouts 下的布局文件, 总之默认不是使用自身目录 pr</div>
                                </li>
                                <li><a href="/article/2801.htm"
                                       title="设计模式之单例模式" target="_blank">设计模式之单例模式</a>
                                    <span class="text-muted">come_for_dream</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/1.htm">单例模式</a><a class="tag" taget="_blank" href="/search/%E6%87%92%E6%B1%89%E5%BC%8F%E9%A5%BF%E6%B1%89%E5%BC%8F/1.htm">懒汉式饿汉式</a><a class="tag" taget="_blank" href="/search/%E5%8F%8C%E9%87%8D%E6%A3%80%E9%AA%8C%E9%94%81%E5%A4%B1%E8%B4%A5/1.htm">双重检验锁失败</a><a class="tag" taget="_blank" href="/search/%E6%97%A0%E5%BA%8F%E5%86%99%E5%85%A5/1.htm">无序写入</a>
                                    <div>                今天该来的面试还没来,这个店估计不会来电话了,安静下来写写博客也不错,没事翻了翻小易哥的博客甚至与大牛们之间的差距,基础知识不扎实建起来的楼再高也只能是危楼罢了,陈下心回归基础把以前学过的东西总结一下。 
  
*********************************</div>
                                </li>
                                <li><a href="/article/2928.htm"
                                       title="8、数组" target="_blank">8、数组</a>
                                    <span class="text-muted">豆豆咖啡</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">二维数组</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a><a class="tag" taget="_blank" href="/search/%E4%B8%80%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">一维数组</a>
                                    <div>  
一、概念 
  
    数组是同一种类型数据的集合。其实数组就是一个容器。 
  
二、好处 
  
    可以自动给数组中的元素从0开始编号,方便操作这些元素 
  
三、格式 
  
//一维数组
1,元素类型[] 变量名 = new 元素类型[元素的个数]
int[] arr =</div>
                                </li>
                                <li><a href="/article/3055.htm"
                                       title="Decode Ways" target="_blank">Decode Ways</a>
                                    <span class="text-muted">hcx2013</span>
<a class="tag" taget="_blank" href="/search/decode/1.htm">decode</a>
                                    <div>A message containing letters from A-Z is being encoded to numbers using the following mapping: 
'A' -> 1
'B' -> 2
...
'Z' -> 26
 
Given an encoded message containing digits, det</div>
                                </li>
                                <li><a href="/article/3182.htm"
                                       title="Spring4.1新特性——异步调度和事件机制的异常处理" target="_blank">Spring4.1新特性——异步调度和事件机制的异常处理</a>
                                    <span class="text-muted">jinnianshilongnian</span>
<a class="tag" taget="_blank" href="/search/spring+4.1/1.htm">spring 4.1</a>
                                    <div>目录 
Spring4.1新特性——综述 
Spring4.1新特性——Spring核心部分及其他 
Spring4.1新特性——Spring缓存框架增强 
Spring4.1新特性——异步调用和事件机制的异常处理 
Spring4.1新特性——数据库集成测试脚本初始化 
Spring4.1新特性——Spring MVC增强 
Spring4.1新特性——页面自动化测试框架Spring MVC T</div>
                                </li>
                                <li><a href="/article/3309.htm"
                                       title="squid3(高命中率)缓存服务器配置" target="_blank">squid3(高命中率)缓存服务器配置</a>
                                    <span class="text-muted">liyonghui160com</span>

                                    <div>  
  
系统:centos 5.x 
  需要的软件:squid-3.0.STABLE25.tar.gz 
1.下载squid 
wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz 
tar zxf squid-3.0.STABLE25.tar.gz &&</div>
                                </li>
                                <li><a href="/article/3436.htm"
                                       title="避免Java应用中NullPointerException的技巧和最佳实践" target="_blank">避免Java应用中NullPointerException的技巧和最佳实践</a>
                                    <span class="text-muted">pda158</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>1) 从已知的String对象中调用equals()和equalsIgnoreCase()方法,而非未知对象。     总是从已知的非空String对象中调用equals()方法。因为equals()方法是对称的,调用a.equals(b)和调用b.equals(a)是完全相同的,这也是为什么程序员对于对象a和b这么不上心。如果调用者是空指针,这种调用可能导致一个空指针异常 
Object unk</div>
                                </li>
                                <li><a href="/article/3563.htm"
                                       title="如何在Swift语言中创建http请求" target="_blank">如何在Swift语言中创建http请求</a>
                                    <span class="text-muted">shoothao</span>
<a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/swift/1.htm">swift</a>
                                    <div>  
 概述:本文通过实例从同步和异步两种方式上回答了”如何在Swift语言中创建http请求“的问题。  
   
如果你对Objective-C比较了解的话,对于如何创建http请求你一定驾轻就熟了,而新语言Swift与其相比只有语法上的区别。但是,对才接触到这个崭新平台的初学者来说,他们仍然想知道“如何在Swift语言中创建http请求?”。 
在这里,我将作出一些建议来回答上述问题。常见的</div>
                                </li>
                                <li><a href="/article/3690.htm"
                                       title="Spring事务的传播方式" target="_blank">Spring事务的传播方式</a>
                                    <span class="text-muted">uule</span>
<a class="tag" taget="_blank" href="/search/spring%E4%BA%8B%E5%8A%A1/1.htm">spring事务</a>
                                    <div>传播方式:  
      新建事务 
      required 
      required_new   - 挂起当前 
  
      非事务方式运行 
      supports 
  &nbs</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>