每次我在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。
答案 0 :(得分:3)
您可以将所有这些导入放入模块(myimports.py)然后运行from .myimports import *
,但这是一种不好的做法 - 在Python中,这种隐式导入非常不鼓励,因为它们使代码的可维护性降低。
如果您有共同的导入,那么这些蜘蛛中可能有一些常用代码,您可以将它提取到实用函数库或基类蜘蛛类中吗?
您还可以使用scrapy genspider命令和自定义蜘蛛模板。创建具有以下结构的文件夹:
mytemplates
spiders
myspider.tmpl
然后将项目的TEMPLATES_DIR选项设置为此文件夹,将蜘蛛模板(只是带有入门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 <spider-name> <domain-to-crawl>
。
还有其他更通用的模板生成实用程序 - 请查看cookiecutter。
在我看来,要走的路是提取公共代码,这应该有助于减少导入列表;代码生成是一个更糟糕的解决方案,一个包含所有导入的模块是一个糟糕的解决方案,它是最糟糕的。
不要过多担心很长的导入列表,在Python中常见的是在文件的顶部有这样的导入列表,这很好 - 你可以看到函数的位置或者来自一个类,它使调试更容易。