zoukankan      html  css  js  c++  java
  • Scrapy研究探索(六)——自己主动爬取网页之II(CrawlSpider)

    原创,转载注明:http://blog.csdn.net/u012150179/article/details/34913315

    .目的。

    在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中使用基于Spider实现了自己的w3cschool_spider,并在items.py中定义了数据结构,

    pipelines.py中实现获得数据的过滤以及保存。

    可是以上述方法仅仅能爬取start_url列表中的网页。而网络爬虫如google等搜索引擎爬虫实现的就是对整个互联网的爬取,所以在本教程中研究使用scrapy自己主动实现多网页爬取功能。

    在教程(五)(http://blog.csdn.net/u012150179/article/details/34486677)中已经编写继承自spider的类实现爬虫。实现了自己主动多网页爬取,这里引出CrawlSpider类,使用更简单方式实现自己主动爬取。


    .热身。

      1.CrawlSpider

      1)概念与作用:

      它是Spider的派生类。首先在说下Spider,它是全部爬虫的基类,对于它的设计原则是仅仅爬取start_url列表中的网页。而从爬取的网页中获取link并继续爬取的工作CrawlSpider类更适合。

      2)使用

      它与Spider类的最大不同是多了一个rules參数,其作用是定义提取动作。在rules中包括一个或多个Rule对象,Rule类与CrawlSpider类都位于scrapy.contrib.spiders模块中。

      class scrapy.contrib.spiders.Rule (
      link_extractor, callback=None,cb_kwargs=None,follow=None,process_links=None,process_request=None )

                         当中:

    link_extractorLinkExtractor,用于定义须要提取的链接。

    callback參数:当link_extractor获取到链接时參数所指定的值作为回调函数。



                          callback參数使用注意:

    当编写爬虫规则时,请避免使用parse作为回调函数。于CrawlSpider使用parse方法来实现其逻辑,假设您覆盖了parse方法。crawlspider将会执行失败。


    follow:指定了依据该规则从response提取的链接是否须要跟进。当callbackNone,默认值为true

    process_links:主要用来过滤由link_extractor获取到的链接。

    process_request:主要用来过滤在rule中提取到的request



    2.LinkExtractor

    (1)概念:

    顾名思义。链接提取器。

    (2) 作用:

    response对象中获取链接,而且该链接会被接下来爬取。

    (3) 使用:

    通过SmglLinkExtractor提取希望获取的链接。

    classscrapy.contrib.linkextractors.sgml.SgmlLinkExtractor(
    allow=(),deny=(),allow_domains=(),deny_domains=(),deny_extensions=None,restrict_xpaths=(),tags=('a','area'),attrs=('href'),canonicalize=True,unique=True,process_value=None)

    主要參数:

    allow:满足括号里“正則表達式”的值会被提取,假设为空,则所有匹配。

    deny与这个正則表達式(或正則表達式列表)不匹配的URL一定不提取

    allow_domains会被提取的链接的domains

    deny_domains:一定不会被提取链接的domains

    restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。



    .RUN!

    1. shell中验证

      開始编写代码之前。使用scrapyshell查看使用SmglLinkExtractor在网页中获取到的链接:

      scrapy shell http://blog.csdn.net/u012150179/article/details/11749017

      继续import相关模块:

      fromscrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

      如今使用SgmlLinkExtractor查看在当前网页中获得的链接:

      item=SgmlLinkExtractor(allow=('/u012150179/article/details')).extract_links(response)

      当中item为包括Link()对象的列表。如今显示当中的text元素(就是获取到的文章链接相应的文章标题):

      for i in item:
          print i.text

      部分结果截图:

      对比网页能够得到此时获取的是当前网页中全部满足allow条件的链接,不仅包括“下一篇”的链接,还有网页側边栏“阅读排行“、”评论排行“中的文章链接。为了仅仅获得”下一篇“文章链接,这就要进行全部链接的筛选。引入參数restrict_xpaths,继续:

      item= SgmlLinkExtractor(allow=('/u012150179/article/details'),restrict_xpaths=('//li[@class="next_article"]')).extract_links(response)

      这是在如上查看结果,便提取出了“下一篇”文章链接。

      注意:在shell中并不正确提取到的link进行跟进。

      在这里不得不提的就是scrapy shell是对调试、验证非常实用的交互工具。应该掌握。

      shell中进行了验证后进入写代码阶段。

    编写代码

    1items.pypipelines.py以及settings.py与之前教程类似,不具体描写叙述。


    2)爬虫编写。

    上码:

    # -*- coding:utf-8 -*-
    
    from scrapy.contrib.spiders import CrawlSpider, Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.selector import Selector
    from CSDNBlogCrawlSpider.items import CsdnblogcrawlspiderItem
    
    
    class CSDNBlogCrawlSpider(CrawlSpider):
    
        """继承自CrawlSpider,实现自己主动爬取的爬虫。

    """ name = "CSDNBlogCrawlSpider" #设置下载延时 download_delay = 2 allowed_domains = ['blog.csdn.net'] #第一篇文章地址 start_urls = ['http://blog.csdn.net/u012150179/article/details/11749017'] #rules编写法一。官方文档方式 #rules = [ # #提取“下一篇”的链接并**跟进**,若不使用restrict_xpaths參数限制。会将页面中所有 # #符合allow链接所有抓取 # Rule(SgmlLinkExtractor(allow=('/u012150179/article/details'), # restrict_xpaths=('//li[@class="next_article"]')), # follow=True) # # #提取“下一篇”链接并运行**处理** # #Rule(SgmlLinkExtractor(allow=('/u012150179/article/details')), # # callback='parse_item', # # follow=False), #] #rules编写法二,更推荐的方式(自己測验。使使用方法一时常常出现爬到中间就finish情况,而且无错误码) rules = [ Rule(SgmlLinkExtractor(allow=('/u012150179/article/details'), restrict_xpaths=('//li[@class="next_article"]')), callback='parse_item', follow=True) ] def parse_item(self, response): #print "parse_item>>>>>>" item = CsdnblogcrawlspiderItem() sel = Selector(response) blog_url = str(response.url) blog_name = sel.xpath('//div[@id="article_details"]/div/h1/span/a/text()').extract() item['blog_name'] = [n.encode('utf-8') for n in blog_name] item['blog_url'] = blog_url.encode('utf-8') yield item


    执行:

    scrapy crawl CSDNBlogCrawlSpider

    得到的效果如教程(五)一致。


    当中指出和教程(五)所编写爬虫方法的差异:

    首先。基类CrawlSpider提供了更完好的自己主动多网页爬取机制,仅仅须要我们配置的就是rules,通过Rule对象实现链接的提取与跟进。恩,对,没了。

    。。

    就这样。

    具体的凝视也都在程序中。

    进行到这里,就将本篇文章主题讲述完成。核心是CrawlSpider,主要方法是rules。



    关于scrapy的使用可參见之前文章:

    http://blog.csdn.net/u012150179/article/details/34913315

    http://blog.csdn.net/u012150179/article/details/34486677

    http://blog.csdn.net/u012150179/article/details/34441655

    http://blog.csdn.net/u012150179/article/details/32911511


  • 相关阅读:
    最实用的深度学习教程 Practical Deep Learning For Coders (Kaggle 冠军 Jeremy Howard 亲授)
    线性代数的本质与几何意义 01. 向量是什么?(3blue1brown 咪博士 图文注解版)
    【小蜜蜂老师主讲】基于STM32CubeMX的嵌入式开发基础教程
    【STM32专题教程】STM32CubeMX的安装与快速入门
    【技能大赛真题】2019年物联网国赛任务三题1-无线通信系统
    【CC2530强化实训03】定时器间隔定时实现按键长按与短按
    【CC2530强化实训04】定时器间隔定时实现按键N连击
    【CC2530强化实训02】普通延时函数实现按键的长按与短按
    【CC2530强化实训01】普通延时函数实现按键的长按与短按
    【蓝桥杯单片机12】实时时钟DS1302的基本操作
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6910471.html
Copyright © 2011-2022 走看看