• CrawlSpider爬虫


    CrawlSpider

    在上一个糗事百科的爬虫案例中。我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request

    CrawlSpider爬虫:

    创建CrawlSpider爬虫:

    之前创建爬虫的方式是通过scrapy genspider [爬虫名字] [域名]的方式创建的。如果想要创建CrawlSpider爬虫,那么应该通过以下命令创建:

    scrapy genspider -t crawl [爬虫名字] [域名]
    

    LinkExtractors链接提取器:

    使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。以下对LinkExtractors类做一个简单的介绍:

    class scrapy.linkextractors.LinkExtractor(
        allow = (),
        deny = (),
        allow_domains = (),
        deny_domains = (),
        deny_extensions = None,
        restrict_xpaths = (),
        tags = ('a','area'),
        attrs = ('href'),
        canonicalize = True,
        unique = True,
        process_value = None
    )
    

    主要参数讲解:

    • allow:允许的url。所有满足这个正则表达式的url都会被提取。
    • deny:禁止的url。所有满足这个正则表达式的url都不会被提取。
    • allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
    • deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
    • restrict_xpaths:严格的xpath。和allow共同过滤链接。

    Rule规则类:

    定义爬虫的规则类。以下对这个类做一个简单的介绍:

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

    主要参数讲解:

    • link_extractor:一个LinkExtractor对象,用于定义爬取规则。
    • callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。
    • follow:指定根据该规则从response中提取的链接是否需要跟进。
    • process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

    微信小程序社区CrawlSpider案例

    CrawlSpider

    在上一个糗事百科的爬虫案例中。我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request

    CrawlSpider爬虫:

    创建CrawlSpider爬虫:

    之前创建爬虫的方式是通过scrapy genspider [爬虫名字] [域名]的方式创建的。如果想要创建CrawlSpider爬虫,那么应该通过以下命令创建:

    scrapy genspider -c crawl [爬虫名字] [域名]
    

    LinkExtractors链接提取器:

    使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。以下对LinkExtractors类做一个简单的介绍:

    class scrapy.linkextractors.LinkExtractor(
        allow = (),
        deny = (),
        allow_domains = (),
        deny_domains = (),
        deny_extensions = None,
        restrict_xpaths = (),
        tags = ('a','area'),
        attrs = ('href'),
        canonicalize = True,
        unique = True,
        process_value = None
    )
    

    主要参数讲解:

    • allow:允许的url。所有满足这个正则表达式的url都会被提取。
    • deny:禁止的url。所有满足这个正则表达式的url都不会被提取。
    • allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
    • deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
    • restrict_xpaths:严格的xpath。和allow共同过滤链接。

    Rule规则类:

    定义爬虫的规则类。以下对这个类做一个简单的介绍:

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

    主要参数讲解:

    • link_extractor:一个LinkExtractor对象,用于定义爬取规则。
    • callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。
    • follow:指定根据该规则从response中提取的链接是否需要跟进。
    • process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

    微信小程序社区CrawlSpider案例

    CrawlSpider

    在上一个糗事百科的爬虫案例中。我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request

    CrawlSpider爬虫:

    创建CrawlSpider爬虫:

    之前创建爬虫的方式是通过scrapy genspider [爬虫名字] [域名]的方式创建的。如果想要创建CrawlSpider爬虫,那么应该通过以下命令创建:

    scrapy genspider -c crawl [爬虫名字] [域名]
    

    LinkExtractors链接提取器:

    使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。以下对LinkExtractors类做一个简单的介绍:

    class scrapy.linkextractors.LinkExtractor(
        allow = (),
        deny = (),
        allow_domains = (),
        deny_domains = (),
        deny_extensions = None,
        restrict_xpaths = (),
        tags = ('a','area'),
        attrs = ('href'),
        canonicalize = True,
        unique = True,
        process_value = None
    )
    

    主要参数讲解:

    • allow:允许的url。所有满足这个正则表达式的url都会被提取。
    • deny:禁止的url。所有满足这个正则表达式的url都不会被提取。
    • allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
    • deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
    • restrict_xpaths:严格的xpath。和allow共同过滤链接。

    Rule规则类:

    定义爬虫的规则类。以下对这个类做一个简单的介绍:

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

    主要参数讲解:

    • link_extractor:一个LinkExtractor对象,用于定义爬取规则。
    • callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。
    • follow:指定根据该规则从response中提取的链接是否需要跟进。
    • process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

    微信小程序社区CrawlSpider案例

    CrawlSpider

    在上一个糗事百科的爬虫案例中。我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request

    CrawlSpider爬虫:

    创建CrawlSpider爬虫:

    之前创建爬虫的方式是通过scrapy genspider [爬虫名字] [域名]的方式创建的。如果想要创建CrawlSpider爬虫,那么应该通过以下命令创建:

    scrapy genspider -c crawl [爬虫名字] [域名]
    

    LinkExtractors链接提取器:

    使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。以下对LinkExtractors类做一个简单的介绍:

    class scrapy.linkextractors.LinkExtractor(
        allow = (),
        deny = (),
        allow_domains = (),
        deny_domains = (),
        deny_extensions = None,
        restrict_xpaths = (),
        tags = ('a','area'),
        attrs = ('href'),
        canonicalize = True,
        unique = True,
        process_value = None
    )
    

    主要参数讲解:

    • allow:允许的url。所有满足这个正则表达式的url都会被提取。
    • deny:禁止的url。所有满足这个正则表达式的url都不会被提取。
    • allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
    • deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
    • restrict_xpaths:严格的xpath。和allow共同过滤链接。

    Rule规则类:

    定义爬虫的规则类。以下对这个类做一个简单的介绍:

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

    主要参数讲解:

    • link_extractor:一个LinkExtractor对象,用于定义爬取规则。
    • callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。
    • follow:指定根据该规则从response中提取的链接是否需要跟进。
    • process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

    微信小程序社区CrawlSpider案例

    CrawlSpider

    在上一个糗事百科的爬虫案例中。我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request

    CrawlSpider爬虫:

    创建CrawlSpider爬虫:

    之前创建爬虫的方式是通过scrapy genspider [爬虫名字] [域名]的方式创建的。如果想要创建CrawlSpider爬虫,那么应该通过以下命令创建:

    scrapy genspider -t crawl [爬虫名字] [域名]
    

    LinkExtractors链接提取器:

    使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。以下对LinkExtractors类做一个简单的介绍:

    class scrapy.linkextractors.LinkExtractor(
        allow = (),
        deny = (),
        allow_domains = (),
        deny_domains = (),
        deny_extensions = None,
        restrict_xpaths = (),
        tags = ('a','area'),
        attrs = ('href'),
        canonicalize = True,
        unique = True,
        process_value = None
    )
    

    主要参数讲解:

    • allow:允许的url。所有满足这个正则表达式的url都会被提取。
    • deny:禁止的url。所有满足这个正则表达式的url都不会被提取。
    • allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
    • deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
    • restrict_xpaths:严格的xpath。和allow共同过滤链接。

    Rule规则类:

    定义爬虫的规则类。以下对这个类做一个简单的介绍:

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

    主要参数讲解:

    • link_extractor:一个LinkExtractor对象,用于定义爬取规则。
    • callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。
    • follow:指定根据该规则从response中提取的链接是否需要跟进。
    • process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

    微信小程序社区CrawlSpider案例

    一、创建爬虫项目

    scrapy genspider -t crawl wxapp_spider wxapp-union.com

    二、代码

    修改settings.py文件:

     1 # -*- coding: utf-8 -*-
     2 
     3 BOT_NAME = 'wxapp'
     4 
     5 SPIDER_MODULES = ['wxapp.spiders']
     6 NEWSPIDER_MODULE = 'wxapp.spiders'
     7 
     8 
     9 # Obey robots.txt rules
    10 ROBOTSTXT_OBEY = False
    11 
    12 
    13 # Configure a delay for requests for the same website (default: 0)
    14 # See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
    15 # See also autothrottle settings and docs   设置访问页面的延时,防止频繁访问页面被反爬
    16 DOWNLOAD_DELAY = 1
    17 
    18 # Override the default request headers:
    19 DEFAULT_REQUEST_HEADERS = {
    20   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    21   'Accept-Language': 'en',
    22   'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
    23 }
    24 
    25 
    26 # Configure item pipelines
    27 # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    28 ITEM_PIPELINES = {
    29    'wxapp.pipelines.WxappPipeline': 300,
    30 }

    wxapp_spider.py文件

     1 # -*- coding: utf-8 -*-
     2 import scrapy
     3 from scrapy.linkextractors import LinkExtractor
     4 from scrapy.spiders import CrawlSpider, Rule
     5 from wxapp.items import WxappItem
     6 
     7 
     8 class WxappSpiderSpider(CrawlSpider):
     9     name = 'wxapp_spider'
    10     allowed_domains = ['wxapp-union.com']
    11     start_urls = ['http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1']
    12 
    13     rules = (
    14         Rule(LinkExtractor(allow=r'.+mod=list&catid=2&page=d+'), follow=True),
    15         Rule(LinkExtractor(allow=r'.+/article-d+-1.html'), callback='parse_item', follow=False)
    16     )
    17 
    18     def parse_item(self, response):
    19         title = response.xpath('//h1/text()').get()
    20         author = response.xpath('//p[@class="authors"]/a/text()').get()
    21         time = response.xpath('//p[@class="authors"]//span[@class="time"]/text()').get()
    22         content = response.xpath('//td[@id="article_content"]//text()').getall()
    23         content = "".join(content).strip()
    24         item = WxappItem(title=title, author=author, time=time, content=content)
    25         yield item  #这里return item一样可以.因为只需要返回一个item给pipe处理

    items.py文件

    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class WxappItem(scrapy.Item):
        title = scrapy.Field()
        author = scrapy.Field()
        time = scrapy.Field()
        content = scrapy.Field()

    pipelines.py文件

     1 # -*- coding: utf-8 -*-
     2 
     3 # Define your item pipelines here
     4 #
     5 # Don't forget to add your pipeline to the ITEM_PIPELINES setting
     6 # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
     7 from scrapy.exporters import JsonLinesItemExporter
     8 
     9 
    10 class WxappPipeline(object):
    11     def __init__(self):
    12         self.fp = open("wxjc.json", 'wb')
    13         self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
    14 
    15     def process_item(self, item, spider):
    16         self.exporter.export_item(item)
    17         return item   #这里一定要return,如果有多个pipelines的话,不返回就不能给其他的pipeline用了
    18 
    19     def close_spider(self, spider):
    20         self.fp.close()

    运行结果:

    笔记:

    rules = (
            Rule(LinkExtractor(allow=r'.+mod=list&catid=2&page=d+'), follow=True),
            Rule(LinkExtractor(allow=r'.+/article-d+-1.html'), callback='parse_item', follow=False)
        )

    在写规则的时候,注意正则中的.和?号要转义,不然正则会错误!!

    关于CrawlSpider爬虫,是在页面中查找所有符合正则规则的链接,如果需要进入链接继续跟进,那么就设置follow为True,如果只是需要提取这个链接的数据,那么只需要设置callback,并设置follow为False.

    在运行的时候,这个爬虫并不会按照顺序依次一页一页的爬取,看起来好像有点随机爬取页面.

    爬虫能自己去重,所以也不要担心有重复数据

  • 相关阅读:
    Device eth0 does not seem to be present, delaying initialization(解决克隆CentOS6.3虚拟机后网卡设备无法启动问题)
    CI整合Smarty
    修改crontab默认的编辑器
    添加数据之后不跳页面显示一个漂亮的提示信息(非ajax提交数据)
    jsp连接mysql数据库
    PHP使用CURL详解
    内、外部号码范围配置
    更改SAP的字段翻译
    SAP 应用服务负载均衡的实现
    SAP中禁止特定用户更改密码
  • 原文地址:https://www.cnblogs.com/weiwei2016/p/10521061.html
Copyright © 2020-2023  润新知