首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当脚本位于根目录之外时,获取scrapy项目设置

当脚本位于根目录之外时,获取scrapy项目设置
EN

Stack Overflow用户
提问于 2015-07-28 04:36:18
回答 5查看 11.3K关注 0票数 15

我已经制作了一个Scrapy爬行器,可以从位于项目根目录的脚本中成功运行。由于我需要从同一脚本运行来自不同项目的多个爬虫(这将是一个django应用程序根据用户的请求调用脚本),因此我将脚本从其中一个项目的根目录移动到父目录。由于某些原因,脚本不再能够获取项目的自定义设置,以便将抓取的结果通过管道传输到数据库表中。下面是我用来从脚本运行爬行器的scrapy文档中的代码:

代码语言:javascript
复制
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()

为了从项目外部获取项目设置,是否需要导入一些额外的模块?或者需要对这段代码做一些补充?下面我还有运行蜘蛛的脚本代码,谢谢。

代码语言:javascript
复制
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()
EN

回答 5

Stack Overflow用户

发布于 2017-11-01 22:44:57

多亏了这里已经提供的一些答案,我意识到scrapy实际上并没有导入settings.py文件。这就是我修复它的方法。

TLDR:确保将'SCRAPY_SETTINGS_MODULE‘变量设置为实际的settings.py文件。我是在Scraper.的__init__()函数中做这件事的

考虑一个具有以下结构的项目。

代码语言:javascript
复制
my_project/
    main.py                 # Where we are running scrapy from
    scraper/
        run_scraper.py               #Call from main goes here
        scrapy.cfg                   # deploy configuration file
        scraper/                     # project's Python module, you'll import your code from here
            __init__.py
            items.py                 # project items definition file
            pipelines.py             # project pipelines file
            settings.py              # project settings file
            spiders/                 # a directory where you'll later put your spiders
                __init__.py
                quotes_spider.py     # Contains the QuotesSpider class

基本上,命令scrapy startproject scraper是在my_project文件夹中执行的,我已经将一个run_scraper.py文件添加到了外层刮板文件夹中,将一个main.py文件添加到了根文件夹中,将quotes_spider.py文件添加到了spiders文件夹中。

我的主文件:

代码语言:javascript
复制
from scraper.run_scraper import Scraper
scraper = Scraper()
scraper.run_spiders()

我的run_scraper.py文件:

代码语言:javascript
复制
from scraper.scraper.spiders.quotes_spider import QuotesSpider
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
import os


class Scraper:
    def __init__(self):
        settings_file_path = 'scraper.scraper.settings' # The path seen from root, ie. from main.py
        os.environ.setdefault('SCRAPY_SETTINGS_MODULE', settings_file_path)
        self.process = CrawlerProcess(get_project_settings())
        self.spider = QuotesSpider # The spider you want to crawl

    def run_spiders(self):
        self.process.crawl(self.spider)
        self.process.start()  # the script will block here until the crawling is finished

还要注意,这些设置可能需要检查,因为路径需要根据根文件夹(my_project,而不是scraper)。所以在我的例子中:

代码语言:javascript
复制
SPIDER_MODULES = ['scraper.scraper.spiders']
NEWSPIDER_MODULE = 'scraper.scraper.spiders'

并对您拥有的所有设置变量重复此操作!

票数 21
EN

Stack Overflow用户

发布于 2015-07-28 04:56:37

它应该可以工作,你能分享你的scrapy日志文件吗

编辑:您的方法将不起作用,因为您执行script..it的...when将在中查找默认设置

  1. 如果您设置了环境变量ENVVAR
  2. 如果您在执行脚本的当前目录中有scrapy.cfg文件,并且如果该文件指向有效的settings.py目录,它将加载那些将使用scrapy (您的情况)

提供的普通设置运行的脚本

解决方案1在目录内(文件夹外部)创建一个cfg文件,并为其指定有效settings.py文件的路径

解决方案2使您父目录打包,这样就不需要绝对路径,您可以使用相对路径

即python -m cron.project1

解决方案3

你也可以尝试像这样的东西

让它在它所在的地方,在项目directory..where中工作……

创建一个sh文件...

python脚本行1: Cd指向第一个项目位置(根directory)

  • Line 2: Python script1.py

  • Line 3. Cd to second projects location

  • Line 4: python

  • 2.py

现在,您可以在django请求时通过此sh文件执行爬行器

票数 7
EN

Stack Overflow用户

发布于 2017-04-19 19:14:51

我使用下面的代码来解决这个问题:

代码语言:javascript
复制
from scrapy.settings import Settings

settings = Settings()

settings_module_path = os.environ.get('SCRAPY_ENV', 'project.settings.dev')   
settings.setmodule(settings_module_path, priority='project')

print(settings.get('BASE_URL'))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31662797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档