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

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

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

Actually I tried to run the spider as a script. As a result, I built that script. Then, I tried to add my Scrapy project to PyCharm as a model like this:
File->Setting->Project structure->Add content root.

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


person William Kinaan    schedule 14.02.2014    source источник


Ответы (10)


Команда 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 Run / Debug Configuration

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

person Pullie    schedule 07.03.2014
comment
(‹Введите 'exceptions.SyntaxError'›, SyntaxError (не-ASCII-символ '\\ xf3' в файле /Library/python/2.7/site-packages/scrapy/cmdline.pyc в строке 1, но кодировка не объявлена; - person Aymon Fournier; 06.12.2014
comment
@AymonFournier: Другая проблема, не имеющая отношения к исходному вопросу. См .: stackoverflow.com/questions/10589620/ £ - person Pullie; 06.12.2014
comment
Отличное решение! Я также пробовал использовать сам двоичный файл scrapy, расположенный в основном в: / usr / bin / scrapy, в качестве сценария с такими же параметрами или любыми другими командами scrapy, которые вы хотите отлаживать, и он работал просто идеально. убедитесь, что рабочий каталог указывает на корень вашего проекта scrapy, где находится scrapy.cfg. - person Nour Wolf; 18.01.2015
comment
@AymonFournier Похоже, вы пытаетесь запустить файл .pyc. Вместо этого запустите соответствующий файл .py (scrapy / cmdline.py). - person Artur Gaspar; 12.05.2015
comment
Если я это сделаю, мой модуль настроек не найден. ImportError: No module named settings Я проверил, что рабочий каталог является каталогом проекта. Он используется в проекте Django. Кто-нибудь еще сталкивался с этой проблемой? - person suntoch; 22.01.2016
comment
При использовании этого метода конфигурация scrapy игнорируется. Не знаю почему. - person javamonkey79; 23.09.2016
comment
Не забудьте настроить Working directory, иначе будет ошибка no active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2 - person crifan; 09.01.2018
comment
он говорит: from scrapy.http.headers import Headers ImportError: невозможно импортировать имя 'Headers' из частично инициализированного модуля scrapy.http.headers, скорее всего, из-за циклического импорта Python38 - person Amrit; 09.05.2021

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

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

  • Project
    • Crawler
      • Crawler
        • Spiders
        • ...
      • main.py
      • scrapy.cfg

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

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

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

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

person Rodrigo    schedule 04.05.2014
comment
Я использую Komodo IDE и ActivePython. И это решение, и решение Пулли работают. - person gm2008; 10.04.2015
comment
Это отличное решение. - person aristotll; 20.01.2016
comment
Этот метод более полезен. - person wyx; 21.10.2016
comment
Это спасает мне жизнь! Спасибо! - person zsljulius; 15.08.2017
comment
Возможно, вы захотите настроить несколько запусков для разных пауков, поэтому примите имя паука в качестве аргумента вашей конфигурации запуска. Затем импортируйте sys spider = sys.argv [1] cmdline.execute (сканирование scrapy {} .format (spider) .split ()) - person miguelfg; 01.10.2017
comment
Определенно самый чистый и быстрый способ сделать это, а также лучший способ сохранить его в вашей CVS. - person José Tomás Tocino; 12.10.2017
comment
@miguelfg, не могли бы вы уточнить, как передать имя паука в качестве аргумента в конфигурации запуска, не делая этого вручную каждый раз при запуске проекта? - person NFB; 28.01.2018
comment
Я попробовал принятый ответ, но не смог заставить его работать. Это решение проще и отлично работает. - person malla; 20.02.2018
comment
Ты гений. Спасибо за это решение. - person Utkarsh Sharma; 18.10.2019
comment
Потрясающие!!! Оно работает!!! - person migrant; 29.12.2020

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

Вот так:

«Конфигурация

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

person Rutger de Knijf    schedule 21.08.2018

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

person rioted    schedule 15.04.2016
comment
Я удивлен, что это работает, я думал, что scrapy не работает с python 3 - person user1592380; 31.05.2016
comment
Спасибо, это сработало с Python 3.5 и virtualenv. script, как сказал @rioted, и установив рабочий каталог на project/crawler/crawler, то есть каталог, содержащий __init__.py. - person effel; 07.12.2016

intellij idea тоже работают.

создать 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====================================================')

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

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

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

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

person LuciferJack    schedule 25.10.2017

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

person taylor    schedule 09.08.2015

Согласно документации 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
person berardino    schedule 19.12.2017

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

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

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

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

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

ОБНОВИТЬ

Вы также можете pip install pdbpp и использовать стандартный import pdb; pdb.set_trace вместо ipdb. На мой взгляд, PDB ++ лучше.

person warvariuc    schedule 16.02.2014

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

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()
person gangabass    schedule 21.08.2018
comment
Я использую нечто подобное под названием runner.py. Это важно потому, что он намеренно загружает файл настроек проекта. Вы должны сделать это, если пытаетесь загрузить конвейер (ы). - person Rob; 22.03.2021

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

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
person Muhammad Haseeb    schedule 13.12.2019