Невозможно успешно запустить паука после завершения очистки данных другим пауком при выполнении сценария - PullRequest
0 голосов
/ 23 января 2020

Я использую следующий код из этих предыдущих сообщений stackoverflow:

  1. Как запланировать выполнение сканирования Scrapy программно
  2. Запуск Scrapy несколько раз в тот же процесс

Следующий скрипт хорошо работает при использовании одного паука:

from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from AmazonScrap.spiders.Amazonfeed import AmazonfeedSpider
from scrapy.utils.project import  get_project_settings
from twisted.internet.defer import inlineCallbacks
from urllib.parse import urlparse
# from AmazonScrap.spiders.Productfeed import ProductfeedSpider
import yaml
from urllib.parse import urlencode
with open(r'C:\Users\Latitude\Desktop\Shadman\Scrapy_Projects\Product_List.yaml') as file:
         PList = yaml.load(file, Loader=yaml.FullLoader) 

Purl= []
for k, v in PList.items():
    arg = v['M_title']
    args = {"k": arg}
    amazon_url= 'https://www.amazon.com/s?{}'.format(urlencode(args))
    Purl.append(amazon_url)

print(Purl)
configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})
runner = CrawlerRunner(settings = get_project_settings())

@inlineCallbacks
def loop_urls(urls):
    for url in urls:
        yield runner.crawl(AmazonfeedSpider, url)
    # reactor.stop()

loop_urls(Purl)
reactor.run()

введите код здесь

Но этот скрипт даже не отбрасывает успешно используя первого паука ... и не может получить доступ ко 2-му пауку ...

from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from AmazonScrap.spiders.Amazonfeed import AmazonfeedSpider
from scrapy.utils.project import  get_project_settings
from twisted.internet.defer import inlineCallbacks
from urllib.parse import urlparse
from AmazonScrap.spiders.Productfeed import ProductfeedSpider
import yaml
from urllib.parse import urlencode

# def crawl_job():
#     """
#     Job to start spiders.
#     Return Deferred, which will execute after crawl has completed.
#     """
#     settings = get_project_settings()
#     runner = CrawlerRunner(settings)
#     return runner.crawl(AmazonfeedSpider)
def CrawlProduct():
    settings = get_project_settings()
    runner2 = CrawlerRunner(settings)
    yield runner2.crawl(ProductfeedSpider)
    reactor.stop()

def schedule_next_crawl(null, sleep_time):
    """
    Schedule the next crawl
    """
    reactor.callLater(sleep_time, CrawlProduct)

@inlineCallbacks
def loop_urls(urls):
    """
#     Job to start spiders.
#     Return Deferred, which will execute after crawl has completed.
#     """
    settings = get_project_settings()
    runner = CrawlerRunner(settings)
    for url in urls:
        yield runner.crawl(AmazonfeedSpider, url)
    # reactor.stop()

def crawl(Purl):
    """
    A function that schedules a crawl 30 seconds after
    each successful crawl.
    """
    # loop_urls() returns a Deferred
    d = loop_urls(Purl)
    # call schedule_next_crawl(<scrapy response>, n) after crawl job is complete
    d.addCallback(schedule_next_crawl, 30)
    d.addErrback(catch_error)

def catch_error(failure):
    print(failure.value)

if __name__=="__main__":
    with open(r'C:\Users\Latitude\Desktop\Shadman\Scrapy_Projects\Product_List.yaml') as file:
         PList = yaml.load(file, Loader=yaml.FullLoader) 

    Purl= []
    for k, v in PList.items():
        arg = v['M_title']
        args = {"k": arg}
        amazon_url= 'https://www.amazon.com/s?{}'.format(urlencode(args))
        Purl.append(amazon_url)

    print(Purl)
    configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})
    crawl(Purl)
    reactor.run()

Это для неправильного выполнения функции inlineCallbacks ..? Я привлекаю внимание экспертов altruisti c и с нетерпением жду их предложений и решений. перед тем, как ответить на мой вопрос, сначала рассмотрите вышеупомянутые вопросы и решения, связанные с переполнением стека.

...