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

Scrapy爬虫发送首个请求后停止爬取,无回调可获取目标站点

Scrapy爬虫仅发送第一个请求后停止的问题排查

我开发Scrapy爬虫时遇到异常:爬虫发送第一个请求后便停止爬取,不再访问其他目标站点。但如果不设置callback方法,能正常获取到所有需要的站点列表。相关代码如下:

from bs4 import BeautifulSoup
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class CrawlingSpider(CrawlSpider):
    name = "myfancycrawler"
    allowed_domains = ["domiporta.pl"]
    start_urls = ["https://www.domiporta.pl/"]

    rules = (
        Rule(LinkExtractor(allow=(r"mieszkanie/wynajme/*[a-z]*(\?PageNumber=[0-9]*)*$")), callback="parse_html"),
    )

    def parse_html(self, response):
        soup = BeautifulSoup(response.text, "html.parser")
        datas = soup.findAll("article")
        for data in datas:
            clean_data = self.clean_data(data)

            # print(data)
            # yield {
            #   "price": clean_data[0],
            #   "price_for_m": clean_data[3],
            #   "area": clean_data[1],
            #   "rooms_amount": clean_data[2],
            #   "title": clean_data[4],
            #   "offer": "for rent" if "wynajem" in clean_data[10] or "wynajem" in clean_data[4] else "for sale",
            #   "short_description": clean_data[10],
            # }

    def clean_data(self, data):
        return [el.strip().replace("\xa0", " ") for el in data.text.split("\n") if
                el.strip().replace("\xa0", " ") != "" and el not in (
                'WYRÓŻNIONE', 'OBEJRZANE', 'Więcej', 'Skontaktuj się')]

问题原因

  • CrawlSpider的Rule机制特性:当Rule指定callback后,默认不会自动跟进当前响应中的链接。而不设置callback时,Scrapy会默认使用parse方法,该方法会自动按Rule规则提取并跟进新请求。
  • 回调方法未触发后续流程:当前parse_html方法仅处理页面数据(还注释掉了yield Item的代码),既没有生成新的Request对象,也没有触发CrawlSpider的链接跟进逻辑。Scrapy爬虫需要回调方法返回Item或Request来维持调度器的运行,否则会认为当前任务完成而停止。

解决办法

  1. 给Rule添加follow=True参数:让Rule在执行完回调后,自动跟进当前页面中符合规则的链接:
rules = (
    Rule(LinkExtractor(allow=(r"mieszkanie/wynajme/*[a-z]*(\?PageNumber=[0-9]*)*$")), callback="parse_html", follow=True),
)
  1. 恢复Item的生成逻辑:把注释掉的yield代码块取消注释,让爬虫正常输出数据,同时维持Scrapy的任务调度流程。
  2. 优化正则匹配规则:当前正则表达式可能存在匹配不准确的问题,建议调整为更精准的写法,比如:
r"mieszkanie/wynajme(?:/[a-z]+)?(?:\?PageNumber=\d+)?"

避免因匹配规则问题导致无法提取后续链接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:54:53