首页 > 解决方案 > 使用laravel执行python脚本

问题描述

我正在使用 Laravel 控制台命令来执行 python 脚本。

这就是我在 Laravel 控制台命令文件中的内容:

use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

public function handle()
{
   $process = new Process(['python', 'App/Console/Python/Main.py']);

    $process->run();

    // executes after the command finishes
    if (!$process->isSuccessful()) {
        throw new ProcessFailedException($process);
    }

    $this->line($process->getOutput());
}

这就是我在 Main.py 中的内容:

import YellScraper

scraper = YellScraper.Scraper()
scraper.setKeyword('Restaurant')
scraper.setLocation('Burnley')
scraper.start()
print('Done... Exiting')

这就是我在 YellScraper.py 中的内容:

import urllib
import time
import sys
from bs4 import BeautifulSoup

class Scraper:
        pages = []
        keyword = ""
        location = ""
        results = []

        def setKeyword(self,keywordInput):
                self.keyword = keywordInput

        def setLocation(self,locationInput):
                self.location = locationInput

        def createPages(self):
                if self.keyword != "" and self.location != "":
                        for i in range(1,10):
                                page = 'http://www.yell.com/ucs/UcsSearchAction.do?keywords='+self.keyword+'&location='+self.location+'&pageNum=%s' % i
                                self.pages.append(page)
                else:
                        print ("Location or Keyword not set\nUse setKeyword or setLocation functions before continuing")
                        sys.exit(0)

        def start(self):
                self.createPages()
                if self.pages:
                        for page in self.pages:
                                f = urllib.urlopen(page)
                                f = f.read()
                                soup = BeautifulSoup(f)
                                listings = soup.find_all("div", class_="parentListing")
                                if len(listings) > 0:
                                    for listing in listings:
                                        company = {}

                                        #name
                                        company['name'] = listing.find('a', itemprop="name").get_text(strip=True)

                                        #number
                                        company['number'] = listing.select('.l-telephone ul li strong')[0].string

                                        #address
                                        company['address'] = listing.find('span', itemprop="streetAddress").get_text(strip=True) + ' ' + listing.find('span', itemprop="addressLocality").get_text(strip=True) + ', ' + listing.find('span', itemprop="postalCode").get_text(strip=True)

                                        #add company
                                        self.results.append(company)

                                #keep yell.com happy
                                time.sleep(15)
                        return self.results

每当我执行此操作时,我都会收到一条错误消息,指出最大执行时间为 60 秒。我相信 Main.py 不知道 YellScraper 是什么,但不知道如何让它工作

标签: pythonlaravel

解决方案


似乎您想按计划运行此 python 脚本并在完成后在 laravel 应用程序上获取更新。

在这种情况下,我不会从 laravel 运行 python 脚本,而是设置一个 cronjob/window 调度 python 脚本。

python脚本完成后,触发对laravel应用程序的API调用以更新必要的信息,这样你的应用程序就会解耦,不依赖其他应用程序的执行时间范围或库,只通过API接口进行通信。


推荐阅读