You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy无法抓取深层链接求助:如何获取更多层级URL?

解决Scrapy爬取URL数量不足的问题

嘿,我看了你的代码,问题大概率出在Rule的follow参数上!你当前的Rule只爬取了起始页面提取的第一层级链接,没有递归跟进更深层级的页面,所以才只拿到63条。

核心修改:开启follow=True

在CrawlSpider的Rule里,如果你指定了callback,follow默认是False——意思是爬完当前页面、处理完item后,不会继续从这个页面提取新链接再爬。把它改成True,就能让爬虫递归跟进每个抓取到的页面,提取更深层级的URL了。

修改后的rules代码:

rules = (
    Rule(LinkExtractor(), callback='parse_url', follow=True),
)

其他可能的优化方向

除了follow,还有几个点可以检查,帮你拿到更多有效URL:

  • 精准控制LinkExtractor的提取范围:如果网站里有很多不需要的链接(比如登录页、静态资源),可以用allow或deny参数过滤,避免浪费爬虫资源。比如只爬取/article开头的内容页:

    Rule(LinkExtractor(allow=r'/article/'), callback='parse_url', follow=True),
    
  • 检查爬取深度限制:Scrapy默认DEPTH_LIMIT=0(无限制),但如果网站层级极深,你可以在settings.py里调整这个值,比如:

    DEPTH_LIMIT = 5  # 最多爬5层
    
  • 处理反爬限制:如果网站限制了爬取速度,可能会导致部分请求失败,你可以在settings.py里加个延迟:

    DOWNLOAD_DELAY = 2  # 每次请求间隔2秒
    

    另外,Scrapy默认遵守robots.txt,如果网站的robots.txt禁止爬取某些页面,你可以设置ROBOTSTXT_OBEY = False(注意要合法合规哦)。

  • 调试LinkExtractor的提取结果:用Scrapy Shell测试当前页面能提取多少链接,确认是不是LinkExtractor没抓到所有链接:

    scrapy shell https://www.example.com
    

    然后在shell里执行:

    from scrapy.linkextractors import LinkExtractor
    le = LinkExtractor()
    print(len(le.extract_links(response)))  # 看当前页面提取到的链接数量
    

完整修改后的代码示例

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

class UrlItem(Item):
    url = Field()

class RetriveUrl(CrawlSpider):
    name = 'retrive_url'
    allowed_domains = ['example.com']
    start_urls = ['https://www.example.com']
    rules = (
        # 开启follow,递归跟进所有符合条件的链接
        Rule(LinkExtractor(), callback='parse_url', follow=True),
    )

    def parse_url(self, response):
        item = UrlItem()
        item['url'] = response.url
        return item

这样调整后,爬虫应该就能抓取到更深层级的URL了,数量会明显增加~

内容的提问来源于stack exchange,提问作者Webdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:13:12