Cách sử dụng PyCharm để gỡ lỗi các dự án Scrapy


97

Tôi đang làm việc trên Scrapy 0.20 với Python 2.7. Tôi thấy PyCharm có trình gỡ lỗi Python tốt. Tôi muốn kiểm tra các con nhện Scrapy của mình bằng cách sử dụng nó. Bất cứ ai biết làm thế nào để làm điều đó xin vui lòng?

Những gì tôi đã thử

Trên thực tế, tôi đã cố gắng chạy con nhện như một kịch bản. Kết quả là tôi đã xây dựng kịch bản đó. Sau đó, tôi đã cố gắng thêm dự án Scrapy của mình vào PyCharm như một mô hình như sau:
File->Setting->Project structure->Add content root.

Nhưng tôi không biết mình phải làm gì khác

Câu trả lời:


170

Các scrapylệnh là một kịch bản python có nghĩa là bạn có thể bắt đầu nó từ PyCharm bên trong.

Khi bạn kiểm tra mã nhị phân trị liệu ( which scrapy), bạn sẽ nhận thấy rằng đây thực sự là một tập lệnh python:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

Điều này có nghĩa là một lệnh như scrapy crawl IcecatCrawlercũng có thể được thực thi như thế này:python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

Cố gắng tìm gói scrapy.cmdline. Trong trường hợp của tôi, vị trí ở đây:/Library/Python/2.7/site-packages/scrapy/cmdline.py

Tạo cấu hình chạy / gỡ lỗi bên trong PyCharm với tập lệnh đó dưới dạng tập lệnh. Điền vào các tham số script bằng lệnh scrapy và spider. Trong trường hợp này crawl IcecatCrawler.

Như thế này: Cấu hình chạy / gỡ lỗi PyCharm

Đặt các điểm ngắt của bạn ở bất kỳ đâu trong mã thu thập thông tin của bạn và nó sẽ hoạt động ™.


(<type 'exceptions.SyntaxError'>, SyntaxError ("Ký tự không phải ASCII '\\ xf3' trong tệp /Library/python/2.7/site-packages/scrapy/cmdline.pyc trên dòng 1, nhưng không có mã hóa nào được khai báo;
Aymon Fournier

1
Giải pháp tuyệt vời! Tôi cũng đã thử sử dụng bản thân mã nhị phân scrapy chủ yếu nằm trong: / usr / bin / scrapy làm tập lệnh có cùng tham số hoặc bất kỳ lệnh scrapy nào khác mà bạn muốn gỡ lỗi và nó hoạt động rất hoàn hảo. đảm bảo rằng thư mục làm việc đang trỏ đến thư mục gốc của dự án liệu pháp của bạn, nơi đặt scrapy.cfg.
Nour Wolf,

3
@AymonFournier Có vẻ như bạn đang cố chạy tệp .pyc. Thay vào đó, hãy chạy tệp .py tương ứng (scrapy / cmdline.py).
Artur Gaspar

4
Nếu tôi đang làm điều đó, mô-đun cài đặt của tôi không được tìm thấy. ImportError: No module named settingsTôi đã kiểm tra rằng thư mục làm việc là thư mục dự án. Nó được sử dụng trong một dự án Django. Có ai khác gặp phải vấn đề này không?
suntoch

6
Đừng quên cấu hình Working directory, nếu không sẽ xảy ra lỗino active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan

104

Bạn chỉ cần làm điều này.

Tạo tệp Python trên thư mục trình thu thập thông tin trong dự án của bạn. Tôi đã sử dụng main.py.

  • Dự án
    • Crawler
      • Crawler
        • Nhện
        • ...
      • main.py
      • scrapy.cfg

Bên trong main.py đặt mã này bên dưới.

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

Và bạn cần tạo một "Cấu hình Chạy" để chạy main.py.

Làm điều này, nếu bạn đặt một điểm ngắt ở mã của mình, nó sẽ dừng lại ở đó.


1
Đây là một giải pháp tuyệt vời.
Aristotll

1
Phương pháp này hữu ích hơn.
wyx

1
Cái này cứu mạng tôi! Cảm ơn!
zsljulius

5
Bạn có thể muốn định cấu hình nhiều lần thực thi cho các trình thu thập thông tin khác nhau, vì vậy hãy chấp nhận tên trình thu thập dữ liệu làm đối số của cấu hình chạy của bạn. Sau đó, nhập khẩu sys nhện = sys.argv [1] cmdline.execute ( "scrapy bò {}" định dạng (nhện) .split ().)
miguelfg

2
Chắc chắn là cách làm sạch sẽ và nhanh nhất, cũng là cách tốt nhất để lưu trữ nó trong CVS của bạn.
José Tomás Tocino

23

Kể từ năm 2018.1, điều này đã trở nên dễ dàng hơn rất nhiều. Bây giờ bạn có thể chọn Module nametrong dự án của mình Run/Debug Configuration. Đặt điều này thành scrapy.cmdlinevà thành Working directorythư mục gốc của dự án liệu pháp (dự án có settings.pytrong đó).

Như vậy:

Cấu hình gỡ lỗi PyCharm Scrapy

Bây giờ bạn có thể thêm các điểm ngắt để gỡ lỗi mã của mình.


8

Tôi đang chạy scrapy trong virtualenv với Python 3.5.0 và đặt tham số "script" để /path_to_project_env/env/bin/scrapygiải quyết vấn đề cho tôi.


Tôi ngạc nhiên vì điều này hoạt động, tôi nghĩ liệu pháp không hoạt động với python 3
dùng1592380

1
Cảm ơn, điều này đã hoạt động với Python 3.5 và virtualenv. "script" như @rioted đã nói và đặt "thư mục làm việc" thành project/crawler/crawler, tức là thư mục đang giữ __init__.py.
effel

5

ý tưởng intellij cũng hoạt động.

tạo 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====================================================')

hiển thị bên dưới:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


3

Để thêm một chút vào câu trả lời được chấp nhận, sau gần một giờ, tôi thấy mình phải chọn Cấu hình Chạy chính xác từ danh sách thả xuống (gần giữa thanh công cụ biểu tượng), sau đó nhấp vào nút Gỡ lỗi để nó hoạt động. Hi vọng điêu nay co ich!


2

Tôi cũng đang sử dụng PyCharm, nhưng tôi không sử dụng các tính năng gỡ lỗi tích hợp của nó.

Để gỡ lỗi tôi đang sử dụng ipdb. Tôi thiết lập một phím tắt để chèn import ipdb; ipdb.set_trace()vào bất kỳ dòng nào tôi muốn điểm ngắt xảy ra.

Sau đó, tôi có thể gõ nđể thực hiện câu lệnh tiếp theo, sđể bước vào một hàm, nhập bất kỳ tên đối tượng nào để xem giá trị của nó, thay đổi môi trường thực thi, nhập cđể tiếp tục thực thi ...

Điều này rất linh hoạt, hoạt động trong các môi trường khác ngoài PyCharm, nơi bạn không kiểm soát môi trường thực thi.

Chỉ cần nhập vào môi trường ảo của bạn pip install ipdbvà đặt import ipdb; ipdb.set_trace()trên một dòng mà bạn muốn tạm dừng việc thực thi.


2

Theo tài liệu 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

Tôi sử dụng tập lệnh đơn giản này:

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

Mở rộng phiên bản câu trả lời của @ Rodrigo Tôi đã thêm tập lệnh này và bây giờ tôi có thể đặt tên nhện từ cấu hình thay vì thay đổi trong chuỗi.

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.