You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从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格式完全错误!比如你的domainhttps://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

火山引擎 最新活动