Cara menggunakan PyCharm untuk men-debug proyek Scrapy


97

Saya sedang mengerjakan Scrapy 0.20 dengan Python 2.7. Saya menemukan PyCharm memiliki debugger Python yang bagus. Saya ingin menguji laba-laba Scrapy saya menggunakannya. Adakah yang tahu bagaimana melakukannya?

Apa yang telah saya coba

Sebenarnya saya mencoba menjalankan laba-laba sebagai skrip. Hasilnya, saya membuat skrip itu. Kemudian, saya mencoba menambahkan proyek Scrapy saya ke PyCharm sebagai model seperti ini:
File->Setting->Project structure->Add content root.

Tapi saya tidak tahu apa lagi yang harus saya lakukan

Jawaban:


171

The scrapyperintah adalah script python yang berarti Anda dapat memulainya dari dalam PyCharm.

Saat Anda memeriksa scrapy binary ( which scrapy), Anda akan melihat bahwa ini sebenarnya adalah skrip python:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

Artinya perintah seperti scrapy crawl IcecatCrawlerini juga bisa dijalankan seperti ini:python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

Cobalah untuk mencari paket scrapy.cmdline. Dalam kasus saya, lokasinya ada di sini:/Library/Python/2.7/site-packages/scrapy/cmdline.py

Buat konfigurasi run / debug di dalam PyCharm dengan skrip itu sebagai skrip. Isi parameter skrip dengan perintah scrapy dan spider. Dalam kasus ini crawl IcecatCrawler.

Seperti ini: Konfigurasi PyCharm Run / Debug

Tempatkan breakpoint Anda di mana saja dalam kode perayapan Anda dan itu akan berfungsi ™.


(<type 'exception.SyntaxError'>, SyntaxError ("Karakter non-ASCII '\\ xf3' dalam file /Library/python/2.7/site-packages/scrapy/cmdline.pyc pada baris 1, tetapi tidak ada penyandian yang dideklarasikan;
Aymon Fournier

1
Solusi bagus! Saya juga mencoba menggunakan biner scrapy itu sendiri yang sebagian besar terletak di: / usr / bin / scrapy sebagai skrip dengan parameter yang sama atau perintah scrapy lainnya yang ingin Anda debug dan berfungsi dengan sempurna. pastikan direktori kerja mengarah ke root proyek scrapy Anda di mana scrapy.cfg berada.
Nour Wolf

3
@AymonFournier Sepertinya Anda mencoba menjalankan file .pyc. Jalankan file .py yang sesuai sebagai gantinya (scrapy / cmdline.py).
Artur Gaspar

4
Jika saya melakukan itu, modul pengaturan saya tidak ditemukan. ImportError: No module named settingsSaya telah memeriksa bahwa direktori kerja adalah direktori proyek. Ini digunakan dalam proyek Django. Adakah orang lain yang tersandung pada masalah ini?
suntoch

6
Jangan lupa untuk Working directoryno active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
mengonfigurasi

106

Anda hanya perlu melakukan ini.

Buat file Python pada folder crawler di proyek Anda. Saya menggunakan main.py.

  • Proyek
    • Crawler
      • Crawler
        • Laba-laba
        • ...
      • main.py
      • scrapy.cfg

Di dalam main.py Anda, letakkan kode ini di bawah.

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

Dan Anda perlu membuat "Run Configuration" untuk menjalankan main.py Anda.

Melakukan ini, jika Anda meletakkan breakpoint pada kode Anda, itu akan berhenti di situ.


1
Ini adalah solusi yang luar biasa.
aristotll

1
Cara ini lebih bermanfaat.
wyx

1
Yang ini menyelamatkan hidupku! Terima kasih!
zsljulius

5
Anda mungkin ingin mengkonfigurasi beberapa eksekusi untuk spiders yang berbeda, jadi terima nama spider sebagai argumen dari konfigurasi yang Anda jalankan. Kemudian impor sys spider = sys.argv [1] cmdline.execute ("scrapy crawl {}". Format (spider) .split ())
miguelfg

2
Jelas cara terbersih dan tercepat untuk melakukannya, juga cara terbaik untuk menyimpannya di CVS Anda.
José Tomás Tocino

23

Pada 2018.1 ini menjadi jauh lebih mudah. Sekarang Anda dapat memilih Module namedi proyek Anda Run/Debug Configuration. Setel ini ke scrapy.cmdlinedan Working directoryke direktori root dari proyek scrapy (yang dengansettings.py di dalamnya).

Seperti:

Konfigurasi debug PyCharm Scrapy

Sekarang Anda dapat menambahkan breakpoint untuk men-debug kode Anda.


8

Saya menjalankan scrapy di virtualenv dengan Python 3.5.0 dan mengatur parameter "script" untuk /path_to_project_env/env/bin/scrapymemecahkan masalah bagi saya.


Saya terkejut ini berhasil, saya pikir scrapy tidak berfungsi dengan python 3
user1592380

1
Terima kasih, ini berfungsi dengan Python 3.5 dan virtualenv. "script" sebagai @rioted berkata dan mengatur "direktori kerja" ke project/crawler/crawler, yaitu, direktori yang menampung __init__.py.
effel

5

Ide intellij juga berhasil.

create 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====================================================')

tunjukkan di bawah:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini


3

Untuk menambahkan sedikit ke jawaban yang diterima, setelah hampir satu jam saya menemukan bahwa saya harus memilih Konfigurasi Jalankan yang benar dari daftar tarik-turun (di dekat bagian tengah bilah alat ikon), lalu klik tombol Debug untuk membuatnya berfungsi. Semoga ini membantu!


2

Saya juga menggunakan PyCharm, tetapi saya tidak menggunakan fitur debugging bawaannya.

Untuk debugging yang saya gunakan ipdb. Saya menyiapkan pintasan keyboard untuk disisipkan import ipdb; ipdb.set_trace()pada baris mana pun yang saya inginkan agar titik putusnya terjadi.

Kemudian saya dapat mengetik nuntuk menjalankan pernyataan berikutnya, suntuk masuk ke dalam suatu fungsi, ketik nama objek apa pun untuk melihat nilainya, mengubah lingkungan eksekusi, ketik cuntuk melanjutkan eksekusi ...

Ini sangat fleksibel, bekerja di lingkungan selain PyCharm, di mana Anda tidak mengontrol lingkungan eksekusi.

Cukup ketikkan di lingkungan virtual Anda pip install ipdbdan tempatkan import ipdb; ipdb.set_trace()di baris tempat Anda ingin menjeda eksekusi.


2

Menurut dokumentasi 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

Saya menggunakan skrip sederhana ini:

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

Memperluas versi jawaban @ Rodrigo Saya menambahkan skrip ini dan sekarang saya dapat mengatur nama laba-laba dari konfigurasi alih-alih mengubah dalam string.

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.