从Python脚本启动Scrapy时回调函数未执行的问题求助
问题排查与修复方案
嘿,我来帮你搞定这个回调不执行的问题~ 你的代码里有两个关键问题,咱们一步步来解决:
1. 错误的爬虫启动方式:直接调用start_requests()没用
Scrapy的Request对象不是你调用start_requests()就会自动执行的,它需要交给Scrapy的引擎来调度处理才能触发回调函数。你现在只是手动调用了这个方法,得到的只是一个生成器对象,根本没让Scrapy引擎去处理这些请求,所以回调parse自然不会执行。
正确的做法是用Scrapy内置的CrawlerProcess来启动你的爬虫,它会帮你管理整个爬虫生命周期,包括调度请求、触发回调。
2. URL拼接的低级错误
你在start_requests()里明明拼好了正确的tmpURL,但最后yield的却是self.domain+leObject[0]——这会导致URL格式完全错误!比如你的domain是https://www.google.fr/?q={},拼接后会变成https://www.google.fr/?q={}猫咪(假设leObject[0]是猫咪),这种URL请求会直接失败,就算引擎处理了也到不了回调。
修复后的完整代码
首先修改myproject.py:
import argparse from scrapy.crawler import CrawlerProcess from spiders.ggspider import GGSpider # 注意这里的导入路径要和你的项目结构匹配 import CSVReader # 假设你有这个CSV读取模块 # 处理命令行参数 parser = argparse.ArgumentParser() parser.add_argument('-f', '--file', required=True, help='Path to CSV file') args = parser.parse_args() # 读取CSV数据 dataFile = args.file myData = CSVReader.getAnimalList(dataFile) # 初始化Scrapy爬虫进程 process = CrawlerProcess(settings={ # 这里可以添加你的Scrapy设置,比如日志级别 'LOG_LEVEL': 'INFO', }) # 把数据传入爬虫,启动爬虫 process.crawl(GGSpider, myList=myData) process.start() # 启动爬虫进程,阻塞直到爬虫结束
然后修改你的爬虫文件ggspider.py:
import scrapy import urllib.parse class GGSpider(scrapy.Spider): name = "spiderman" domain = "https://www.google.fr/search" # 改用正确的搜索URL,原URL的{}占位符没必要 def __init__(self, myList=None, *args, **kwargs): super().__init__(*args, **kwargs) self.myList = myList or [] # 接收外部传入的myList def start_requests(self): for leObject in self.myList: # 正确拼接搜索URL:用urlencode生成参数 params = urllib.parse.urlencode({'q': leObject[0]}) tmpURL = f"{self.domain}?{params}" self.logger.info(f"Requesting URL: {tmpURL}") # 用Scrapy的日志打印请求URL yield scrapy.Request(url=tmpURL, callback=self.parse) def parse(self, response): print('hello') print(f"Response status: {response.status}") print(f"Response URL: {response.url}") # 这里可以继续处理响应内容
运行方式
还是用你原来的命令:
py myproject.py -f C:\Users\admin\Downloads\test.csv
额外注意事项
- 确保你的项目结构正确,
spiders文件夹是Python包(要有__init__.py文件) - 如果CSV读取模块
CSVReader是你自己写的,要确保它能正确返回你需要的myData数组 - Scrapy的日志会帮你排查请求是否成功,建议保留
LOG_LEVEL设置方便调试
内容的提问来源于stack exchange,提问作者Ritooon




