[英]Scrapy: Get Start_Urls from Database by Pipeline
不幸的是我没有足够的人口来发表评论,所以我不得不提出这个新问题,参考https://stackoverflow.com/questions/23105590/how-to-get-the-pipeline-object-in-爬虫蜘蛛
我在数据库中有很多网址。 所以我想从我的数据库中获取 start_url。 到目前为止不是什么大问题。 好吧,我不希望蜘蛛内部和管道中的 mysql 东西出现问题。 如果我尝试像在提到的问题中那样将管道 object 移交给我的蜘蛛,我只会收到带有消息的属性错误
'None Type' object has no attribute getUrl
我认为实际的问题是 function spider_opened 没有被调用(还插入了一个从未在控制台中显示其 output 的打印语句)。 有人知道如何在蜘蛛内部获取管道 object 吗?
我的蜘蛛程序
def __init__(self):
self.pipe = None
def start_requests(self):
url = self.pipe.getUrl()
scrapy.Request(url,callback=self.parse)
管道.py
@classmethod
def from_crawler(cls, crawler):
pipeline = cls()
crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
def spider_opened(self, spider):
spider.pipe = self
def getUrl(self):
...
Scrapy 管道已经有了预期的open_spider
和close_spider
方法
取自文档: https : //doc.scrapy.org/en/latest/topics/item-pipeline.html#open_spider
open_spider(自我,蜘蛛)
这个方法在蜘蛛打开时被调用。
参数:蜘蛛(蜘蛛对象)——被打开的蜘蛛close_spider(自我,蜘蛛)
当蜘蛛关闭时调用此方法。 参数:蜘蛛(蜘蛛对象)——被关闭的蜘蛛
但是您最初的问题没有多大意义,为什么要为您的蜘蛛分配管道引用? 这似乎是一个非常糟糕的主意。
您应该做的是打开数据库并读取蜘蛛本身中的网址。
from scrapy import Spider
class MySpider(Spider):
name = 'myspider'
start_urls = []
@classmethod
def from_crawler(self, crawler, *args, **kwargs):
spider = super().from_crawler(crawler, *args, **kwargs)
spider.start_urls = self.get_urls_from_db()
return spider
def get_urls_from_db(self):
db = # get db cursor here
urls = # use cursor to pop your urls
return urls
我使用的是公认的解决方案,但没有按预期工作。
TypeError: get_urls_from_db() missing 1 required positional argument: 'self'
这是我这边的工作
from scrapy import Spider
class MySpider(Spider):
name = 'myspider'
start_urls = []
def __init__(self, db_dsn):
self.db_dsn = db_dsn
self.start_urls = self.get_urls_from_db(db_dsn)
@classmethod
def from_crawler(cls, crawler):
spider = cls(
db_dsn=os.getenv('DB_DSN', 'mongodb://localhost:27017'),
)
spider._set_crawler(crawler)
return spider
def get_urls_from_db(self, db_dsn):
db = # get db cursor here
urls = # use cursor to pop your urls
return urls
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.