добавление метода from_crawler в скрипт scrapy.xlib.pydispatch - PullRequest
0 голосов
/ 08 октября 2019

обязательно подтвердите, если вы нашли этот вопрос хорошо изученным и полезным для вас. Другие люди заслуживают такой же возможности находить полезные сообщения.

У меня был этот функциональный код не так давно, когда я использовал этот паук-скрап, написанный на python на окнах, теперь он появляется при использовании сканирования-скрапа

ScrapyDeprecationWarning: Импорт из scrapy.xlib.pydispatch устарел и> больше не будет поддерживаться в будущих версиях Scrapy. Если вы просто хотите подключить> сигналы, используйте метод класса from_crawler, в противном случае импортируйте pydispatch напрямую, если> это необходимо. Смотрите: https://github.com/scrapy/scrapy/issues/1762 из> scrapy.xlib.pydispatch dispatcher import

Я просмотрел их страницу на форуме github для объяснения, затем заменил этот пакет на PyDispatcher 2.0.5, и это возвращает, чтопакет не находится в моей среде conda (он есть) - однако они упомянули добавление метода from_crawler в качестве решения проблемы. Я не уверен, как это сделать

https://github.com/scrapy/scrapy/issues/1762 в третьем комментарии внизу они говорят это

@ classmethod def from_crawler (cls, crawler, * args, ** kwargs): spider = super (MySpider, cls) .from_crawler (crawler, * args, ** kwargs) crawler.signals.connect (spider.spider_opened, signal.spider_opened) возвращать spider

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 Ответ

1 голос
/ 08 октября 2019

Решение заключается в использовании встроенных 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_crawler и pydispatch не нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...