วิธีใช้ PyCharm เพื่อดีบักโครงการ Scrapy


100

ฉันกำลังทำงานกับ Scrapy 0.20 ด้วย Python 2.7 ฉันพบว่า PyCharm มีดีบักเกอร์ Python ที่ดี ฉันต้องการทดสอบแมงมุม Scrapy โดยใช้มัน ใครรู้วิธีทำกรุณา?

สิ่งที่ฉันได้ลอง

อันที่จริงฉันพยายามเรียกใช้สไปเดอร์ตามสคริปต์ ด้วยเหตุนี้ฉันจึงสร้างสคริปต์นั้นขึ้นมา จากนั้นฉันพยายามเพิ่มโครงการ Scrapy ของฉันไปยัง PyCharm เป็นโมเดลดังนี้:
File->Setting->Project structure->Add content root.

แต่ฉันไม่รู้ว่าฉันต้องทำอะไรอีก

คำตอบ:


172

scrapyคำสั่งเป็นสคริปต์หลามซึ่งหมายความว่าคุณสามารถเริ่มต้นได้จาก 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

วางจุดพักไว้ที่ใดก็ได้ในรหัสการรวบรวมข้อมูลของคุณและควรใช้งานได้™


(<type 'exceptions.SyntaxError'>, SyntaxError ("อักขระที่ไม่ใช่ ASCII '\\ xf3' ในไฟล์ /Library/python/2.7/site-packages/scrapy/cmdline.pyc ในบรรทัดที่ 1 แต่ไม่มีการประกาศการเข้ารหัส
Aymon Fournier

1
ทางออกที่ดี! ฉันยังลองใช้ไบนารี scrapy ซึ่งส่วนใหญ่อยู่ใน: / usr / bin / scrapy เป็นสคริปต์ที่มีพารามิเตอร์เดียวกันหรือคำสั่ง scrapy อื่น ๆ ที่คุณต้องการแก้ไขข้อบกพร่องและมันก็ทำงานได้สมบูรณ์แบบ ตรวจสอบให้แน่ใจว่าไดเร็กทอรีการทำงานชี้ไปที่รูทโปรเจ็กต์ 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

108

คุณต้องทำสิ่งนี้

สร้างไฟล์ Python บนโฟลเดอร์ซอฟต์แวร์รวบรวมข้อมูลในโครงการของคุณ ฉันใช้ main.py.

  • โครงการ
    • โปรแกรมรวบรวมข้อมูล
      • โปรแกรมรวบรวมข้อมูล
        • แมงมุม
        • ...
      • main.py
      • scrapy.cfg

ภายใน main.py ของคุณใส่รหัสนี้ด้านล่าง

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

และคุณต้องสร้าง "Run Configuration" เพื่อเรียกใช้ main.py

การทำเช่นนี้หากคุณวางเบรกพอยต์ไว้ที่โค้ดของคุณมันจะหยุดตรงนั้น


1
นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยม
aristotll

1
วิธีนี้มีประโยชน์กว่า
wyx

1
อันนี้ช่วยชีวิตฉัน! ขอบคุณ!
zsljulius

6
คุณอาจต้องการกำหนดค่าการดำเนินการหลายรายการสำหรับสไปเดอร์ที่แตกต่างกันดังนั้นให้ยอมรับชื่อแมงมุมเป็นอาร์กิวเมนต์ของการกำหนดค่าการรันของคุณ จากนั้นนำเข้า sys spider = sys.argv [1] cmdline.execute ("scrapy crawl {}". format (spider) .split ())
miguelfg

2
เป็นวิธีที่สะอาดที่สุดและเร็วที่สุดในการทำอย่างแน่นอนและยังเป็นวิธีที่ดีที่สุดในการจัดเก็บไว้ใน CVS
JoséTomás Tocino

26

ในปี 2018.1 สิ่งนี้ง่ายขึ้นมาก ตอนนี้คุณสามารถเลือกModule nameในโครงการของRun/Debug Configurationคุณได้ ตั้งค่านี้เป็นscrapy.cmdlineและเป็นWorking directoryรูท dir ของโครงการ 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 "สคริปต์" เป็น @rioted พูดและการตั้งค่า "ไดเรกทอรีการทำงาน" เพื่อคือการถือครองไดเรกทอรีproject/crawler/crawler __init__.py
ออก

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

หากต้องการเพิ่มคำตอบที่ยอมรับหลังจากผ่านไปเกือบชั่วโมงฉันพบว่าฉันต้องเลือก Run Configuration ที่ถูกต้องจากรายการแบบเลื่อนลง (ใกล้ตรงกลางของแถบเครื่องมือไอคอน) จากนั้นคลิกปุ่ม Debug เพื่อให้มันทำงานได้ หวังว่านี่จะช่วยได้!


2

ฉันใช้ PyCharm ด้วย แต่ฉันไม่ได้ใช้คุณสมบัติการดีบักในตัว

ipdbสำหรับการแก้จุดบกพร่องฉันใช้ ฉันตั้งค่าแป้นพิมพ์ลัดเพื่อแทรกimport ipdb; ipdb.set_trace()ในบรรทัดใด ๆ ที่ฉันต้องการให้จุดพักเกิดขึ้น

จากนั้นฉันสามารถพิมพ์nเพื่อดำเนินการคำสั่งถัดไปsเพื่อเข้าสู่ฟังก์ชั่นพิมพ์ชื่อวัตถุใด ๆ เพื่อดูค่าของมันแก้ไขสภาพแวดล้อมการดำเนินการพิมพ์cเพื่อดำเนินการต่อ ...

สิ่งนี้มีความยืดหยุ่นมากทำงานในสภาพแวดล้อมอื่นที่ไม่ใช่ PyCharm โดยที่คุณไม่ได้ควบคุมสภาพแวดล้อมการดำเนินการ

เพียงพิมพ์สภาพแวดล้อมเสมือนของคุณpip install ipdbและวางimport ipdb; ipdb.set_trace()บนบรรทัดที่คุณต้องการให้การดำเนินการหยุดชั่วคราว



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.