Scrapy CrawlSpider中Rule中写allow的问题!

    xiaoxiao2025-04-13  106

    # -*- 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") )

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

    最新回复(0)