Python 如何一次性将模块导入scrapy Spider?

Python 如何一次性将模块导入scrapy Spider?,python,scrapy,Python,Scrapy,每次我向scrapy添加新的spider.py时,我都需要导入一些模块,例如: from __future__ import division from extruct.w3cmicrodata import MicrodataExtractor from extruct.jsonld import JsonLdExtractor import scrapy import re import logging from pprint import pprint from scrapy.except

每次我向scrapy添加新的spider.py时,我都需要导入一些模块,例如:

from __future__ import division
from extruct.w3cmicrodata import MicrodataExtractor
from extruct.jsonld import JsonLdExtractor
import scrapy
import re
import logging
from pprint import pprint
from scrapy.exceptions import DropItem
from urlparse import urlparse
import tldextract
import json
....
每次添加这些模块都很无聊


我是python新手,有没有一种方法可以导入这些东西一次,然后不需要为每个spider文件导入它们?就像php一样。

您可以将所有这些导入放在一个模块(myimports.py)中,然后从.myimports import*运行
,但这是一种糟糕的做法-在Python中,这种隐式导入非常不受欢迎,因为它们会降低代码的可维护性

如果您有公共导入,那么这些spider中可能有一些公共代码,您可以将其提取到实用程序函数库中,或者提取到一个基本spider类中

您还可以使用命令和自定义spider模板。创建具有以下结构的文件夹:

mytemplates
  spiders
    myspider.tmpl
然后将项目的选项设置为该文件夹,将spider模板(只是一个包含starter Python代码的文件)放入
myspider.tmpl
文件中

当前
name
domain
是必需的
genspider
参数;您可以在模板中使用这些变量,例如

import scrapy
# your long imports list

class MySpider(scrapy.Spider):
    name = "$name"
    allowed_domains = ["$domain"]
    start_urls = ['http://$domain/']

    def parse(self, response):
        pass
然后运行
scrapy genspider--list
检查模板是否可用,然后运行
scrapy genspider-t myspider

还有其他更通用的模板生成实用程序-请看

在我看来,要做的是提取通用代码,这应该有助于减少导入列表;代码生成是一个更糟糕的解决方案,而一个包含所有导入的模块是一个糟糕的解决方案,它是最糟糕的


不要太担心长的导入列表,在Python中,在文件的顶部有这样的导入列表是很常见的,这是好事-您可以看到函数或类的来源,这使调试更容易。

感谢您提供了详细的答案。我来自PHP世界,我想我需要一些时间来学习Python的禅:)