Доступ к предметам, выданным моим пауком при запуске Scrapy из скрипта - PullRequest
0 голосов
/ 18 февраля 2020

Я вызываю Паука-Терапии из Python сценария . Я бы хотел, чтобы имел доступ к элементам, которые дает Паук из моего скрипта . Но я понятия не имею, как это сделать.

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

Это код для сценария.

Class UASpider(scrapy.Spider):
     name = 'uaspider'
     start_urls = ['http://httpbin.org/user-agent']

     def parse(self, response):
         payload = json.loads(response.body.decode(response.encoding))
         yield {'ua':payload}

 def main():
     process = CrawlerProcess(get_project_settings())
     process.crawl(UASpider)
     process.start() # the script will block here until the crawling is finished

 if (__name__ == '__main__'):
     main()

И это часть журнала, которая показывает, что паук работает нормально и возвращает предметы.

2020-02-18 20:44:10 [scrapy.core.engine] INFO: Spider opened
2020-02-18 20:44:10 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2020-02-18 20:44:10 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2020-02-18 20:44:10 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://httpbin.org/user-agent> (referer: None)
2020-02-18 20:44:10 [scrapy.core.scraper] DEBUG: Scraped from <200 http://httpbin.org/user-agent>
{'ua': {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}}
2020-02-18 20:44:10 [scrapy.core.engine] INFO: Closing spider (finished)

Большое спасибо за вашу помощь !!


Один из вариантов, который я могу придумать, - это создать конвейер, в котором хранится элемент, а затем получить доступ к элементам из этого хранилища:

  • Чтобы это работало, мне нужно, чтобы конвейер был настроен в сценарии (не в настройках проекта).
  • Также было бы идеально хранить переменную, а не файлы (я делаю это для автоматизации тестов, и скорость важна).

1 Ответ

1 голос
/ 21 февраля 2020

Мне удалось сделать эту работу после предложения @Gallaecio, спасибо !!

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

Вот код, который заставляет его работать

user_agent = ''

Class UASpider(scrapy.Spider):
     name = 'uaspider'
     start_urls = ['http://httpbin.org/user-agent']

     def parse(self, response):
         payload = json.loads(response.body.decode(response.encoding))
         yield {'ua':payload}

class TempStoragePipeline(object):
    def process_item(self, item, spider):
        user_agent = item.get('ua').get('user-agent')
        return item

def main():
    settings = get_project_settings()
    settings.set('ITEM_PIPELINES', {
        '__main__.TempStoragePipeline': 100
    })

    process = CrawlerProcess(get_project_settings())
    process.crawl(UASpider)
    process.start() # the script will block here until the crawling is finished

if (__name__ == '__main__'):
    print(f'>>> {user_agent}'
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...