博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CrawlSpider爬虫
阅读量:6213 次
发布时间:2019-06-21

本文共 10757 字,大约阅读时间需要 35 分钟。

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 rules10 ROBOTSTXT_OBEY = False11 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-delay15 # See also autothrottle settings and docs   设置访问页面的延时,防止频繁访问页面被反爬16 DOWNLOAD_DELAY = 117 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 pipelines27 # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html28 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 scrapyclass 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.

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

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

 

转载于:https://www.cnblogs.com/weiwei2016/p/10521061.html

你可能感兴趣的文章
PhpStorm下提示Phalcon框架语法
查看>>
我对JavaScript对象的理解
查看>>
面试宝典之学习能力
查看>>
二叉树的非递归前序遍历
查看>>
JavaScript 单线程不简单.md
查看>>
Spring boot 和 Shiro 做后台跨域访问权限控制遇到的问题
查看>>
animationend 事件
查看>>
JS进阶篇--JS中的反柯里化( uncurrying)
查看>>
MySQL常见问题总结
查看>>
关于多电脑布署hexo博客,和在线更新文章
查看>>
Angular 学习笔记:$digest 实现原理
查看>>
leetcode98. Validate Binary Search Tree
查看>>
redis Q&A
查看>>
【170天】黑马程序员27天视频学习笔记【Day08-下】
查看>>
Day20 - 语言识别系统中文指南
查看>>
Python迭代器、生成器、装饰器深入解读
查看>>
Node.js异步I/O,事件驱动
查看>>
返回信息流页面重新加载问题
查看>>
ie百分比的圆
查看>>
常用CSS布局
查看>>