Как использовать PyCharm для отладки проектов Scrapy


97

Я работаю над Scrapy 0.20 с Python 2.7. Я обнаружил, что в PyCharm есть хороший отладчик Python. Я хочу протестировать на нем своих пауков Scrapy. Кто-нибудь знает, как это сделать, пожалуйста?

Что я пробовал

Собственно я пытался запустить паука как скрипт. В результате я построил этот сценарий. Затем я попытался добавить свой проект Scrapy в PyCharm в виде такой модели:
File->Setting->Project structure->Add content root.

Но я не знаю, что мне еще делать

Ответы:


171

Команда scrapyпредставляет собой скрипт python, что означает, что вы можете запустить ее из PyCharm.

Когда вы изучите двоичный файл scrapy ( which scrapy), вы заметите, что это на самом деле скрипт на Python:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

Это означает, что такую ​​команду scrapy crawl IcecatCrawlerможно также выполнить так:python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

Попробуйте найти пакет scrapy.cmdline. В моем случае местоположение было здесь:/Library/Python/2.7/site-packages/scrapy/cmdline.py

Создайте конфигурацию запуска / отладки внутри PyCharm с этим скриптом в качестве скрипта. Заполните параметры скрипта командой scrapy и пауком. В этом случае crawl IcecatCrawler.

Как это: PyCharm Конфигурация запуска / отладки

Поместите точки останова в любом месте кода сканирования, и он должен работать ™.


(<type 'exceptions.SyntaxError'>, SyntaxError ("Не-ASCII-символ '\\ xf3' в файле /Library/python/2.7/site-packages/scrapy/cmdline.pyc в строке 1, но не объявлена ​​кодировка;
Аймон Фурнье

1
Отличное решение! Я также пробовал использовать сам двоичный файл scrapy, расположенный в основном в: / usr / bin / scrapy, в качестве сценария с такими же параметрами или любыми другими командами scrapy, которые вы хотите отлаживать, и он работал просто идеально. убедитесь, что рабочий каталог указывает на корень вашего проекта scrapy, в котором находится scrapy.cfg.
Nour Wolf

3
@AymonFournier Похоже, вы пытаетесь запустить файл .pyc. Вместо этого запустите соответствующий файл .py (scrapy / cmdline.py).
Артур Гаспар

4
Если я это сделаю, мой модуль настроек не найден. ImportError: No module named settingsЯ проверил, что рабочий каталог - это каталог проекта. Он используется в проекте Django. Кто-нибудь еще сталкивался с этой проблемой?
suntoch

6
Не забудьте Working directoryno active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
настроить

106

Вам просто нужно это сделать.

Создайте файл Python в папке искателя вашего проекта. Я использовал main.py.

  • Проект
    • Гусеничный трактор
      • Гусеничный трактор
        • Пауки
        • ...
      • main.py
      • scrapy.cfg

Внутри вашего main.py поместите этот код ниже.

from scrapy import cmdline    
cmdline.execute("scrapy crawl spider".split())

И вам необходимо создать «конфигурацию запуска» для запуска main.py.

При этом, если вы поместите точку останова в свой код, он остановится на этом.


1
Это отличное решение.
aristotll

1
Этот метод более полезен.
wyx

1
Это спасает мне жизнь! Спасибо!
zsljulius

5
Возможно, вы захотите настроить несколько запусков для разных пауков, поэтому примите имя паука в качестве аргумента вашей конфигурации запуска. Затем импортируйте sys spider = sys.argv [1] cmdline.execute ("сканирование scrapy {}". Format (spider) .split ())
miguelfg 01

2
Определенно самый чистый и быстрый способ сделать это, а также лучший способ сохранить его в вашей CVS.
Хосе Томас Тосино

23

В 2018.1 это стало намного проще. Теперь вы можете выбрать Module nameв своем проекте Run/Debug Configuration. Установите это значение scrapy.cmdlineи Working directoryзначение в корневой каталог проекта scrapy (тот, который находится settings.pyв нем).

Вот так:

Конфигурация отладки PyCharm Scrapy

Теперь вы можете добавлять точки останова для отладки кода.


8

Я запускаю scrapy в virtualenv с Python 3.5.0 и устанавливаю параметр «script», чтобы /path_to_project_env/env/bin/scrapyрешить эту проблему для меня.


Я удивлен, что это работает, я думал, что scrapy не работает с python 3
user1592380

1
Спасибо, это сработало с Python 3.5 и virtualenv. "script", как сказал @rioted, и установка "рабочего каталога" project/crawler/crawler, то есть каталога, в котором он находится __init__.py.
effel 07

5

Идея intellij тоже работает.

создать main.py :

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#coding=utf-8
import sys
from scrapy import cmdline
def main(name):
    if name:
        cmdline.execute(name.split())



if __name__ == '__main__':
    print('[*] beginning main thread')
    name = "scrapy crawl stack"
    #name = "scrapy crawl spa"
    main(name)
    print('[*] main thread exited')
    print('main stop====================================================')

показать ниже:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь


3

Чтобы добавить немного к принятому ответу, почти через час я обнаружил, что мне нужно выбрать правильную конфигурацию запуска из раскрывающегося списка (рядом с центром панели инструментов значков), затем нажать кнопку «Отладка», чтобы заставить ее работать. Надеюсь это поможет!


2

Я также использую PyCharm, но не использую его встроенные функции отладки.

Для отладки использую ipdb. Я установил сочетание клавиш для вставки import ipdb; ipdb.set_trace()в любую строку, в которой я хочу, чтобы сработала точка останова.

Затем я могу ввести, nчтобы выполнить следующий оператор, sвойти в функцию, ввести любое имя объекта, чтобы увидеть его значение, изменить среду выполнения, ввести, cчтобы продолжить выполнение ...

Это очень гибко, работает в средах, отличных от PyCharm, где вы не контролируете среду выполнения.

Просто введите свою виртуальную среду pip install ipdbи поместите import ipdb; ipdb.set_trace()в строку, где вы хотите приостановить выполнение.


2

Согласно документации https://doc.scrapy.org/en/latest/topics/practices.html

import scrapy
from scrapy.crawler import CrawlerProcess

class MySpider(scrapy.Spider):
    # Your spider definition
    ...

process = CrawlerProcess({
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})

process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished

0

Я использую этот простой скрипт:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

process = CrawlerProcess(get_project_settings())

process.crawl('your_spider_name')
process.start()

0

Расширяя версию ответа @ Rodrigo, я добавил этот скрипт, и теперь я могу установить имя паука из конфигурации вместо изменения строки.

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.