如何通过PHP后台运行Python网络爬虫并解决数据显示异常问题
嘿,看了你的问题和代码,发现两个关键问题让你看不到数据,咱们一步步来解决:
第一:先把PHP展示的字段名改对!
你Python爬虫往数据库插的是title(歌曲名)和artist(歌手),但PHP展示代码里写的是itemName和itemCost——这俩完全不搭啊!难怪数据库有数据页面也显示不出来,先把这个改了:
原展示代码:
<?php $no = 1; $total = 0; while ($row = mysqli_fetch_array($query)) { echo '<tr> <td>'.$no.'</td> <td>'.$row['itemName'].'</td> <td>'.$row['itemCost'].'</td> </tr>'; $no++; }?>
修改后:
<?php $no = 1; while ($row = mysqli_fetch_array($query)) { echo '<tr> <td>'.$no.'</td> <td>'.$row['title'].'</td> <td>'.$row['artist'].'</td> </tr>'; $no++; } ?>
第二:解决PHP调用Python脚本失败的问题
你说终端跑Python后页面能显示,说明爬虫本身没问题,但PHP调用时没执行成功,大概率是这几个原因:
1. Python路径不对
PHP运行的环境和你终端的环境不一样,可能找不到python命令。先在终端输which python3(或者which python)拿到绝对路径,比如/usr/bin/python3,然后把PHP里的exec改成这样:
// 把路径换成你自己的 exec("/usr/bin/python3 /full/path/to/your/3h.py 2>&1", $output, $return_var); // 加上这行能看到执行时的错误信息 print_r($output); echo "返回码:".$return_var;
2>&1是把错误输出转到标准输出,方便你排查脚本为啥跑不起来。
2. 权限不够
PHP一般是用www-data或者apache用户运行的,可能没权限读你的3h.py文件,给文件加权限:
chmod 755 /full/path/to/your/3h.py
另外,确保这个用户能访问数据库(不过你终端能跑,数据库权限应该没问题,但可以检查下)。
3. Python依赖缺失
你终端里的Python有bs4和pymysql,但PHP调用的Python环境可能没有。可以在Python脚本开头加一行import sys; print(sys.path),然后看PHP输出的$output里的路径,对比终端跑python3 -c "import sys; print(sys.path)"的结果,要是缺依赖,就用绝对路径装:
/usr/bin/python3 -m pip install beautifulsoup4 pymysql
4. PHP的exec被禁用了
检查你的php.ini文件,找disable_functions,看看有没有exec,有的话注释掉(注意服务器安全,别随便开)。
第三:优化你的PHP调用逻辑
原代码页面一加载就跑爬虫,容易卡顿还没反馈,改成用表单触发更合理:
<!DOCTYPE HTML> <html> <body> <?php if(isset($_POST['run_script'])){ $python_path = "/usr/bin/python3"; // 换成你的Python绝对路径 $script_path = __DIR__ . "/3h.py"; // 自动获取当前目录下的脚本路径 exec("$python_path $script_path 2>&1", $output, $return_var); if($return_var == 0){ echo "<p>爬虫执行成功!</p>"; }else{ echo "<p>爬虫执行失败,错误信息:</p>"; echo "<pre>".implode("\n", $output)."</pre>"; } } ?> <form method="post"> <input type="submit" name="run_script" value="启动爬虫"> </form> <a href="display.php">查看数据表格</a> </body> </html>
第四:给Python脚本补补小漏洞
- 你的Python代码用的是Python2的
from urllib import urlopen,如果系统默认是Python3,会报错,改成from urllib.request import urlopen - 数据库名带空格
crawler database,有些MySQL版本会有问题,建议改成crawler_database,或者在连接时用反引号包起来:db='crawler database'
按这些步骤来,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者a.l

