Scrapy爬行错误的蜘蛛

Mal*_*umi 0 python scrapy

scrapy 爬行 [spider-name] 错误中中,OP 说

\n\n
\n

在我的项目的 Spider 文件夹中,我有两个名为 Spider1 和 Spider2\xe2\x80\xa6 的蜘蛛。现在,当我在根\n 项目文件夹中编写命令 scrapy scrapy Spider1 时,它会调用 Spider2.py 而不是 Spider1.py。当我从我的项目中删除spider2.py时,它会调用spider1.py

\n
\n\n

我经历过完全相同的行为并使用了完全相同的解决方案。对OP的响应都归结为删除所有.pyc文件。

\n\n
\n

我已经清理了spider1.pyc,spider2.pyc和init.pyc。现在,当我在项目的根文件夹中运行\n scrapy scrapy Spider1 时,它实际上运行\n Spider2.py 但生成了 Spider1.pyc 文件而不是 Spider2.pyc

\n
\n\n

我也看到过这种行为。

\n\n

但文档没有提及所有这些问题和解决方法。\n https://doc.scrapy.org/en/latest/intro/tutorial.html

\n\n

"name:标识Spider。在一个项目内必须是唯一的,即\xe2\x80\x99不能为不同的Spider设置相同的名称。"

\n\n

https://doc.scrapy.org/en/1.0/topics/spiders.html#scrapy.spiders.Spider \n"name: \n定义此蜘蛛的名称的字符串。蜘蛛名称是蜘蛛的位置(并由 Scrapy 实例化),因此它必须是唯一的。但是,没有什么可以阻止您实例化同一蜘蛛的多个实例。这是最重要的蜘蛛属性,并且\xe2\x80\x99s 是必需的。”

\n\n

这是有道理的,所以 Scrapy 知道要运行哪个蜘蛛,但它 \xe2\x80\x99s 不工作,那么 \xe2\x80\x99s 缺少什么?谢谢。

\n\n

编辑\n好吧,所以又发生了。这是我的回溯:

\n\n
(aishah) malikarumi@Tetuoan2:~/Projects/aishah/acquire$ scrapy crawl crawl_h4\nTraceback (most recent call last):\nFile "/home/malikarumi/Projects/aishah/bin/scrapy", line 11, in <module>\nsys.exit(execute())\nFile "/home/malikarumi/Projects/aishah/lib/python3.5/site-packages/scrapy /cmdline.py", line 141, in execute\ncmd.crawler_process = CrawlerProcess(settings)\nFile "/home/malikarumi/Projects/aishah/lib/python3.5/site-packages/scrapy/crawler.py", line 238, in __init__\nsuper(CrawlerProcess, self).__init__(settings)\nFile "/home/malikarumi/Projects/aishah/lib/python3.5/site-packages/scrapy/crawler.py", line 129, in __init__\nself.spider_loader = _get_spider_loader(settings)\nFile "/home/malikarumi/Projects/aishah/lib/python3.5/site-packages/scrapy/crawler.py", line 325, in _get_spider_loader\nreturn loader_cls.from_settings(settings.frozencopy())\nFile "/home/malikarumi/Projects/aishah/lib/python3.5/site-packages/scrapy/spiderloader.py", line 33, in from_settings\nreturn cls(settings)\nFile "/home/malikarumi/Projects/aishah/lib/python3.5/site-packages/scrapy/spiderloader.py", line 20, in __init__\nself._load_all_spiders()\nFile "/home/malikarumi/Projects/aishah/lib/python3.5/site-packages/scrapy/spiderloader.py", line 28, in _load_all_spiders\nfor module in walk_modules(name):\nFile "/home/malikarumi/Projects/aishah/lib/python3.5/site-packages/scrapy/utils/misc.py", line 71, in walk_modules\nsubmod = import_module(fullpath)\nFile "/usr/lib/python3.5/importlib/__init__.py", line 126, in  import_module\nreturn _bootstrap._gcd_import(name[level:], package, level)\nFile "<frozen importlib._bootstrap>", line 986, in _gcd_import\nFile "<frozen importlib._bootstrap>", line 969, in _find_and_load\nFile "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked\nFile "<frozen importlib._bootstrap>", line 673, in _load_unlocked\nFile "<frozen importlib._bootstrap_external>", line 661, in exec_module\nFile "<frozen importlib._bootstrap_external>", line 767, in get_code\nFile "<frozen importlib._bootstrap_external>", line 727, in source_to_code\nFile "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed\nFile "/home/malikarumi/Projects/aishah/acquire/acquire/spiders/crawl_h3.py",\nline 19  (follow=True, callback=\'parse_item\'),))\n               ^\nSyntaxError: invalid syntax`\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意:我调用了crawl_h4。我得到了crawl_h3。我保留了crawl_h3原样,包括语法错误,所以我在重构时会有一些东西可以比较。这个语法错误不在crawl_h4中。

\n\n

默认设置不变。文档还说“命令行提供的参数是最优先的参数,覆盖任何其他选项。您可以使用 -s (或 --set)命令行选项显式覆盖一个(或多个)设置。” https://doc.scrapy.org/en/latest/topics/settings.html#topics-settings

\n\n

我在回溯中看到一行对 freezecopy 的引用。文档讨论了使用它来使设置不可变。https://doc.scrapy.org/en/latest/topics/api.html。我不知道它的用例是什么,但我没有选择它,而且我不知道如何取消选择它,如果这就是问题所在。

\n

小智 6

即使您没有运行该蜘蛛,您的蜘蛛也不会出现语法错误。我假设 scrapy 会编译所有蜘蛛,即使您只想运行其中之一。仅仅因为它捕获其他蜘蛛中的错误并不意味着它没有运行您调用的蜘蛛。我有类似的经历,scrapy 捕获我当前没有尝试运行的蜘蛛中的错误,但它最终仍然运行我想要的蜘蛛。修复您的语法错误并尝试使用不同的方式来验证您的蜘蛛运行了这样的打印或收集与其他蜘蛛不同的数据。