将from_crawler方法添加到scrapy.xlib.pydispatch脚本

时间:2019-10-08 08:33:19

标签: python-3.x selenium scrapy

如果您发现此问题经过了深入研究并且对您有用,请确保投票赞成。其他人也应该有同样的机会找到有用的帖子。

我不久前在Windows上使用以python编写的这个scrapy蜘蛛时就拥有了此功能代码,现在在使用scrapy爬网时出现了这个

  

ScrapyDeprecationWarning:不建议从scrapy.xlib.pydispatch导入,并且在将来的Scrapy版本中将不再支持。如果只想连接> signals,请使用from_crawler类方法,否则,如果需要,直接导入pydispatch。请参阅:> {scrapy.xlib.pydispatch导入调度程序中的https://github.com/scrapy/scrapy/issues/1762

我查看了他们的github论坛页面上的解释,然后用PyDispatcher 2.0.5替换了此软件包,这返回该软件包不在我的conda环境中(是)-但是他们提到添加了from_crawler方法作为解决问题的方法。我不确定该怎么做

https://github.com/scrapy/scrapy/issues/1762 在第三条评论中,他们说

  
    

@classmethod     def from_crawler(cls,crawler,* args,** kwargs):         spider =超级(MySpider,cls).from_crawler(crawler,* args,** kwargs)         crawler.signals.connect(spider.spider_opened,signal.spider_opened)         返回蜘蛛

  
import scrapy,time
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher

from mysql.connector import (connection)
from scrapy.selector  import Selector
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class GetdataSpider(scrapy.Spider):
    name = 'placeholder'
    start_urls = ['placeholder.org/search/sss?postedToday=1']
    cnx = connection.MySQLConnection(user='root', password='',
                                     host='127.0.0.1',
                                     database='placeholder')
    cursor = cnx.cursor()

    def __init__(self):
        dispatcher.connect(self.spider_closed, signals.spider_closed)

    def parse(self, response):
        try:
            x= Selector(response)
正如Luiz和Tomjn所建议的,

似乎信号是替代运行此脚本的解决方案。但是,整个脚本都使用self,而def spider_closed用于此处的操作,我不确定如何将其更改为与from_crawler方法一起使用。

def spider_closed(self, spider):
        sql = "DELETE FROM images WHERE EventDate < NOW() - INTERVAL 3 DAY"
        self.cursor.execute(sql)
        sql = "DELETE FROM dialy_items WHERE EventDate < NOW() - INTERVAL 3 DAY"
        self.cursor.execute(sql)
        self.cnx.commit()

        self.cursor.close()
        self.cnx.close()

1 个答案:

答案 0 :(得分:1)

解决方案是使用内置的Scrapy Signals来完成对pydispatch的操作。例如,将您的__init__方法替换为from_crawler

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
    spider = super(GetdataSpider, cls).from_crawler(crawler, *args, **kwargs)
    crawler.signals.connect(spider.spider_closed, signals.spider_closed)
    return spider

您的蜘蛛网中确实有一种叫做self.spider_closed的方法吗?如果不是,那么您实际上不需要连接任何信号,因为Scrapy已经将spider_closed信号连接到默认的spider_closed方法。实际上,根据您显示的代码,不需要__init__from_crawlerpydispatch