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来维持调度器的运行,否则会认为当前任务完成而停止。
解决办法
- 给Rule添加
follow=True参数:让Rule在执行完回调后,自动跟进当前页面中符合规则的链接:
rules = ( Rule(LinkExtractor(allow=(r"mieszkanie/wynajme/*[a-z]*(\?PageNumber=[0-9]*)*$")), callback="parse_html", follow=True), )
- 恢复Item的生成逻辑:把注释掉的
yield代码块取消注释,让爬虫正常输出数据,同时维持Scrapy的任务调度流程。 - 优化正则匹配规则:当前正则表达式可能存在匹配不准确的问题,建议调整为更精准的写法,比如:
r"mieszkanie/wynajme(?:/[a-z]+)?(?:\?PageNumber=\d+)?"
避免因匹配规则问题导致无法提取后续链接。
内容的提问来源于stack exchange,提问作者beg_dev
相关产品推荐
相关产品推荐

