将模块导入scrapy蜘蛛一次的方法?

时间:2016-12-12 15:29:18

标签: 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.exceptions import DropItem
from urlparse import urlparse
import tldextract
import json
....

每次添加这些模块都很无聊。

我是python的新手,有没有办法导入这些东西,然后不需要为每个蜘蛛文件导入它们?就像php。

1 个答案:

答案 0 :(得分:3)

您可以将所有这些导入放入模块(myimports.py)然后运行from .myimports import *,但这是一种不好的做法 - 在Python中,这种隐式导入非常不鼓励,因为它们使代码的可维护性降低。

如果您有共同的导入,那么这些蜘蛛中可能有一些常用代码,您可以将它提取到实用函数库或基类蜘蛛类中吗?

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

mytemplates
  spiders
    myspider.tmpl

然后将项目的TEMPLATES_DIR选项设置为此文件夹,将蜘蛛模板(只是带有入门Python代码的文件)放在myspider.tmpl文件中。

目前namedomain是必需的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 <spider-name> <domain-to-crawl>

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

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

不要过多担心很长的导入列表,在Python中常见的是在文件的顶部有这样的导入列表,这很好 - 你可以看到函数的位置或者来自一个类,它使调试更容易。