如何解决为列表中的每个 url 重新启动scrapy
我正在尝试运行一个scrapy bot,它将为列表中给定的每个url重复运行蜘蛛。我写到现在的代码如下
var pfa = doc.Element("PFA");
IList<XElement> entities = pfa.Elements("Entity").ToList();
foreach (var entity in entities)
{
entity.Remove(); // Remove all the <Entity> tags from <PFA>
}
var record = new XElement("Record");
pfa.Add(record); // Add the new <Record>
foreach (var entity in entities)
{
record.Add(entity); // Add the <Entity> tags back to <Record>
}
蜘蛛本身在第一个 url 上运行良好,但是一旦循环命中它就会给出错误 def run_spider(url_list,allowed_list):
runner = CrawlerRunner(get_project_settings())
d = runner.crawl('scraper',start_urls=url_list,allowed_domains=allowed_list)
d.addBoth(lambda _: reactor.stop())
reactor.run()
for start,allowed in zip(start_url,allowedUrl):
url_list = []
allowed_list = []
url_list.append(start)
allowed_list.append(allowed)
print(type(url_list),type(allowed_list))
run_spider(url_list,allowed_list)
,完整的回溯在这里:
twisted.internet.error.ReactorNotRestartable
我正在遵循文档中描述的方法,但如何为循环中的每个项目重新启动蜘蛛。任何建议都会非常有帮助。
P:S:: 当简单地传递允许的域和起始 url 时,蜘蛛机器人本身就可以正常工作
解决方法
要使您的代码正常工作,您必须重新排列 reactor.run()
和 reactor.stop()
逻辑。以下是解决问题的方法示例:
from scrapy.crawler import CrawlerRunner
from twisted.internet.defer import gatherResults
from twisted.internet import reactor
def run_spider(url_list,allowed_list):
"""
:returns: Deferred
"""
runner = CrawlerRunner(get_project_settings())
return runner.crawl('scraper',start_urls=url_list,allowed_domains=allowed_list)
d_list = []
for start,allowed in zip(start_url,allowedUrl):
# ... your logic ...
# Append the deferred into a list.
d_list.append(run_spider(url_list,allowed_list))
# "Join"
results = gatherResults(d_list)
# Stop the reactor after all the sites are scraped or a failure occurs
results.addBoth(lambda _: reactor.stop())
reactor.run()
run_spider()
返回 Deferred
。在循环中,将 Deferred
附加到列表中并“加入”所有列表或在发生故障时停止处理(读取 gatherResults
)。一旦所有站点都被刮掉,反应堆就会停止。
在网络上搜索 ReactorNotRestartable
,因为这已经解释过很多次了。
我也是scrapy的新手。但是我会在不重启爬虫的情况下编写这个爬虫(这是有问题的,因为它需要重启反应器)。像这样:
class MySpider(scrapy.Spider):
name = 'spidery'
allowed_domains = ['allowed_list']
start_urls = url_list
def parse(self,response):
#here is what you want to scrape
crawler = CrawlerProcess()
crawler.crawl(MySpider)
crawler.start()
我希望应该这样做!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。