Scrapy中的crawlspider爬虫

本文详细介绍了Scrapy框架中的CrawlSpider爬虫,包括如何创建模板,重点规则的设置,LinkExtractor的使用以及实际案例演示。通过实例,学习如何自动抓取和解析符合特定规则的网页链接。
摘要由CSDN通过智能技术生成

介绍

Scrapy框架中分两类爬虫

Spider类和CrawlSpider类。

crawlspider是Spider的派生类(一个子类),Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。

简单来说 :就是能够匹配满足条件的url地址 .组成Reuqest对象后自动发送给引擎,同时能够指定callback函数.
就是说 crawlspider爬虫可以按照规则自动获取连接.**

创建模板

scrapy startproject 项目名称

scrapy genspider -t crawl 爬虫名 爬虫运行抓取的域名范围

在项目路径下去运行爬虫
scrapy crawl 爬虫名字

栗子:

scrapy genspider -t crawl job_163 hr.163.com

具体参数和解释

import scrapy
from scrapy.linkextractors import LinkExtractor  # 连接提取器
from scrapy.spiders import CrawlSpider, Rule    # 导入CrawlSpider类,Rule规则

# CrawlSpider
class Job163Spider(CrawlSpider):
    name = 'job_163'
    allowed_domains = ['hr.163.com']
    start_urls = ['http://hr.163.com/']

    # 规则的元祖 规则可以有多个 存放 规则 对象
    rules = (
        # 创建了一个规则对象
        # LinkExtractor: 连接提取对象,allow 跟的是一个正则,根据这个正则表达式从响应中自动的去提取符合规则的url地址
        # callback: 指定 前面根据连接提取器规则 提取出来的url地址的响应交给哪一个解析函数去处理,接收的是一个方法名的字符串
        # callback 如果传了 表示需要去解析这个响应
        # callback 如果没传 表示不需要去解析这个响应
        # follow: 表示是否跟进,表示根据连接提取器提取出来的url地址的响应,是否还需要按照连接提取器的规则继续去提取url地址

        Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        item = {}
        #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
        #item['name'] = response.xpath('//div[@id="name"]').get()
        #item['description'] = response.xpath('//div[@id="description"]').get()
        return item

重点在rules中:
  • rules是一个元组或者是列表,包含的是Rule对象
  • Rule表示规则,其中包含LinkExtractor,callback和follow等参数
    • LinkExtractor:连接提取器,可以通过正则或者是xpath来进行url地址的匹配
    • callback :表示经过连接提取器提取出来的url地址响应的回调函数,可以没有,没有表示响应不会进行回调函数的处理
    • follow:连接提取器提取的url地址对应的响应是否还会继续被rules中的规则进行提取,True表示会,Flase表示不会

链接提取器LinkExtractor的更多常见参数

  • allow: 满足括号中的’re’表达式的url会被提取,如果为空,则全部匹配
  • deny: 满足括号中的’re’表达式的url不会被提取,优先级高于allow
  • allow_domains: 会被提取的链接的domains(url范围),如:['hr.tencent.com', 'baidu.com']
  • deny_domains: 不会被提取的链接的domains(url范围)
  • restrict_xpaths: 使用xpath规则进行匹配,和allow共同过滤url,即xpath满足的范围内的url地址会被提取,如:restrict_xpaths='//div[@class="pagenav"]'

栗子:

dp.py

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


class DgSpider(CrawlSpider):
    name = 'dg'
    allowed_domains = ['wz.sun0769.com']
    start_urls = ['https://wz.sun0769.com/political/index/politicsNewest?id=1&page=1']

    # 需求  翻页抓取数据 ,在列表页中 不获取数据 ,所有的数据在详情页中获取
    rules = (
        # 翻页的规则
        Rule(LinkExtractor(allow=r'/politicsNewest?id=1&page=\d+'), callback='parse_item', follow=True),
        # 详情页的规则
        Rule(LinkExtractor(allow=r'political/politics/index\?id=\d+'), callback='parse_item'),
    )

    def parse_item(self, response):
        item = {}
        # 标题

        item['title'] = response.xpath("//p[@class='focus-details']/text()").extract_first()
        # 这个地方使用return 原因 就是当前去执行一次 parse_item方法 ,获取数据饿时候 就是获取到的  一条  数据

        # 如果需求取其他数据 则写不同的Xpath
        # item['title'] = response.xpath("//p[@class='focus-details']/text()").extract_first()
        # item['title'] = response.xpath("//p[@class='focus-details']/text()").extract_first()
        # item['title'] = response.xpath("//p[@class='focus-details']/text()").extract_first()

        return item

翻页规则:
在这里插入图片描述
详情页规则:
在这里插入图片描述
标题规则:
在这里插入图片描述

记得改setting.py

  • 修改user_agent
    在这里插入图片描述
  • 修改君子协议

在这里插入图片描述

  • 打开延迟时间
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值