Scrapy框架的学习(9.Scrapy中的CrawlSpider类的作用以及使用,实现优化的翻页爬虫)

1.CrawlSpider类通过一些规则(rules),使对于链接(网页)的爬取更具有通用性,

      换句话说,CrawlSpider爬虫为通用性的爬虫,

        而Spider爬虫更像是为一些特殊网站制定的爬虫。它基于Spider并有一些独特属性

     rules:Rule对象的集合,用于匹配目标网站并排除干扰

     parse_start_url: 用于爬取起始响应,必须要返回Item

2. Scrapy中的爬虫方法继承四种类来建立我们的scrapy爬虫,

    他们是:Spider类,CrawlSpider类, CSVFeedSpider类和XMLFeedSpider类

     

 3. 通过命令的方式生成一个CrawlSpider类的模板

     scrapy genspider -t crawl 爬虫 域名

4. 通过爬取这个网站http://bxjg.circ.gov.cn/web/site0/tab5240/module14430/page1.htm 来使用CrawlSpider类进行爬虫

   (1)创建好项目后,创建爬虫(加入了-t crawl) scrapy genspider -t crawl punish bxjg.circ.gov.cn

   (2)   可以使用rules规则,就可以不用再写一个专门针对于下一页的请求函数了

rules = (
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+\.htm'), callback='parse_item'),
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+\.htm'),follow=True),
    )

LinkExtractor 连接提取器,提取url 

     参数: 

        url allow : 可以写入正则表达式

       callback: 提取出来的url地址的response交给callback处理 ,需要时再用,一般对应的网站详情页面要使用

         follow: 表示当前的url地址的响应是否重新经过rules来提取url地址,需要时再用

  (3)  然后 编写爬虫的代码 

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
import re
'''继承spider的crawlspider类'''
class PunishSpider(CrawlSpider):
    name = 'punish'
    allowed_domains = ['bxjg.circ.gov.cn']
    start_urls = ['http://bxjg.circ.gov.cn/web/site0/tab5240/module14430/page1.htm']
    '''
        可以定义提取url地址的规则
        LinkExtractor 连接提取器,提取url
        allow : 可以写入正则表达式
        callback: 提取出来的url地址的response交给callback处理
        follow: 表示当前的url地址的响应是否重新经过rules来提取url地址
    '''
    rules = (
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+\.htm'), callback='parse_item'),
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+\.htm'),follow=True),
    )
    '''与Spider类不同,CrawlSpider类中的parse函数有特殊功能,不能定义'''
    def parse_item(self, response):
        item = {}
        item['title'] = re.findall("<!--TitleStart-->(.*?)<!--TitleEnd-->",response.body.decode())[0]
        item['publish_date'] = re.findall("发布时间:(20\d{2}-\d{2}-\d{2})",response.body.decode())[0]
        print(item)

   (4)  在setting.py里面设置   LOG_LEVEL = "WARNING" 以及开启并设置 USER_AGENT,然后在终端运行程序

    scrapy crawl punish

    

(5) LinKExtractor更多常见的参数:

   

5.  再请求详情页的时候,我们也可以使用在Spider类中一样,

    通过   yield scrapy.Request()   方法也可以实现,但是代码会写的比使用Crawlspider类中的多

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是那个同伟伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值