jsonデータをクローラから送信して結果を取得できます。それは以下のように行うことができます。
class MySpider(scrapy.Spider):
# some attributes
accomulated=[]
def parse(self, response):
# do your logic here
page_text = response.xpath('//text()').extract()
for text in page_text:
if conditionsAreOk(text):
self.accomulated.append(text)
def closed(self, reason):
# call when the crawler process ends
print JSON.dumps(self.accomulated)
は次のようにrunner.pyスクリプトを書く:
import sys
from twisted.internet import reactor
import scrapy
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from scrapy.utils.project import get_project_settings
from spiders import MySpider
def main(argv):
url = argv[0]
configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s', 'LOG_ENABLED':False })
runner = CrawlerRunner(get_project_settings())
d = runner.crawl(MySpider, url=url)
# For Multiple in the same process
#
# runner.crawl('craw')
# runner.crawl('craw2')
# d = runner.join()
d.addBoth(lambda _: reactor.stop())
reactor.run() # the script will block here until the crawling is finished
if __name__ == "__main__":
main(sys.argv[1:])
そして、あなたのmain.pyからそれを呼び出す:
はクモを持ちます
import json, subprocess, sys, time
def main(argv):
# urlArray has http:// or https:// like urls
for url in urlArray:
p = subprocess.Popen(['python', 'runner.py', url ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
# do something with your data
print out
print json.loads(out)
# This just helps to watch logs
time.sleep(0.5)
if __name__ == "__main__":
main(sys.argv[1:])
これはあなたが知っているようにScrapyを使用する最善の方法ではありませんが、複雑な後処理を必要としない迅速な結果のために、このソリューションは必要なものを提供します。
私はそれが役に立ちそうです。
重大なハッキングがなければ、main.pyを非同期にする必要はありません。なぜ、 'scrap crawl myspider -o items.json'をクロールして、そのファイルを' main.py'で繰り返すのですか?理想的には、main.pyロジック全体をスパイダー自体に移動するだけですか? – Granitosaurus