重读Scrapy:Spider篇_CrawlSpider的使用分析

CrawlSpider

CrawlSpider 是 Spider 的一个子类,最显著的功能就是 LinkExtractors 链接提取器,相较于 spider 来说,CrawlSpider 更适用于 需要从内层网页爬取数据的场景

例如:在新闻网站中,我们首先需要爬取新闻列表页,获取所有新闻的URL,然后再请求这些URL,获取新闻的详情数据。

执行流程

  • 请求 start_urls 中的起始 url,并将响应结果发给 规则解析器
  • 规则解析器得到响应体后,交由 链接提取器匹配 url
  • 对匹配成功的 url 发起 请求
  • 根据规则解析器中的配置,决定该请求体的 去向(转交函数处理 / 继续交由规则解析器进行匹配)

创建CrawlSpider

  • scrapy genspider -t crawl <爬虫名> <域名><!--域名--><!--爬虫名-->

    相较于默认指令,此处多了 -t crawl 参数,表示创建的爬虫文件基于 CrawlSpider 类,而不是基于 Spider

import scrapy

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class PnewsSpider(CrawlSpider):
    name = 'pnews'
    start_urls = ['http://bj.people.com.cn/GB/233088/index1.html']
    rules = (

        Rule(

            LinkExtractor(allow=r'/n2/2021/\d+/c\d+-\d+\.html'),
            callback='parse_item'
        ),
    )

    def parse_item(self, response):
        title = response.xpath('//h1[@id="newstit"]/text()').get()
        print(title)

规则解析器

Rule(
    link_extractor=None,
    callback=None,
    cb_kwargs=None,
    follow=None,
    process_links=None,
    process_request=None,
    errback=None
)
  • link_extractor:链接提取器
  • callback:回调函数,对链接提取器中的url发起请求,随后将请求体交由该函数
  • cb_kwargs:向回调函数传递的参数
  • follow:链接提取器提取出的 url 对应的响应是否继续被 rules 过滤(callback为None时,此参数为True)
  • process_links:过滤链接提取器提取出来的url
  • process_request:过滤 requests 请求

process_linksprocess_request 函数的具体参数可进入源码查看

文档:规则解析器

链接提取器

LinkExtractor(
    allow=(),
    deny=(),
    allow_domains=(),
    deny_domains=(),
    restrict_xpaths=(),
    tags=('a', 'area'),
    attrs=('href',),
    canonicalize=False,
    unique=True,
    process_value=None,
    deny_extensions=None,
    restrict_css=(),
    strip=True,
    restrict_text=None,
)
  • allow: str or list,满足括号中正则表达式的 url 会被提取,默认空,全部匹配
  • deny: str or list,满足括号中正则表达式的 url 不会被提取,优先级高于 allow
  • allow_domains:会被提取链接的域名
  • restrict_xpaths:通过 xpath 匹配 url

文档:链接提取器

注意事项

  • 对于起始url,可以定义 parse_start_url 函数处理该 url 对应的响应
  • 若页面链接为相对路径,链接提取器提取后会 自动补全
  • CrawlSpider 中不能重写 parse 方法,在父类中有特殊功能
  • 如果多个 Rule 都满足一个 url,会从 rules中选择第一个满足的进行操作

Original: https://blog.csdn.net/qq_36078992/article/details/114575164
Author: zzzzls~
Title: 重读Scrapy:Spider篇_CrawlSpider的使用分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/791493/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球