[英]Run scrapy spider from script
我想从 python 脚本运行我的 scrapy 蜘蛛。 我可以使用以下代码调用我的蜘蛛,
subprocess.check_output(['scrapy crawl mySpider'])
直到一切都好。 但在此之前,我通过初始化 start_urls 来实例化我的蜘蛛的 class,然后调用 scrapy crawl 不起作用,因为它没有找到变量 start_urls。
from flask import Flask, jsonify, request
import scrapy
import subprocess
class ClassSpider(scrapy.Spider):
name = 'mySpider'
#start_urls = []
#pages = 0
news = []
def __init__(self, url, nbrPage):
self.pages = nbrPage
self.start_urls = url
def parse(self):
...
def run(self):
subprocess.check_output(['scrapy crawl mySpider'])
return self.news
app = Flask(__name__)
data = []
@app.route('/', methods=['POST'])
def getNews():
mySpiderClass = ClassSpider(request.json['url'], 2)
data.append(mySpider.run())
return jsonify({'data': data})
if __name__ == "__main__":
app.run(debug=True)
我得到的错误是: TypeError: init missing 1 required positional argument: 'start_url' and 'pages'
请问有什么帮助吗?
从脚本启动蜘蛛的另一种方法(并提供参数):
from scrapy.crawler import CrawlerProcess
from path.to.your.spider import ClassSpider
from scrapy.utils.project import get_project_settings
process = CrawlerProcess(get_project_settings())
process.crawl(
ClassSpider,
start_urls, # you need to define it somewhere
number_of_pages, # you need to define it somewhere
)
process.start()
您收到此错误消息的原因是您使用命令scrapy crawl mySpider
启动了爬取过程,该命令创建了一个新的ClassSpider
实例。 它这样做没有通过url
和nbrPage
。
如果您将subprocess.check_output(['scrapy crawl mySpider'])
替换subprocess.check_output([f'scrapy crawl mySpider -a url={self.start_urls} nbrPage={self.pages}'])
,它可能会起作用。 此外,您应该确保 start_urls 是一个列表。
但是,您仍然会创建同一个蜘蛛的两个单独实例,因此我建议您应该将run
作为 function 以 url 和 nbrPage 作为 arguments 实现。
还有其他在同一脚本中使用 Scrapy 和 Flask 的方法。 为此,请检查此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.