当脚本在根目录之外时获取scrapy项目设置

lor*_*771 10 python django scrapy web-scraping

我已经制作了一个Scrapy蜘蛛,它可以从位于项目根目录中的脚本成功运行.因为我需要从同一个脚本运行来自不同项目的多个蜘蛛(这将是一个django应用程序根据用户的请求调用脚本),我将脚本从其中一个项目的根目录移动到父目录.由于某种原因,脚本不再能够获取项目的自定义设置,以便将已删除的结果传递到数据库表中.以下是我用来从脚本运行蜘蛛的scrapy文档中的代码:

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()
Run Code Online (Sandbox Code Playgroud)

是否需要导入一些额外的模块才能从项目外部获取项目设置?或者是否需要对此代码进行一些添加?下面我也有运行蜘蛛的脚本代码,谢谢.

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()
Run Code Online (Sandbox Code Playgroud)

mal*_*lla 10

由于这里已经提供了一些答案,因此我意识到scrapy并没有真正导入settings.py文件。这就是我解决的方法。

TLDR:确保将“ SCRAPY_SETTINGS_MODULE”变量设置为实际的settings.py文件。我正在Scraper的__init __()函数中执行此操作。

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

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
Run Code Online (Sandbox Code Playgroud)

基本上,该命令 scrapy startproject scraper是在my_project文件夹中执行的,我已经将run_scraper.py文件添加到外部scraper文件夹中,将main.py文件添加到我的根文件夹中,又添加到了quotes_spider.pyspiders文件夹中。

我的主文件:

from scraper.run_scraper import Scraper
scraper = Scraper()
scraper.run_spiders()
Run Code Online (Sandbox Code Playgroud)

我的run_scraper.py档案:

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
Run Code Online (Sandbox Code Playgroud)

另外,请注意,设置可能需要进行查找,因为路径需要根据根文件夹(my_project,而不是scraper)进行。因此,就我而言:

SPIDER_MODULES = ['scraper.scraper.spiders']
NEWSPIDER_MODULE = 'scraper.scraper.spiders'
Run Code Online (Sandbox Code Playgroud)

并重复您拥有的所有设置变量!

  • 谢谢,您保存了我的一天,我不得不修改settings.py,如最后的注释所述。 (2认同)

MrP*_*dav 5

应该可以,您可以共享您的抓取日志文件吗

编辑: 您的方法将不起作用,因为...执行脚本时..它将在以下位置查找默认设置

  1. 如果已设置环境变量ENVVAR
  2. 如果您在执行脚本的当前目录中存在scrapy.cfg文件,并且该文件指向有效的settings.py目录,它将加载这些设置...
  3. 否则它将以scrapy提供的原始设置运行(您的情况)

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

解决方案2 制作您的父目录软件包,这样就不需要绝对路径,并且可以使用相对路径

即python -m cron.project1

解决方案3

您也可以尝试类似

在项目目录内..它正在工作的地方...

创建一个sh文件...

  • 第1行:从CD到第一个项目的位置(根目录)
  • 第2行:Python script1.py
  • 第3行。Cd至第二个项目的位置
  • 第4行:python script2.py

现在,当django请求时,您可以通过此sh文件执行蜘蛛程序