爬虫scrapy框架进阶-CrawlSpider, Rule

本文详细介绍了Scrapy中CrawlSpider的使用,包括如何创建CrawlSpider项目,理解LinkExtractor和Rule规则,以及在实际爬虫项目中的应用。通过示例代码展示了如何设置规则进行网页翻页和内容抓取,并提供了详细的解释,适合所有想学习Scrapy爬虫技术的读者。

🉑文章适合于所有的相关人士进行学习🉑
👍各位看官看完了之后不要立刻转身呀👍
🏺期待三连关注小小博主加收藏🏺
⚓️小小博主回关快 会给你意想不到的惊喜呀⚓️


🥇scrapy中加入CrawlSpider

如果把scrapy使用requests进行翻页比作是一个人,完成一次爬取请求一次,完成一次请求一次。如图一个一个进行爬取。
在这里插入图片描述

那么用了CrawlSpider就像是所有的符合这种条件的都给我爬取。如图所有符合秃头小宝贝的都给我爬。
在这里插入图片描述

之前使用普通的Spider,我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request。

🅰️创建项目

之前创建爬虫的方式是通过scrapy genspider [爬虫名字] [域名]的方式创建的。如果想要创建CrawlSpider爬虫,那么应该通过以下命令创建:

scrapy genspider -t crawl [爬虫名字] [域名]

🅱️ 提取器和规则RULE

使用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中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

其实总结一下就是我们使用一定的规则来直接判断我们想要什么访问什么样的网址,只要符合这个规则,我们就直接爬取。

🥈scrapy爬虫实战

🅰️分析网站

第一步我们先要找到翻页的rule,看看到底符合什么样的规则。
在这里插入图片描述

我们发现符合/latest/p\d+.html

不难理解\d+表示一个或多个数字
.表示. \表示转义字符的意思
第二步就是我们要找到需要访问的具体内容的url,同上一个道理。

/archives/\d+
解释也同上所示,其中看过上面rule规则的,我们可以知道rule又follow参数,那么follow参数是干什么的呢?callback参数又是什么呢?
follow:指定根据该规则从response中提取的链接是否需要跟进。
callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。

那么对于翻页我们肯定是要跟进的,对于详细内容的网址是不用的,但是需要反馈给爬虫。
这些我们分析完成之后呢,就使用xpath或者css或者bs4或者正则表达式来进行爬取了。
那我们就直接开写:
在这里插入图片描述

🅱️ 代码部分
1.settings部分

把机器人协议关掉。添加headers。然后打开管道。三个操作。

ROBOTSTXT_OBEY = False

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'
}

ITEM_PIPELINES = {
   'lyw.pipelines.LywPipeline': 300,
}
2.starts部分

这里不多说,运行程序的demo。

from scrapy import cmdline
cmdline.execute("scrapy crawl lyw_spider".split(" "))
3.items部分

把我们想要的内容放进来。

class LywItem(scrapy.Item):
    title = scrapy.Field()
    pub_time=scrapy.Field()
    content=scrapy.Field()
    origin=scrapy.Field()
4.重要的lyw_spider部分

主要包括了对细节网站的分析,获取到标题,发布时间,文本,和详情页面的url。

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


class LywSpiderSpider(CrawlSpider):
    name = 'lyw_spider'
    allowed_domains = ['lieyunwang.com']
    start_urls = ['https://www.lieyunwang.com/latest/p1.html']

    rules = (
        Rule(LinkExtractor(allow=r'/latest/p\d+\.html'),follow=True),
        Rule(LinkExtractor(allow=r'/archives/\d+'),callback="parse_detail",follow=False)
    )

    def parse_detail(self, response):
        title_list=response.xpath("//h1[@class='lyw-article-title-inner']/text()").getall()
        title="".join(title_list).strip()
        pub_time=response.xpath("//h1[@class='lyw-article-title-inner']/span/text()").get()
        content=response.xpath("//div[@class='main-text']").get()
        origin=response.url
        item=LywItem(title=title,pub_time=pub_time,content=content,origin=origin)
        yield item
5.pipelines部分
class LywPipeline:
    def process_item(self, item, spider):
        print("*"*30)
        print(item)
        print("*"*30)
        return item

我们在这里直接就在运行端进行输出了,没有保存到文件当中,如果有小伙伴们想要保存的话,可以使用csv进行保存到文件当中。
在这里插入图片描述

🉑文章适合于所有的相关人士进行学习🉑
👍各位看官看完了之后不要立刻转身呀👍
🏺期待三连关注小小博主加收藏🏺
⚓️小小博主回关快 会给你意想不到的惊喜呀⚓️

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃猫的鱼python

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

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

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

打赏作者

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

抵扣说明:

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

余额充值