2013-07-20 57 views
6

Scraper của tôi hoạt động tốt khi tôi chạy nó từ dòng lệnh, nhưng khi tôi cố gắng chạy nó từ bên trong một kịch bản python (với phương pháp được phác thảo here sử dụng Twisted) nó không xuất ra hai tệp CSV mà nó thường làm. Tôi có một đường dẫn tạo và điền các tệp này, một trong số chúng sử dụng CsvItemExporter() và một tệp khác sử dụng writeCsvFile(). Đây là mã:Chạy scrapy từ bên trong Python script - CSV xuất khẩu không hoạt động

class CsvExportPipeline(object): 

    def __init__(self): 
     self.files = {} 

    @classmethod 
    def from_crawler(cls, crawler): 
     pipeline = cls() 
     crawler.signals.connect(pipeline.spider_opened, signals.spider_opened) 
     crawler.signals.connect(pipeline.spider_closed, signals.spider_closed) 
     return pipeline 

    def spider_opened(self, spider): 
     nodes = open('%s_nodes.csv' % spider.name, 'w+b') 
     self.files[spider] = nodes 
     self.exporter1 = CsvItemExporter(nodes, fields_to_export=['url','name','screenshot']) 
     self.exporter1.start_exporting() 

     self.edges = [] 
     self.edges.append(['Source','Target','Type','ID','Label','Weight']) 
     self.num = 1 

    def spider_closed(self, spider): 
     self.exporter1.finish_exporting() 
     file = self.files.pop(spider) 
     file.close() 

     writeCsvFile(getcwd()+r'\edges.csv', self.edges) 

    def process_item(self, item, spider): 
     self.exporter1.export_item(item) 

     for url in item['links']: 
      self.edges.append([item['url'],url,'Directed',self.num,'',1]) 
      self.num += 1 
     return item 

Dưới đây là cấu trúc tập tin của tôi:

SiteCrawler/  # the CSVs are normally created in this folder 
    runspider.py # this is the script that runs the scraper 
    scrapy.cfg 
    SiteCrawler/ 
     __init__.py 
     items.py 
     pipelines.py 
     screenshooter.py 
     settings.py 
     spiders/ 
      __init__.py 
      myfuncs.py 
      sitecrawler_spider.py 

Các scraper dường như hoạt động bình thường trong tất cả các cách khác. Đầu ra ở cuối dòng lệnh cho thấy số trang dự kiến ​​được thu thập thông tin và con nhện dường như đã hoàn thành bình thường. Tôi không nhận được bất kỳ thông báo lỗi nào.

---- EDIT: ----

Chèn báo cáo in ấn và lỗi cú pháp vào đường ống không có tác dụng, vì vậy có vẻ như các đường ống dẫn đã được bỏ qua. Tại sao điều này có thể?

Đây là mã cho kịch bản chạy các scraper (runspider.py):

from twisted.internet import reactor 

from scrapy import log, signals 
from scrapy.crawler import Crawler 
from scrapy.settings import Settings 
from scrapy.xlib.pydispatch import dispatcher 
import logging 

from SiteCrawler.spiders.sitecrawler_spider import MySpider 

def stop_reactor(): 
    reactor.stop() 

dispatcher.connect(stop_reactor, signal=signals.spider_closed) 
spider = MySpider() 
crawler = Crawler(Settings()) 
crawler.configure() 
crawler.crawl(spider) 
crawler.start() 
log.start(loglevel=logging.DEBUG) 
log.msg('Running reactor...') 
reactor.run() # the script will block here until the spider is closed 
log.msg('Reactor stopped.') 
+1

Các tệp có thể được viết ở một nơi khác không? bạn có thể kiểm tra đường dẫn tệp đầu ra của mình hoặc sử dụng đường dẫn tệp tuyệt đối không? –

+0

@pault. Điểm tốt. Bây giờ tôi đã thử nó bằng cách sử dụng os.path.dirname (__ file__), getcwd() và đường dẫn tệp chính xác được nhập vào. Thật không may, chúng không tạo ra bất kỳ sự khác biệt nào. – jkdune

+0

Tôi đã thử thêm các câu lệnh in để hiển thị đầu ra getcwd() và os.path.dirname (tệp), nhưng chúng dường như không thực thi. Điều đó có nghĩa là đường ống đang bị bỏ qua? Hoặc đang chạy điều này bên trong lò phản ứng can thiệp vào tôi in? – jkdune

Trả lời

1

Thay thế "from scrapy.settings Import Settings" bằng "from scrapy.utils.project import get_project_settings dưới dạng Cài đặt" đã khắc phục sự cố.

Giải pháp đã được tìm thấy here. Không có giải thích về giải pháp đã được cung cấp.

alecxe đã cung cấp an example về cách chạy Scrapy từ bên trong tập lệnh Python.

EDIT:

Sau khi đọc qua bài alecxe của chi tiết hơn, bây giờ tôi có thể thấy sự khác biệt giữa "từ scrapy.settings nhập Settings" và "từ get_project_settings nhập khẩu scrapy.utils.project như Settings". Sau này cho phép bạn sử dụng tệp cài đặt của dự án của bạn, thay vì tệp cài đặt defualt. Đọc bài viết của alecxe (liên kết đến ở trên) để biết thêm chi tiết.

0

Trong dự án của tôi gọi mã scrapy bên trong một kịch bản python sử dụng os.system

import os 
os.chdir('/home/admin/source/scrapy_test') 
command = "scrapy crawl test_spider -s FEED_URI='file:///home/admin/scrapy/data.csv' -s LOG_FILE='/home/admin/scrapy/scrapy_test.log'" 
return_code = os.system(command) 
print 'done'