Scrapy-按时间间隔运行

时间:2018-07-31 10:07:25

标签: python-3.x scrapy twisted pickle

我有一个蜘蛛来抓取网站,我想每10分钟运行一次。将其放入python计划并运行。第一次运行后,我得到了

  

ReactorNotRestartable

我尝试this sulotion并得到

  

AttributeError:无法腌制本地对象'run_spider..f'

错误。

编辑: 尝试运行how-to-schedule-scrapy-crawl-execution-programmatically的python程序而不会出现错误,并且抓取功能每30秒运行一次,但Spider无法运行,并且我也无法获取数据。

string userName = "$xxxxxxxxx";
string userPassword = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
string webAppName = "xxxxxxxxxxxxx";
var base64Auth = Convert.ToBase64String(Encoding.Default.GetBytes($"{userName}:{userPassword}"));
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("Authorization", "Basic " + base64Auth);
    var baseUrl = new Uri($"https://{webAppName}.scm.azurewebsites.net/");
    var requestURl = baseUrl + "/api/triggeredwebjobs/{your_job_name}/settings";
    string body = "{\"schedule\": \"0 */2 * * * *\"}";
    var stringContent = new StringContent(body, Encoding.UTF8, "application/json");
    var response = client.PutAsync(requestURl, stringContent).Result;
}

2 个答案:

答案 0 :(得分:0)

我知道最简单的方法是使用一个单独的脚本来调用包含扭曲反应堆的脚本,如下所示:

cmd = ['python3', 'auto_crawl.py']
subprocess.Popen(cmd).wait()

要每10分钟运行CrawlerRunner,可以在此脚本上使用循环或crontab。

答案 1 :(得分:0)

多处理解决方案很难解决Scrapy和反应堆管理的工作原理,无法解决。您可以摆脱它,一切都变得简单得多。

from twisted.internet.task import LoopingCall
from twisted.internet import reactor

from scrapy.crawler import CrawlRunner
from scrapy.utils.log import configure_logging

from yourlib import YourSpider

configure_logging()
runner = CrawlRunner()
task = LoopingCall(lambda: runner.crawl(YourSpider()))
task.start(60 * 10)
reactor.run()