python - 使用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 是什么,但不知道如何让它工作
解决方案
似乎您想按计划运行此 python 脚本并在完成后在 laravel 应用程序上获取更新。
在这种情况下,我不会从 laravel 运行 python 脚本,而是设置一个 cronjob/window 调度 python 脚本。
python脚本完成后,触发对laravel应用程序的API调用以更新必要的信息,这样你的应用程序就会解耦,不依赖其他应用程序的执行时间范围或库,只通过API接口进行通信。
推荐阅读
- logging - 限制 salt-minion 日志文件的大小
- amazon-web-services - 将 AWS 负载均衡器用于 HTTPS 和 SSH
- python - Sumo,TraCI:在不调用 SimulationStep() 的情况下移除车辆后无法添加车辆
- c# - 是否有将 .NET Framework 4.6 中的数据集传输到 .NET Core 的有效方法?
- linux - Linux 是否可以通过 MTP 自动连接到安卓手机?
- mysql - Keycloack - 通过外部用户存储 SPI 的密码重置更新凭据(无写访问权限!)
- java - 如何使用 spring-cloud-stream-binder-kafka-streams:3.1.1 中的功能方法检索/设置标头
- python - 为什么 Python Matplotlib savefig 在同一脚本中第二次调用时表现不同?
- swift - 为什么我的 .pushViewController 不能快速从 didSelectItemAt 工作
- python - 从具有不同摄像头 ID 的摄像头访问视频