Python爬虫5.8 — scrapy框架CrawlSpider模块的使用

综述

本系列文档用于对Python爬虫技术的学习进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了。
Python 版本是3.7.4

在前面的几篇文章中我们对Scrapy框架做了整体的介绍说明,和一些基本功能的使用教程。下面我们就开始学习一些Scrapy框架的高级用法。

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_xpath = {},
    tags = ('a','area'),
    attrs = ('href'),
    canonicalize = True,
    unique = True,
    process_value = None
}

主要参数讲解:

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

Rule规则类

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

class scrapy.spider.Rule {
    link_extractor,
    callback = None,
    cb_kwargs = None,
    follow = None,
    process_links = None,
    process_request = None
}

主要参数讲解:

  • link_extractor : 一个LinkExtractor对象,用于定义爬取规则。
  • callback : 满足这个规则的url,应该要执行那个回调函数,因为CrawlSpider继承类的底层使用了parse作为回调函数,因此如果在定义parse就会覆盖掉底层parse函数从而会可能造成错误。
  • follow : 指定根据该规则从response中提取的链接是否需要跟进。
  • process_link : 从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的来链接。

微信小程序社区CrawlSpider使用案例

根据下列命令创建项目:

# 创建项目
scrapy startproject wxapp
# 创建爬虫
scrapy genspider -t crawl wxapp_spider wxapp-union.com

进行修改setting.py文件更改完善爬虫配置,修改items.py文件定义item内容(在这里就不再贴这两个文件的代码)。然后在wxapp_spider.py文件写入如下代码:

# -*- coding: utf-8 -*-
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from wxapp.items import WxappItem


class WxappSpiderSpider(CrawlSpider):
    name = 'wxapp_spider'
    allowed_domains = ['wxapp-union.com']
    start_urls = ['http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1']

    # 定义提取url地址规则
    rules = (
        # LinkExtractor链接提取器,获取符合要求的url链接地址
        # callback 提取出来的url地址的response会交给callback处理
        # follow 当前url地址的相应是否重新经过Rules来提取url地址
        Rule(LinkExtractor(allow=r'.+mod=list&catid=2&page=\d+'), follow=True),
        Rule(LinkExtractor(allow=r'.+article-.+\.html'), callback="parse_detail", follow=False),
    )

    # parse函数有特殊功能,不能定义,此函数名已被底层使用,不能重新定义覆盖
    def parse_detail(self, response):
        title = response.xpath('//h1[@class="ph"]/text()').get()
        author_p = response.xpath('//p[@class="authors"]')
        author = author_p.xpath('.//a/text()').get()
        pub_time = author_p.xpath('.//span/text()').get()

        content = response.xpath('//td[@id="article_content"]//text()').getall()
        item = WxappItem(title=title, author=author, pub_time=pub_time, content=content)
        yield item

pipeline.py中写入相应的代码进行保存数据,允许即可查看效果。

CrawlSpider总结

CrawlSpider需要使用LinkExtractorRule,这两个东西决定爬虫的具体走向。

  1. allow设置规则的方法:要能够限制在我们想要的url上面,不要跟其他的url产生相同的正则表达式即可。
  2. 什么情况下使用follow:如果在爬取页面的时候,需要将满足当前条件的url再进行跟进,那么就设置为True,否则设置为False。
  3. 什么情况下该指定callback:如果这个url对应的页面,只是为了获取更多的url,并不需要里面的数据,那么可以不指定callback,如果想要获取url对应页面中的数据,那么就需要指定一个callback。

其他博文链接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章