PyCharm을 사용하여 Scrapy 프로젝트를 디버깅하는 방법


97

저는 Python 2.7로 Scrapy 0.20에서 작업하고 있습니다. PyCharm에는 좋은 Python 디버거가 있습니다. 나는 그것을 사용하여 내 Scrapy 거미를 테스트하고 싶습니다. 누구든지 제발 방법을 알고 있습니까?

내가 시도한 것

사실 나는 거미를 스크립트로 실행하려고했습니다. 결과적으로 그 스크립트를 작성했습니다. 그런 다음 Scrapy 프로젝트를 PyCharm에 다음과 같은 모델로 추가하려고했습니다.
File->Setting->Project structure->Add content root.

하지만 내가 뭘해야할지 모르겠어

답변:


171

scrapy명령은 PyCharm 내부에서 시작할 수 있음을 의미하는 python 스크립트입니다.

스크래피 바이너리 ( which scrapy) 를 살펴보면 이것이 실제로 파이썬 스크립트임을 알 수 있습니다.

#!/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 내에서 실행 / 디버그 구성을 만듭니다. 스크래피 명령과 스파이더로 스크립트 매개 변수를 채우십시오. 이 경우 crawl IcecatCrawler.

이렇게 : PyCharm 실행 / 디버그 구성

크롤링 코드의 아무 곳에 나 중단 점을 넣으면 작동합니다 ™.


(<type 'exceptions.SyntaxError'>, SyntaxError ( "Non-ASCII character '\\ xf3'in file /Library/python/2.7/site-packages/scrapy/cmdline.pyc on line 1, but no encoding not defined;
Aymon 푸르니에

1
훌륭한 솔루션! 나는 또한 주로 / usr / bin / scrapy에있는 스크래피 바이너리 자체를 동일한 매개 변수 또는 디버깅하려는 다른 스크래피 명령이있는 스크립트로 사용해 보았고 완벽하게 작동했습니다. 작업 디렉토리가 scrapy.cfg가있는 스크래피 프로젝트 루트를 가리키는 지 확인하십시오.
Nour Wolf

3
@AymonFournier .pyc 파일을 실행하려는 것 같습니다. 대신 해당 .py 파일 (scrapy / cmdline.py)을 실행하십시오.
Artur Gaspar

4
내가 그렇게하면 내 설정 모듈을 찾을 수 없습니다. ImportError: No module named settings작업 디렉토리가 프로젝트 디렉토리인지 확인했습니다. Django 프로젝트 내에서 사용됩니다. 다른 사람이이 문제를 발견 했습니까?
suntoch

6
구성하는 것을 잊지 마십시오 Working directory. 그렇지 않으면 오류가 발생합니다no active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan

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
다른 스파이더에 대해 여러 실행을 구성하고 싶을 수 있으므로 실행 구성의 인수로 스파이더 이름을 수락하십시오. 그런 다음 import sys spider = sys.argv [1] cmdline.execute ( "scrapy crawl {}". format (spider) .split ())
miguelfg

2
확실히 가장 깨끗하고 빠른 방법이며 CVS에 저장하는 가장 좋은 방법입니다.
호세의 Tomás Tocino

23

2018.1부터 이것은 훨씬 쉬워졌습니다. 이제 Module name프로젝트의 Run/Debug Configuration. 이로 설정 scrapy.cmdline하고 Working directoryscrapy 프로젝트 (와 하나의 루트 디렉토리에 settings.py그것에).

이렇게 :

PyCharm Scrapy 디버그 구성

이제 중단 점을 추가하여 코드를 디버깅 할 수 있습니다.


8

Python 3.5.0을 사용하여 virtualenv에서 scrapy를 실행하고 "script"매개 변수를 설정 /path_to_project_env/env/bin/scrapy하여 문제 를 해결했습니다.


나는 이것이 작동하는 것이 놀랍다, 나는 scrapy가 파이썬 3에서 작동하지 않는다고 생각했다
user1592380

1
감사합니다. 이것은 Python 3.5 및 virtualenv에서 작동했습니다. @rioted가 말한대로 "스크립트"와 "작업 디렉토리"를 project/crawler/crawler, 즉 __init__.py.
effel

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())
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.