Scrapy CrawlSpider中Rule中写allow的问题!

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


class RulespiderSpider(CrawlSpider):
    name = 'wxapp'
    allowed_domains = ['ABBCD.XX']
    start_urls = ['https://www.ABCD.XX/page/1']

    rules = (
        #若还能发现同样规则的数据就拿出来
        Rule(LinkExtractor(allow=r'.+page/\d'), follow=True),
        #详情页面链接
        Rule(LinkExtractor(allow=r'.+\d\.html'),callback="parse_xxx",follow=False),
    )
    def parse_xxx(self, response):
        #获取标题名称
        title=response.xpath("//div[@class='article_container row  box']/h1/text()").get()
        print(title)

LinkExtractor的目的在于提取你所需要的链接

描述流程:

上面的一段代码,表示查找以初始链接start_urls 初始化Request对象。

(1)翻页规则

该Request对象必须满足Rule第一条规则,从https://www.ABCD.XX/page/1这个初始链接的页面中获得类似于https://www.ABCD.XX/page/XXX的链接,一直到结束。

(2)页面响应规则

在此期间,从https://www.ABCD.XX/page/XXX这种链接中获取https://www.ABCD.XX/XXX.html的链接,然后调用回调函数parse_xxx,在这个回调函数中下载response从而通过xpath语法获取title。

1、从referer链接获取类似的链接【(1)的实现】;2、从referer链接获得下一层的链接,从而获得title,已经打印了出来【(2)的实现】


在rules中,设置了两条规则

.+的意思是前面任意个字符,不加.+则默认,前缀是站点链接https://www.ABCD.XX/

(1)第一条规则的allow:.+page/\d

作用是从原始链接(refer link你所寻找到的链接的来源链接地址)一直匹配到获取https://www.ABCD.XX/page/这个字符串为止,后面的\d才是关键,只要有数字即可,综合两者就形成了链接:https://www.ABCD.XX/page/XXX,fellow=True的作用时,每更换一个refer link,在这个链接中就要去寻找满足第一条规则的链接,周而往复,找完为止。

(2)第二条规则的allow:.+\d.html

从你的refer link中匹配到https://www.ABCD.XX这个字符串,后面的\d才是关键,只要有数字即可,综合两者就形成了链接:https://www.ABCD.XX/XXX.html,然后将这个Request对象,调用回调函数,下载Response的对象,进而获得你所需要的数据。


以上rules对allow的解释是相对路径,绝对路径老失败就不谈了!!!

关于rule中LinkExtractors的更多规则解释:请见链接https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/link-extractors.html

这个爬虫项目完美的翻页Rule是

rules = (
        
        #Rule(LinkExtractor(allow=r'page/\d'), follow=True),
        #每次只取下一页,,xpath的语法避免了取到最后一页,前一页或者下一页之前的页码!
        Rule(LinkExtractor(restrict_xpaths=("//div[@class='pagination']/*[not(@class='extend')][last()]")),follow=True),
        #详情页面链接迭代器
        #Rule(LinkExtractor(allow=r'\d\.html'),callback="parse_xxx",follow=False)
        #xpath找到详情页面的所有满足条件的a标签对象形成列表,但是scrapy将其变为识别为迭代器用
        Rule(LinkExtractor(restrict_xpaths=("//div[@class='thumbnail']/a[@class='zoom']")),callback="parse_xxx")
    )

注:年轻就要多读书!!!

猜你喜欢

转载自blog.csdn.net/StrawberryMuMu/article/details/90578242