कैसे Scrapy परियोजनाओं को डिबग करने के लिए PyCharm का उपयोग करें


97

मैं पाइथन 2.7 के साथ स्क्रेपी 0.20 पर काम कर रहा हूं। मैंने पाया कि Pyharm के पास एक अच्छा पायथन डिबगर है। मैं इसका उपयोग करके अपने स्क्रेपी मकड़ियों का परीक्षण करना चाहता हूं। किसी को पता है कि कृपया कैसे करना है?

मैंने क्या कोशिश की है

वास्तव में मैंने मकड़ी को स्क्रिप्ट के रूप में चलाने की कोशिश की। परिणामस्वरूप, मैंने उस स्क्रिप्ट का निर्माण किया। फिर, मैंने अपनी स्क्रेपी परियोजना को PyCharm को इस तरह एक मॉडल के रूप में जोड़ने की कोशिश की:
File->Setting->Project structure->Add content root.

लेकिन मुझे नहीं पता कि मुझे और क्या करना है

जवाबों:


170

scrapyआदेश एक अजगर स्क्रिप्ट आप अंदर PyCharm से शुरू कर सकते हैं, जिसका मतलब है है।

जब आप टेढ़ी बाइनरी की जांच 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 रन / डिबग कॉन्फ़िगरेशन

अपने क्रैकपॉइंट्स को अपने क्रॉलिंग कोड में कहीं भी रखें और इसे ™ काम करना चाहिए।


(<टाइप 'अपवाद। SyntaxError'>, SyntaxError ("नॉन-एएससीआईआई कैरेक्टर '\\ xf3' फ़ाइल /Library/python/2.7/site-packages/scrapy/cmdline.pyc पर लाइन 1 पर, लेकिन कोई एन्कोडिंग घोषित नहीं किया गया;
आयमोन फोर्नियर

1
महान समाधान! मैंने खुद भी ज्यादातर इसी तरह स्थित स्क्रैप बाइनरी का उपयोग करने की कोशिश की: / usr / bin / scrapy स्क्रिप्ट के रूप में एक ही पैरामीटर या किसी भी अन्य स्क्रैप कमांड जिसे आप डीबग करना चाहते हैं और यह बिल्कुल सही काम करता है। सुनिश्चित करें कि वर्किंग डायरेक्टरी आपके स्क्रैपी प्रोजेक्ट रूट की ओर इशारा कर रही है जहां स्क्रैपसी.फिग स्थित है।
नूर वुल्फ

3
@AymonFournier ऐसा लगता है कि आप एक .pyc फ़ाइल चलाने का प्रयास कर रहे हैं। इसके बजाय .py फ़ाइल चलाएं (स्क्रैपी / cmdline.py)।
आर्टुर गैस्पर

4
यदि मैं ऐसा कर रहा हूं, तो मेरी सेटिंग मॉड्यूल नहीं मिली है। ImportError: No module named settingsमैंने जाँच की है कि वर्किंग डायरेक्टरी प्रोजेक्ट डायरेक्टरी है। यह एक Django परियोजना के भीतर प्रयोग किया जाता है। किसी और ने इस समस्या पर ठोकर खाई?
सूर्योदय से

6
कॉन्फ़िगर करना न भूलें Working directory, अन्यथा त्रुटि होगीno active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan

105

आपको बस यह करने की जरूरत है।

अपनी परियोजना पर क्रॉलर फ़ोल्डर पर एक पायथन फ़ाइल बनाएँ। मैंने मेनडोम का उपयोग किया।

  • परियोजना
    • क्रॉलर
      • क्रॉलर
        • मकड़ियों
        • ...
      • main.py
      • scrapy.cfg

अपने मेनफ्रेम के अंदर इस कोड को डालें।

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

और आपको अपना मेनफ्रेम चलाने के लिए "रन कॉन्फ़िगरेशन" बनाने की आवश्यकता है।

ऐसा करने पर, यदि आप अपने कोड में एक ब्रेकपॉइंट लगाते हैं तो यह वहीं रुक जाएगा।


1
यह एक भयानक समाधान है।
अरस्तू

1
यह विधि अधिक उपयोगी है।
wyx

1
यह मेरी जान बचाता है! धन्यवाद!
zsljulius

5
आप अलग-अलग मकड़ियों के लिए कई निष्पादन को कॉन्फ़िगर करना चाह सकते हैं, इसलिए मकड़ी का नाम अपने रन कॉन्फ़िगरेशन के तर्क के रूप में स्वीकार करें। फिर एसईएस स्पाइडर = sys.argv [1] cmdline.execute ("स्क्रैप क्रॉल {{}"। Format (स्पाइडर)
.plplit

2
निश्चित रूप से इसे करने का सबसे साफ और सबसे तेज़ तरीका, अपने सीवीएस में इसे स्टोर करने का सबसे अच्छा तरीका भी।
जोस टॉमस टोकोनो

23

2018.1 तक यह बहुत आसान हो गया। अब आप Module nameअपनी परियोजना में चयन कर सकते हैं Run/Debug Configuration। यह scrapy.cmdlineऔर Working directoryरद्दी परियोजना के रूट डायर को सेट करें (एक के साथ एक)settings.py उस में)।

इस तरह:

PyCharm Scrapy डीबग कॉन्फ़िगरेशन

अब आप अपने कोड को डीबग करने के लिए ब्रेकप्वाइंट जोड़ सकते हैं।


8

मैं Python 3.5.0 के साथ एक virtualenv में स्क्रैपी चला रहा हूं और /path_to_project_env/env/bin/scrapyमेरे लिए समस्या को हल करने के लिए "स्क्रिप्ट" पैरामीटर सेट कर रहा हूं।


मैं इस काम से आश्चर्यचकित हूं, मुझे लगा कि स्कूटी ने अजगर 3 के साथ काम नहीं किया है
user1592380

1
धन्यवाद, यह पायथन 3.5 और virtualenv के साथ काम किया। "स्क्रिप्ट" जैसा कि @rioted ने कहा है और "वर्किंग डायरेक्टरी" को project/crawler/crawler, यानी डायरेक्टरी होल्डिंग को सेट करना है __init__.py
15

5

गहन विचार भी काम करता है।

मेनहोम बनाएँ :

#!/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

जवाब के @ रोड्रिगो संस्करण का विस्तार करते हुए मैंने इस स्क्रिप्ट को जोड़ा और अब मैं स्ट्रिंग में बदलने के बजाय कॉन्फ़िगरेशन से स्पाइडर नाम सेट कर सकता हूं।

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.