scrapy 当脚本位于根目录之外时获取零碎的项目设置

egdjgwm8  于 2022-11-09  发布在  其他
关注(0)|答案(6)|浏览(153)

我做了一个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()
lzfw57am

lzfw57am1#

感谢这里已经提供的一些答案,我意识到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

基本上,命令scrapy startproject scraper是在my_project文件夹中执行的,我已经在外部scraper文件夹中添加了一个run_scraper.py文件,在根文件夹中添加了一个main.py文件,在spider文件夹中添加了一个quotes_spider.py文件。
我的主文件:

from scraper.run_scraper import Scraper
scraper = Scraper()
scraper.run_spiders()

我的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

另外,请注意,设置可能需要查看,因为路径需要根据根文件夹(my_project,而不是scraper)。

SPIDER_MODULES = ['scraper.scraper.spiders']
NEWSPIDER_MODULE = 'scraper.scraper.spiders'

并对所有设置变量重复上述操作!

oyxsuwqo

oyxsuwqo2#

它应该工作,你能分享你的零碎的日志文件

**编辑:**您的方法将不起作用,因为...当您执行脚本时..它将在

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

解决方案1在目录内(文件夹外)创建一个cfg文件,并为它提供一个指向有效www.example.com文件的路径settings.py
解决方案2创建父目录包,这样就不需要绝对路径,而可以使用相对路径

例如python -m cron.project1

解决方案3

您也可以尝试以下操作
让它在它所在的地方,在项目目录中..它正在工作的地方...
创建sh文件...

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

现在你可以在django请求的时候通过这个sh文件来执行spider

0mkxixxg

0mkxixxg3#

我已经用下面的代码解决了这个问题:

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'))
db2dz4w8

db2dz4w84#

这可能是因为您不再“在”一个零碎的项目中,所以它不知道如何使用get_project_settings()来获取设置。
您也可以将设置指定为字典,如下例所示:
http://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script

olhwl3o2

olhwl3o25#

我使用了OS模块来解决这个问题。你正在运行的python文件在一个目录中,而你的scrapy项目在另一个目录中。你不能简单地导入python spider并运行这个python脚本,因为你正在工作的当前目录中没有settings.py文件或scrapy.cfg。

导入操作系统

若要显示您正在使用的当前目录,请使用以下代码:

打印(操作系统.getcwd())

在这里,您需要更改当前目录:

os.chdir(\spider\文件夹的路径)

最后,告诉操作系统要执行哪个命令。

os.system(“刮擦文件. py”)

ojsjcaue

ojsjcaue6#

这是对马拉的回答的补充。
您可以配置设置、管道、spider等模块变量。您不需要将它们作为字符串传递。最大的优点是您可以从不同的位置运行spider,并且不需要调整设置中的字符串。您可以同时执行这两项操作:从脚本运行(从任何位置,甚至从多个不同根),并使用scrapy crawl运行,而不调整:

from ticket_city_scraper.ticket_city_scraper import settings # your setting module

def run_spider():
    os.environ.setdefault('SCRAPY_SETTINGS_MODULE', settings.__name__)
    process = CrawlerProcess(get_project_settings())
    process.crawl(MySpider3)
    process.start()

您可以使设置本身可变:

from . import spiders # your spiders module
from . import pipelines # your pipelines module

def get_full_package_name_for_class(clazz) -> str:
    return ".".join([clazz.__module__, clazz.__name__])

SPIDER_MODULES = [spiders.__name__] 
NEWSPIDER_MODULE = spiders.__name__

ITEM_PIPELINES = {
    get_full_package_name_for_class(pipelines.YourScrapyPipeline): 300
}

相关问题