我做了一个Scrapy spider,它可以从项目根目录下的脚本成功运行。因为我需要从同一个脚本运行不同项目的多个spider(这将是一个django应用程序根据用户的请求调用脚本),我将脚本从一个项目的根目录移到了父目录。该脚本无法再获取项目的自定义设置来将抓取的结果通过管道传输到数据库表中。下面是我用来从脚本运行蜘蛛的scrappy docs中的代码:
def spiderCrawl():
settings = get_project_settings()
settings.set('USER_AGENT','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')
process = CrawlerProcess(settings)
process.crawl(MySpider3)
process.start()
是否需要导入一些额外的模块,以便从项目外部获取项目设置?或者是否需要对这段代码进行一些添加?下面我还提供了运行spider的脚本代码,谢谢。
from ticket_city_scraper.ticket_city_scraper import *
from ticket_city_scraper.ticket_city_scraper.spiders import tc_spider
from vividseats_scraper.vividseats_scraper import *
from vividseats_scraper.vividseats_scraper.spiders import vs_spider
tc_spider.spiderCrawl()
vs_spider.spiderCrawl()
6条答案
按热度按时间lzfw57am1#
感谢这里已经提供的一些答案,我意识到scrapy实际上并没有导入settings.py文件。这就是我修复它的方法。
TLDR:确保将“SCRAPY_SETTINGS_MODULE”变量设置为实际的settings.py文件。我在Scraper的__init__()函数中执行此操作。
考虑一个具有以下结构的项目。
基本上,命令
scrapy startproject scraper
是在my_project文件夹中执行的,我已经在外部scraper文件夹中添加了一个run_scraper.py
文件,在根文件夹中添加了一个main.py
文件,在spider文件夹中添加了一个quotes_spider.py
文件。我的主文件:
我的
run_scraper.py
文件:另外,请注意,设置可能需要查看,因为路径需要根据根文件夹(my_project,而不是scraper)。
并对所有设置变量重复上述操作!
oyxsuwqo2#
它应该工作,你能分享你的零碎的日志文件
**编辑:**您的方法将不起作用,因为...当您执行脚本时..它将在
1.如果已设置环境变量ENVVAR
1.如果您在当前目录中有scrapy.cfg文件,您将从该目录执行脚本,并且如果该文件指向有效的settings.py目录,则它将加载这些设置...
1.否则,它将运行与scrapy提供的香草设置(您的情况)
解决方案1在目录内(文件夹外)创建一个cfg文件,并为它提供一个指向有效www.example.com文件的路径settings.py
解决方案2创建父目录包,这样就不需要绝对路径,而可以使用相对路径
例如python -m cron.project1
解决方案3
您也可以尝试以下操作
让它在它所在的地方,在项目目录中..它正在工作的地方...
创建sh文件...
现在你可以在django请求的时候通过这个sh文件来执行spider
0mkxixxg3#
我已经用下面的代码解决了这个问题:
db2dz4w84#
这可能是因为您不再“在”一个零碎的项目中,所以它不知道如何使用
get_project_settings()
来获取设置。您也可以将设置指定为字典,如下例所示:
http://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script
olhwl3o25#
我使用了OS模块来解决这个问题。你正在运行的python文件在一个目录中,而你的scrapy项目在另一个目录中。你不能简单地导入python spider并运行这个python脚本,因为你正在工作的当前目录中没有settings.py文件或scrapy.cfg。
导入操作系统
若要显示您正在使用的当前目录,请使用以下代码:
打印(操作系统.getcwd())
在这里,您需要更改当前目录:
os.chdir(\spider\文件夹的路径)
最后,告诉操作系统要执行哪个命令。
os.system(“刮擦文件. py”)
ojsjcaue6#
这是对马拉的回答的补充。
您可以配置设置、管道、spider等模块变量。您不需要将它们作为字符串传递。最大的优点是您可以从不同的位置运行spider,并且不需要调整设置中的字符串。您可以同时执行这两项操作:从脚本运行(从任何位置,甚至从多个不同根),并使用
scrapy crawl
运行,而不调整:您可以使设置本身可变: